1414#include < iterator>
1515#include < utility>
1616
17- #include " Utilities.h"
1817#include " benchmark/benchmark.h"
18+ #include " Utilities.h"
19+ #include " test_iterators.h"
1920
2021namespace ContainerBenchmarks {
2122
@@ -50,55 +51,16 @@ void BM_Assignment(benchmark::State& st, Container) {
5051 }
5152}
5253
53- // Wrap any Iterator into an input iterator
54- template <typename Iterator>
55- class InputIterator {
56- using iter_traits = std::iterator_traits<Iterator>;
57-
58- public:
59- using iterator_category = std::input_iterator_tag;
60- using value_type = typename iter_traits::value_type;
61- using difference_type = typename iter_traits::difference_type;
62- using pointer = typename iter_traits::pointer;
63- using reference = typename iter_traits::reference;
64-
65- InputIterator (Iterator it) : current_(it) {}
66-
67- reference operator *() { return *current_; }
68- InputIterator& operator ++() {
69- ++current_;
70- return *this ;
71- }
72- InputIterator operator ++(int ) {
73- InputIterator tmp = *this ;
74- ++(*this );
75- return tmp;
76- }
77-
78- friend bool operator ==(const InputIterator& lhs, const InputIterator& rhs) { return lhs.current_ == rhs.current_ ; }
79- friend bool operator !=(const InputIterator& lhs, const InputIterator& rhs) { return !(lhs == rhs); }
80-
81- private:
82- Iterator current_;
83- };
84-
85- template <typename Iterator>
86- InputIterator<Iterator> make_input_iterator (Iterator it) {
87- return InputIterator<Iterator>(it);
88- }
89-
9054template <class Container ,
9155 class GenInputs ,
9256 typename std::enable_if<std::is_trivial<typename Container::value_type>::value>::type* = nullptr >
9357void BM_AssignInputIterIter (benchmark::State& st, Container c, GenInputs gen) {
9458 auto in = gen (st.range (1 ));
59+ c.resize (st.range (0 ));
9560 benchmark::DoNotOptimize (&in);
61+ benchmark::DoNotOptimize (&c);
9662 for (auto _ : st) {
97- st.PauseTiming ();
98- c.resize (st.range (0 ));
99- benchmark::DoNotOptimize (&c);
100- st.ResumeTiming ();
101- c.assign (make_input_iterator (in.begin ()), make_input_iterator (in.end ()));
63+ c.assign (cpp17_input_iterator (in.begin ()), cpp17_input_iterator (in.end ()));
10264 benchmark::ClobberMemory ();
10365 }
10466}
@@ -108,14 +70,12 @@ template <class Container,
10870 typename std::enable_if<!std::is_trivial<typename Container::value_type>::value>::type* = nullptr >
10971void BM_AssignInputIterIter (benchmark::State& st, Container c, GenInputs gen) {
11072 auto v = gen (1 , 100 );
73+ c.resize (st.range (0 ), v[0 ]);
11174 auto in = gen (st.range (1 ), 32 );
11275 benchmark::DoNotOptimize (&in);
76+ benchmark::DoNotOptimize (&c);
11377 for (auto _ : st) {
114- st.PauseTiming ();
115- c.resize (st.range (0 ), v[0 ]);
116- benchmark::DoNotOptimize (&c);
117- st.ResumeTiming ();
118- c.assign (make_input_iterator (in.begin ()), make_input_iterator (in.end ()));
78+ c.assign (cpp17_input_iterator (in.begin ()), cpp17_input_iterator (in.end ()));
11979 benchmark::ClobberMemory ();
12080 }
12181}
0 commit comments