10#include "gtest/gtest.h"
16template <
typename Config>
class kmp_vector_test :
public ::testing::Test {};
18template <
size_t N>
struct InlineThreshold {
19 template <
typename T>
using Vec = kmp_vector<T, N>;
20 static constexpr size_t value =
N;
23using InlineThresholds =
24 ::testing::Types<InlineThreshold<0>, InlineThreshold<1>, InlineThreshold<8>,
26TYPED_TEST_SUITE(kmp_vector_test, InlineThresholds);
32TYPED_TEST(kmp_vector_test, DefaultConstruction) {
33 typename TypeParam::template Vec<int> v;
34 EXPECT_EQ(v.size(), 0u);
35 EXPECT_TRUE(v.empty());
38TYPED_TEST(kmp_vector_test, ConstructWithCapacity) {
39 typename TypeParam::template Vec<int> v(10);
40 EXPECT_EQ(v.size(), 0u);
41 EXPECT_TRUE(v.empty());
44TYPED_TEST(kmp_vector_test, ConstructWithData) {
45 int data[] = {1, 2, 3, 4, 5};
46 typename TypeParam::template Vec<int> v(5,
data, 5);
48 EXPECT_EQ(v.size(), 5u);
56TYPED_TEST(kmp_vector_test, ConstructWithCapacityLargerThanSize) {
57 int data[] = {1, 2, 3};
58 typename TypeParam::template Vec<int> v(10,
data, 3);
60 EXPECT_EQ(v.size(), 3u);
70TYPED_TEST(kmp_vector_test, CopyConstruction) {
71 int data[] = {1, 2, 3};
72 typename TypeParam::template Vec<int> v1(3,
data, 3);
73 typename TypeParam::template Vec<int> v2(v1);
75 EXPECT_EQ(v2.size(), 3u);
85TYPED_TEST(kmp_vector_test, CopyAssignment) {
86 int data1[] = {1, 2, 3};
88 typename TypeParam::template Vec<int> v1(3, data1, 3);
89 typename TypeParam::template Vec<int> v2(2, data2, 2);
93 EXPECT_EQ(v2.size(), 3u);
99TYPED_TEST(kmp_vector_test, SelfCopyAssignment) {
100 int data[] = {1, 2, 3};
101 typename TypeParam::template Vec<int> v(3,
data, 3);
103 typename TypeParam::template Vec<int> &v_ref = v;
106 EXPECT_EQ(v.size(), 3u);
114TYPED_TEST(kmp_vector_test, MoveConstruction) {
115 int data[] = {1, 2, 3};
116 typename TypeParam::template Vec<int> v1(3,
data, 3);
117 typename TypeParam::template Vec<int> v2(std::move(v1));
119 EXPECT_EQ(v2.size(), 3u);
125 EXPECT_EQ(v1.size(), 0u);
128TYPED_TEST(kmp_vector_test, MoveAssignment) {
129 int data1[] = {1, 2, 3};
130 int data2[] = {4, 5};
131 typename TypeParam::template Vec<int> v1(3, data1, 3);
132 typename TypeParam::template Vec<int> v2(2, data2, 2);
136 EXPECT_EQ(v2.size(), 3u);
138 EXPECT_EQ(v1.size(), 0u);
141TYPED_TEST(kmp_vector_test, SelfMoveAssignment) {
142 int data[] = {1, 2, 3};
143 typename TypeParam::template Vec<int> v(3,
data, 3);
145 typename TypeParam::template Vec<int> &v_ref = v;
146 v = std::move(v_ref);
149 EXPECT_EQ(v.size(), 3u);
157TYPED_TEST(kmp_vector_test, PushBackToEmpty) {
158 typename TypeParam::template Vec<int> v;
162 EXPECT_EQ(v.size(), 1u);
166TYPED_TEST(kmp_vector_test, PushBackMultiple) {
167 typename TypeParam::template Vec<int> v;
175 EXPECT_EQ(v.size(), 5u);
183TYPED_TEST(kmp_vector_test, PushBackGrowth) {
184 typename TypeParam::template Vec<int> v;
187 for (
int i = 0;
i < 100; ++
i)
190 EXPECT_EQ(v.size(), 100u);
191 for (
int i = 0;
i < 100; ++
i)
199TYPED_TEST(kmp_vector_test, Clear) {
200 int data[] = {1, 2, 3};
201 typename TypeParam::template Vec<int> v(3,
data, 3);
203 EXPECT_EQ(v.size(), 3u);
207 EXPECT_EQ(v.size(), 0u);
208 EXPECT_TRUE(v.empty());
211TYPED_TEST(kmp_vector_test, ClearEmpty) {
212 typename TypeParam::template Vec<int> v;
216 EXPECT_EQ(v.size(), 0u);
217 EXPECT_TRUE(v.empty());
220TYPED_TEST(kmp_vector_test, PushBackAfterClear) {
221 int data[] = {1, 2, 3};
222 typename TypeParam::template Vec<int> v(3,
data, 3);
227 EXPECT_EQ(v.size(), 1u);
235TYPED_TEST(kmp_vector_test, EmptyOnDefault) {
236 typename TypeParam::template Vec<int> v;
237 EXPECT_TRUE(v.empty());
240TYPED_TEST(kmp_vector_test, NotEmptyAfterPush) {
241 typename TypeParam::template Vec<int> v;
243 EXPECT_FALSE(v.empty());
246TYPED_TEST(kmp_vector_test, EmptyAfterClear) {
247 typename TypeParam::template Vec<int> v;
250 EXPECT_TRUE(v.empty());
257TYPED_TEST(kmp_vector_test, ContainsFound) {
258 int data[] = {1, 2, 3, 4, 5};
259 typename TypeParam::template Vec<int> v(5,
data, 5);
261 EXPECT_TRUE(v.contains(1));
262 EXPECT_TRUE(v.contains(3));
263 EXPECT_TRUE(v.contains(5));
266TYPED_TEST(kmp_vector_test, ContainsNotFound) {
267 int data[] = {1, 2, 3, 4, 5};
268 typename TypeParam::template Vec<int> v(5,
data, 5);
270 EXPECT_FALSE(v.contains(0));
271 EXPECT_FALSE(v.contains(6));
272 EXPECT_FALSE(v.contains(-1));
275TYPED_TEST(kmp_vector_test, ContainsEmpty) {
276 typename TypeParam::template Vec<int> v;
278 EXPECT_FALSE(v.contains(0));
279 EXPECT_FALSE(v.contains(1));
286TYPED_TEST(kmp_vector_test, IsSetEqualSameOrder) {
287 int data[] = {1, 2, 3};
288 typename TypeParam::template Vec<int> v1(3,
data, 3);
289 typename TypeParam::template Vec<int> v2(3,
data, 3);
291 EXPECT_TRUE(v1.is_set_equal(v2));
292 EXPECT_TRUE(v2.is_set_equal(v1));
295TYPED_TEST(kmp_vector_test, IsSetEqualDifferentOrder) {
296 int data1[] = {1, 2, 3};
297 int data2[] = {3, 1, 2};
298 typename TypeParam::template Vec<int> v1(3, data1, 3);
299 typename TypeParam::template Vec<int> v2(3, data2, 3);
301 EXPECT_TRUE(v1.is_set_equal(v2));
302 EXPECT_TRUE(v2.is_set_equal(v1));
305TYPED_TEST(kmp_vector_test, IsSetEqualDifferentSize) {
306 int data1[] = {1, 2, 3};
307 int data2[] = {1, 2};
308 typename TypeParam::template Vec<int> v1(3, data1, 3);
309 typename TypeParam::template Vec<int> v2(2, data2, 2);
311 EXPECT_FALSE(v1.is_set_equal(v2));
312 EXPECT_FALSE(v2.is_set_equal(v1));
315TYPED_TEST(kmp_vector_test, IsSetEqualDifferentElements) {
316 int data1[] = {1, 2, 3};
317 int data2[] = {1, 2, 4};
318 typename TypeParam::template Vec<int> v1(3, data1, 3);
319 typename TypeParam::template Vec<int> v2(3, data2, 3);
321 EXPECT_FALSE(v1.is_set_equal(v2));
324TYPED_TEST(kmp_vector_test, IsSetEqualEmpty) {
325 typename TypeParam::template Vec<int> v1;
326 typename TypeParam::template Vec<int> v2;
328 EXPECT_TRUE(v1.is_set_equal(v2));
331TYPED_TEST(kmp_vector_test, IsSetEqualWithDuplicates) {
332 int data1[] = {1, 1};
333 int data2[] = {1, 2};
334 typename TypeParam::template Vec<int> v1(2, data1, 2);
335 typename TypeParam::template Vec<int> v2(2, data2, 2);
337 EXPECT_FALSE(v1.is_set_equal(v2));
338 EXPECT_FALSE(v2.is_set_equal(v1));
341TYPED_TEST(kmp_vector_test, IsSetEqualWithDuplicatesSame) {
342 int data1[] = {1, 1};
344 typename TypeParam::template Vec<int> v1(2, data1, 2);
345 typename TypeParam::template Vec<int> v2(1, data2, 1);
347 EXPECT_TRUE(v1.is_set_equal(v2));
348 EXPECT_TRUE(v2.is_set_equal(v1));
355TYPED_TEST(kmp_vector_test, ContainsWithComparator) {
356 int data[] = {10, 20, 30};
357 typename TypeParam::template Vec<int> v(3,
data, 3);
360 auto same_tens = [](
const int &
a,
const int &
b) {
361 return (
a / 10) == (
b / 10);
364 EXPECT_TRUE(v.contains(15, same_tens));
365 EXPECT_TRUE(v.contains(25, same_tens));
366 EXPECT_FALSE(v.contains(45, same_tens));
369TYPED_TEST(kmp_vector_test, ContainsPointerWithComparator) {
370 int a = 100,
b = 200, c = 300;
371 int *
data[] = {&
a, &
b, &c};
372 typename TypeParam::template Vec<int *> v(3,
data, 3);
375 auto deref_comp = [](
int *
const &pa,
int *
const &pb) {
return *pa == *pb; };
381 EXPECT_FALSE(v.contains(px));
384 EXPECT_TRUE(v.contains(px, deref_comp));
387TYPED_TEST(kmp_vector_test, ContainsWithCapturingComparator) {
388 int data[] = {1, 2, 3};
389 typename TypeParam::template Vec<int> v(3,
data, 3);
394 auto shifted_eq = [offset](
const int &
a,
const int &
b) {
395 return a + offset ==
b;
398 EXPECT_TRUE(v.contains(11, shifted_eq));
399 EXPECT_TRUE(v.contains(13, shifted_eq));
400 EXPECT_FALSE(v.contains(99, shifted_eq));
407TYPED_TEST(kmp_vector_test, IsSetEqualWithComparator) {
408 int data1[] = {10, 20, 30};
409 int data2[] = {35, 15, 25};
410 typename TypeParam::template Vec<int> v1(3, data1, 3);
411 typename TypeParam::template Vec<int> v2(3, data2, 3);
413 auto same_tens = [](
const int &
a,
const int &
b) {
414 return (
a / 10) == (
b / 10);
418 EXPECT_FALSE(v1.is_set_equal(v2));
421 EXPECT_TRUE(v1.is_set_equal(v2, same_tens));
424TYPED_TEST(kmp_vector_test, IsSetEqualPointerWithComparator) {
425 int a1 = 100, b1 = 200, c1 = 300;
426 int a2 = 100, b2 = 200, c2 = 300;
427 int *data1[] = {&a1, &b1, &c1};
428 int *data2[] = {&c2, &a2, &b2};
429 typename TypeParam::template Vec<int *> v1(3, data1, 3);
430 typename TypeParam::template Vec<int *> v2(3, data2, 3);
432 auto deref_comp = [](
int *
const &pa,
int *
const &pb) {
return *pa == *pb; };
435 EXPECT_FALSE(v1.is_set_equal(v2));
438 EXPECT_TRUE(v1.is_set_equal(v2, deref_comp));
441TYPED_TEST(kmp_vector_test, IsSetEqualWithCapturingComparator) {
442 int data1[] = {1, 2, 3};
443 int data2[] = {13, 11, 12};
444 typename TypeParam::template Vec<int> v1(3, data1, 3);
445 typename TypeParam::template Vec<int> v2(3, data2, 3);
452 auto offset_eq = [offset](
const int &
a,
const int &
b) {
454 return diff == offset || diff == -offset;
458 EXPECT_FALSE(v1.is_set_equal(v2));
461 EXPECT_TRUE(v1.is_set_equal(v2, offset_eq));
468TYPED_TEST(kmp_vector_test, IndexOperator) {
469 int data[] = {10, 20, 30};
470 typename TypeParam::template Vec<int> v(3,
data, 3);
477TYPED_TEST(kmp_vector_test, IndexOperatorModify) {
478 int data[] = {10, 20, 30};
479 typename TypeParam::template Vec<int> v(3,
data, 3);
483 EXPECT_EQ(v[1], 200);
486TYPED_TEST(kmp_vector_test, ConstIndexOperator) {
487 int data[] = {10, 20, 30};
488 const typename TypeParam::template Vec<int> v(3,
data, 3);
499TYPED_TEST(kmp_vector_test, BeginEnd) {
500 int data[] = {1, 2, 3};
501 typename TypeParam::template Vec<int> v(3,
data, 3);
503 int *
begin = v.begin();
507 EXPECT_EQ(*
begin, 1);
508 EXPECT_EQ(*(
end - 1), 3);
511TYPED_TEST(kmp_vector_test, ConstBeginEnd) {
512 int data[] = {1, 2, 3};
513 const typename TypeParam::template Vec<int> v(3,
data, 3);
515 const int *
begin = v.begin();
516 const int *
end = v.end();
519 EXPECT_EQ(*
begin, 1);
522TYPED_TEST(kmp_vector_test, RangeBasedFor) {
523 int data[] = {1, 2, 3, 4, 5};
524 typename TypeParam::template Vec<int> v(5,
data, 5);
533TYPED_TEST(kmp_vector_test, RangeBasedForModify) {
534 int data[] = {1, 2, 3};
535 typename TypeParam::template Vec<int> v(3,
data, 3);
545TYPED_TEST(kmp_vector_test, RangeBasedForEmpty) {
546 typename TypeParam::template Vec<int> v;
561TYPED_TEST(kmp_vector_test, EmptyVector) {
562 typename TypeParam::template Vec<int> v;
564 EXPECT_EQ(v.size(), 0u);
565 EXPECT_EQ(v.begin(), v.end());
566 EXPECT_FALSE(v.contains(0));
569TYPED_TEST(kmp_vector_test, SingleElement) {
570 typename TypeParam::template Vec<int> v;
573 EXPECT_EQ(v.size(), 1u);
575 EXPECT_TRUE(v.contains(42));
576 EXPECT_EQ(v.end() - v.begin(), 1);
583TYPED_TEST(kmp_vector_test, PointerType) {
584 int a = 1,
b = 2, c = 3;
585 int *
data[] = {&
a, &
b, &c};
586 typename TypeParam::template Vec<int *> v(3,
data, 3);
588 EXPECT_EQ(v.size(), 3u);
594TYPED_TEST(kmp_vector_test, SizeTType) {
595 size_t data[] = {100, 200, 300};
596 typename TypeParam::template Vec<size_t> v(3,
data, 3);
598 EXPECT_EQ(v[0], 100u);
599 EXPECT_EQ(v[1], 200u);
600 EXPECT_EQ(v[2], 300u);
607TYPED_TEST(kmp_vector_test, Reserve) {
608 typename TypeParam::template Vec<int> v;
611 EXPECT_EQ(v.size(), 0u);
615 const int *data_ptr = v.begin();
618 for (
int i = 1;
i < 100; ++
i)
621 EXPECT_EQ(v.size(), 100u);
622 EXPECT_EQ(v.begin(), data_ptr) <<
"Reallocation occurred despite reserve()";
623 for (
int i = 0;
i < 100; ++
i)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void * data
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp end
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp begin
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t count