- for (int rank = ranges[i][0]; /* First */
- rank >= 0 && rank < size_; /* Last */
- ) {
- newsize--;
- if(rank == ranges[i][1]){/*already last ?*/
- break;
- }
- rank += ranges[i][2]; /* Stride */
- if (not is_rank_in_range(rank, ranges[i][0], ranges[i][1]))
- break;
- }
- }
- if (newsize == 0) {
- *newgroup = MPI_GROUP_EMPTY;
- } else {
- *newgroup = new Group(newsize);
- int newrank = 0;
- int oldrank = 0;
- while (newrank < newsize) {
- int add = 1;
- for (int i = 0; i < n; i++) {
- for (int rank = ranges[i][0]; rank >= 0 && rank < size_;) {
- if(rank==oldrank){
- add = 0;
- break;
- }
- if(rank == ranges[i][1]){/*already last ?*/
- break;
- }
- rank += ranges[i][2]; /* Stride */
- if (not is_rank_in_range(rank, ranges[i][0], ranges[i][1]))
- break;
- }
- }
- if(add==1){
- s4u::Actor* actor = this->actor(oldrank);
- (*newgroup)->set_mapping(actor, newrank);
- newrank++;
- }
- oldrank++;
- }
+ for (int j = ranges[i][0]; j >= 0 && j < size() && is_rank_in_range(j, ranges[i][0], ranges[i][1]);
+ j += ranges[i][2])
+ to_excl[j] = true;