|  | #ifndef BENCHMARK_CONTAINER_BENCHMARKS_HPP | 
|  | #define BENCHMARK_CONTAINER_BENCHMARKS_HPP | 
|  |  | 
|  | #include <cassert> | 
|  |  | 
|  | #include "benchmark/benchmark.h" | 
|  |  | 
|  | namespace ContainerBenchmarks { | 
|  |  | 
|  |  | 
|  | template <class Container, class GenInputs> | 
|  | void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) { | 
|  | auto in = gen(st.range(0)); | 
|  | const auto begin = in.begin(); | 
|  | const auto end = in.end(); | 
|  | benchmark::DoNotOptimize(&in); | 
|  | while (st.KeepRunning()) { | 
|  | Container c(begin, end); | 
|  | benchmark::DoNotOptimize(c.data()); | 
|  | } | 
|  | } | 
|  |  | 
|  | template <class Container, class GenInputs> | 
|  | void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) { | 
|  | auto in = gen(st.range(0)); | 
|  | const auto end = in.end(); | 
|  | while (st.KeepRunning()) { | 
|  | c.clear(); | 
|  | for (auto it = in.begin(); it != end; ++it) { | 
|  | benchmark::DoNotOptimize(&(*c.insert(*it).first)); | 
|  | } | 
|  | benchmark::ClobberMemory(); | 
|  | } | 
|  | } | 
|  |  | 
|  | template <class Container, class GenInputs> | 
|  | void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) { | 
|  | auto in = gen(st.range(0)); | 
|  | const auto end = in.end(); | 
|  | while (st.KeepRunning()) { | 
|  | c.clear(); | 
|  | c.rehash(16); | 
|  | for (auto it = in.begin(); it != end; ++it) { | 
|  | benchmark::DoNotOptimize(&(*c.insert(*it).first)); | 
|  | } | 
|  | benchmark::ClobberMemory(); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | template <class Container, class GenInputs> | 
|  | void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) { | 
|  | auto in = gen(st.range(0)); | 
|  | const auto end = in.end(); | 
|  | c.insert(in.begin(), in.end()); | 
|  | benchmark::DoNotOptimize(&c); | 
|  | benchmark::DoNotOptimize(&in); | 
|  | while (st.KeepRunning()) { | 
|  | for (auto it = in.begin(); it != end; ++it) { | 
|  | benchmark::DoNotOptimize(&(*c.insert(*it).first)); | 
|  | } | 
|  | benchmark::ClobberMemory(); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | template <class Container, class GenInputs> | 
|  | void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) { | 
|  | auto in = gen(st.range(0)); | 
|  | const auto end = in.end(); | 
|  | c.insert(in.begin(), in.end()); | 
|  | benchmark::DoNotOptimize(&c); | 
|  | benchmark::DoNotOptimize(&in); | 
|  | while (st.KeepRunning()) { | 
|  | for (auto it = in.begin(); it != end; ++it) { | 
|  | benchmark::DoNotOptimize(&(*c.emplace(*it).first)); | 
|  | } | 
|  | benchmark::ClobberMemory(); | 
|  | } | 
|  | } | 
|  |  | 
|  | template <class Container, class GenInputs> | 
|  | static void BM_Find(benchmark::State& st, Container c, GenInputs gen) { | 
|  | auto in = gen(st.range(0)); | 
|  | c.insert(in.begin(), in.end()); | 
|  | benchmark::DoNotOptimize(&(*c.begin())); | 
|  | const auto end = in.data() + in.size(); | 
|  | while (st.KeepRunning()) { | 
|  | for (auto it = in.data(); it != end; ++it) { | 
|  | benchmark::DoNotOptimize(&(*c.find(*it))); | 
|  | } | 
|  | benchmark::ClobberMemory(); | 
|  | } | 
|  | } | 
|  |  | 
|  | template <class Container, class GenInputs> | 
|  | static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) { | 
|  | c.rehash(8); | 
|  | auto in = gen(st.range(0)); | 
|  | c.insert(in.begin(), in.end()); | 
|  | benchmark::DoNotOptimize(&(*c.begin())); | 
|  | const auto end = in.data() + in.size(); | 
|  | while (st.KeepRunning()) { | 
|  | for (auto it = in.data(); it != end; ++it) { | 
|  | benchmark::DoNotOptimize(&(*c.find(*it))); | 
|  | } | 
|  | benchmark::ClobberMemory(); | 
|  | } | 
|  | } | 
|  |  | 
|  | } // end namespace ContainerBenchmarks | 
|  |  | 
|  | #endif // BENCHMARK_CONTAINER_BENCHMARKS_HPP |