1212
1313#include < cassert>
1414
15- #include " Utilities.h"
1615#include " benchmark/benchmark.h"
16+ #include " Utilities.h"
17+ #include " test_iterators.h"
1718
1819namespace ContainerBenchmarks {
1920
@@ -48,55 +49,16 @@ void BM_Assignment(benchmark::State& st, Container) {
4849 }
4950}
5051
51- // Wrap any Iterator into an input iterator
52- template <typename Iterator>
53- class InputIterator {
54- using iter_traits = std::iterator_traits<Iterator>;
55-
56- public:
57- using iterator_category = std::input_iterator_tag;
58- using value_type = typename iter_traits::value_type;
59- using difference_type = typename iter_traits::difference_type;
60- using pointer = typename iter_traits::pointer;
61- using reference = typename iter_traits::reference;
62-
63- InputIterator (Iterator it) : current_(it) {}
64-
65- reference operator *() { return *current_; }
66- InputIterator& operator ++() {
67- ++current_;
68- return *this ;
69- }
70- InputIterator operator ++(int ) {
71- InputIterator tmp = *this ;
72- ++(*this );
73- return tmp;
74- }
75-
76- friend bool operator ==(const InputIterator& lhs, const InputIterator& rhs) { return lhs.current_ == rhs.current_ ; }
77- friend bool operator !=(const InputIterator& lhs, const InputIterator& rhs) { return !(lhs == rhs); }
78-
79- private:
80- Iterator current_;
81- };
82-
83- template <typename Iterator>
84- InputIterator<Iterator> make_input_iterator (Iterator it) {
85- return InputIterator<Iterator>(it);
86- }
87-
8852template <class Container ,
8953 class GenInputs ,
9054 typename std::enable_if<std::is_trivial<typename Container::value_type>::value>::type* = nullptr >
9155void BM_AssignInputIterIter (benchmark::State& st, Container c, GenInputs gen) {
9256 auto in = gen (st.range (1 ));
57+ c.resize (st.range (0 ));
9358 benchmark::DoNotOptimize (&in);
59+ benchmark::DoNotOptimize (&c);
9460 for (auto _ : st) {
95- st.PauseTiming ();
96- c.resize (st.range (0 ));
97- benchmark::DoNotOptimize (&c);
98- st.ResumeTiming ();
99- c.assign (make_input_iterator (in.begin ()), make_input_iterator (in.end ()));
61+ c.assign (cpp17_input_iterator (in.begin ()), cpp17_input_iterator (in.end ()));
10062 benchmark::ClobberMemory ();
10163 }
10264}
@@ -106,14 +68,12 @@ template <class Container,
10668 typename std::enable_if<!std::is_trivial<typename Container::value_type>::value>::type* = nullptr >
10769void BM_AssignInputIterIter (benchmark::State& st, Container c, GenInputs gen) {
10870 auto v = gen (1 , 100 );
71+ c.resize (st.range (0 ), v[0 ]);
10972 auto in = gen (st.range (1 ), 32 );
11073 benchmark::DoNotOptimize (&in);
74+ benchmark::DoNotOptimize (&c);
11175 for (auto _ : st) {
112- st.PauseTiming ();
113- c.resize (st.range (0 ), v[0 ]);
114- benchmark::DoNotOptimize (&c);
115- st.ResumeTiming ();
116- c.assign (make_input_iterator (in.begin ()), make_input_iterator (in.end ()));
76+ c.assign (cpp17_input_iterator (in.begin ()), cpp17_input_iterator (in.end ()));
11777 benchmark::ClobberMemory ();
11878 }
11979}
0 commit comments