@@ -135,6 +135,66 @@ void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
135135 }
136136}
137137
138+ template <class Container , class GenInputs >
139+ void BM_Insert_InputIterIter_NoRealloc (benchmark::State& st, Container c, GenInputs gen) {
140+ auto in = gen (st.range (0 ));
141+ DoNotOptimizeData (in);
142+ const auto size = c.size ();
143+ const auto beg = cpp17_input_iterator (in.begin ());
144+ const auto end = cpp17_input_iterator (in.end ());
145+ c.reserve (size + in.size ()); // force no reallocation
146+ for (auto _ : st) {
147+ benchmark::DoNotOptimize (&(*c.insert (c.begin (), beg, end)));
148+ st.PauseTiming ();
149+ c.erase (c.begin () + size, c.end ()); // avoid the container to grow indefinitely
150+ st.ResumeTiming ();
151+ DoNotOptimizeData (c);
152+ benchmark::ClobberMemory ();
153+ }
154+ }
155+
156+ template <class Container , class GenInputs >
157+ void BM_Insert_InputIterIter_Realloc_HalfFilled (benchmark::State& st, Container, GenInputs gen) {
158+ const auto size = st.range (0 );
159+ Container a = gen (size);
160+ Container in = gen (size + 10 );
161+ DoNotOptimizeData (a);
162+ DoNotOptimizeData (in);
163+ const auto beg = cpp17_input_iterator (in.begin ());
164+ const auto end = cpp17_input_iterator (in.end ());
165+ for (auto _ : st) {
166+ st.PauseTiming ();
167+ Container c;
168+ c.reserve (size * 2 ); // Reallocation with half-filled container
169+ c = a;
170+ st.ResumeTiming ();
171+ benchmark::DoNotOptimize (&(*c.insert (c.begin (), beg, end)));
172+ DoNotOptimizeData (c);
173+ benchmark::ClobberMemory ();
174+ }
175+ }
176+
177+ template <class Container , class GenInputs >
178+ void BM_Insert_InputIterIter_Realloc_NearFull (benchmark::State& st, Container, GenInputs gen) {
179+ const auto size = st.range (0 );
180+ Container a = gen (size);
181+ Container in = gen (10 );
182+ DoNotOptimizeData (a);
183+ DoNotOptimizeData (in);
184+ const auto beg = cpp17_input_iterator (in.begin ());
185+ const auto end = cpp17_input_iterator (in.end ());
186+ for (auto _ : st) {
187+ st.PauseTiming ();
188+ Container c;
189+ c.reserve (size + 5 ); // Reallocation almost-full container
190+ c = a;
191+ st.ResumeTiming ();
192+ benchmark::DoNotOptimize (&(*c.insert (c.begin (), beg, end)));
193+ DoNotOptimizeData (c);
194+ benchmark::ClobberMemory ();
195+ }
196+ }
197+
138198template <class Container , class GenInputs >
139199void BM_InsertDuplicate (benchmark::State& st, Container c, GenInputs gen) {
140200 auto in = gen (st.range (0 ));
0 commit comments