#include <benchmark/benchmark.h>
#include <vector>
#include <random>

using namespace std;

static void memoryAccess (benchmark::State &state) {
    mt19937 rng(21);
    int n = state.range(0);

    vector<int> data(n);
    uniform_int_distribution<int> dist(0, n - 1);
    for (int &u : data) u = dist(rng);

    int index = dist(rng);
    for (auto _ : state) {
        data[index] = (data[index] == n - 1 ? 0 : data[index] + 1);
        benchmark::DoNotOptimize(data[index]);
        index = data[index];
    }

    state.SetBytesProcessed(state.iterations() * sizeof(int));
}
BENCHMARK(memoryAccess)->RangeMultiplier(2)->Range(1 << 2, 1 << 22);

BENCHMARK_MAIN();