「3, 4, 5」という範囲の整数があるとします。カレントロケーションを 5、インクリメントを +1 としたとき、3 を返してほしいです。もし、インクリメントが +2 なら 4+7 であれば 3 のように、3, 4, 5, 3, 4, 5, 3... とインクリメントの結果が循環してほしいです。

やってみたこと :

+1、-1 のインクリメント/デクリメントの場合は下記のコードで実装できましたが、+2 や -4 など加減数が 1 を超える場合に対応させようとすると、方法がわからなくなります(下記の関数を加減数ぶんfor文で繰り返し実行することはできますが……)。

実装

NSUInteger NSRangeIncrementLocationInRange(NSUInteger location, NSRange range) {

  NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange: range];

  if (![indexSet containsIndex: location]) {
    return NSNotFound;
  }

  NSUInteger index = [indexSet indexGreaterThanIndex: location];

  return index != NSNotFound ? index : [indexSet firstIndex];
}

NSUInteger NSRangeDecrementLocationInRange(NSUInteger location, NSRange range) {

  NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange: range];

  if (![indexSet containsIndex: location]) {
    return NSNotFound;
  }

  NSUInteger index = [indexSet indexLessThanIndex: location];

  return index != NSNotFound ? index : [indexSet lastIndex];
}

実行例

// 4 〜 8の範囲内で8をインクリメントする
NSLog(@"%zd", NSRangeIncrementLocationInRange(8, NSMakeRange(4, 5))); // 8の次は最小値に戻って4が返る

求めているもの :

理想的なのは下記のような関数で、

NSUInteger NSRangeIncrementLocationInRange(NSUInteger location, NSInteger increment, NSRange range);

increment3 だの -8 だの正負どちらでも渡せるようにしたいです。

質問 :

このようなメソッド、または関数は、Objective-C、またはCのフレームワークやライブラリに存在しますか? もしない場合、実装するためにどのようなコードが考えられますか?