Line data Source code
1 : // Copyright 2024 Accenture.
2 :
3 : #include "estd/vector.h"
4 :
5 : #include <gtest/gtest.h>
6 :
7 : namespace
8 : {
9 1 : void example_construction()
10 : {
11 : // EXAMPLE_START construction
12 : // construction of a defaulted ::estd::declare::vector that stores up to 10 elements
13 1 : ::estd::declare::vector<uint8_t, 10> vec1;
14 :
15 : // construction of vectors prefilled with a given number of elements
16 1 : ::estd::declare::vector<uint8_t, 10> vec2(8);
17 1 : ::estd::declare::vector<uint8_t, 10> vec3(8, 255);
18 :
19 : // construction of a vector from another vector
20 1 : ::estd::declare::vector<uint8_t, 20> vec4(vec3);
21 :
22 : // EXAMPLE_END construction
23 1 : }
24 :
25 1 : void example_iterate()
26 : {
27 : // EXAMPLE_START iterate
28 :
29 1 : ::estd::declare::vector<int, 10> int_vec(8);
30 :
31 : // iterate over all elements, modify them
32 1 : uint8_t counter = 0;
33 1 : for (auto& x : int_vec)
34 : {
35 : x = counter++;
36 : }
37 :
38 : // iterate over elements in reverse order
39 1 : for (auto rev_it = int_vec.rbegin(); rev_it != int_vec.rend(); ++rev_it)
40 : {
41 : *rev_it = (*rev_it) * (*rev_it);
42 : }
43 :
44 : // EXAMPLE_END iterate
45 1 : }
46 :
47 : #if 0
48 : void example_element_access() // don't run - asserts on purpose!
49 : {
50 : // EXAMPLE_START element_access
51 : ::estd::declare::vector<uint8_t, 10> vec;
52 : vec.push_back(1);
53 : vec.push_back(2);
54 :
55 : EXPECT_EQ(2, vec.size());
56 : ASSERT_FALSE(vec.empty());
57 : ASSERT_FALSE(vec.full());
58 : EXPECT_EQ(2, vec.back());
59 :
60 : vec.at(0) = 42; // assign 42 to the first element
61 : vec[1] = 43; // assign 43 to the second element
62 :
63 : // access out of bounds - will fail an assert
64 : vec.at(2);
65 : // access out of bounds - undefined behavior (use operator[] with caution!)
66 : vec[2];
67 :
68 : uint8_t* ptr = vec.data(); // points to first element
69 : EXPECT_EQ(ptr, &vec.front());
70 : // EXAMPLE_END element_access
71 : }
72 : #endif
73 :
74 : #if 0
75 : void example_modify() // don't run - asserts on purpose!
76 : {
77 : // EXAMPLE_START modify
78 : ::estd::declare::vector<uint8_t, 10> vec7;
79 :
80 : // resize vector from size 0 to size 2, growing two elements with value 255
81 : vec7.resize(2, 255);
82 :
83 : ::estd::declare::vector<uint8_t, 5> vec8;
84 :
85 : // assign range to vector
86 : uint8_t const testData[] = {0, 1, 2, 3, 4};
87 : vec8.assign(std::begin(testData), std::end(testData));
88 :
89 : // pushing beyond the limit will result in a failed assert.
90 : ::estd::declare::vector<uint8_t, 1> vec9;
91 : vec9.push_back(0);
92 : vec9.push_back(1); // assert fails!
93 :
94 : class Foo
95 : {
96 : public:
97 : Foo(int32_t m, int32_t n) : _m(m), _n(n) {}
98 :
99 : Foo(Foo const&) = delete;
100 : void operator=(Foo const&) = delete;
101 :
102 : int32_t _m;
103 : int32_t _n;
104 : };
105 :
106 : // instantiation of a vector of a noncopyable non default constructible type
107 : ::estd::declare::vector<Foo, 10> vec10;
108 : vec10.emplace_back().construct(13, 17);
109 :
110 : ::estd::declare::vector<uint8_t, 10> vec11;
111 : vec11.clear();
112 :
113 : // insert elements in the vector
114 : vec11.insert(vec11.begin(), 1);
115 : vec11.insert(vec11.begin() + 1, 2, 1);
116 : vec11.emplace(vec11.begin() + 1U).construct(11);
117 :
118 : // remove elements in the vector
119 : vec11.pop_back();
120 : vec11.erase(vec11.begin());
121 : vec11.erase(vec11.end() - 2, vec11.end());
122 :
123 : // assign elements to the vector
124 : vec11.assign(10, 42);
125 : vec11.assign(vec11.begin(), vec11.end());
126 : // EXAMPLE_END modify
127 : }
128 : #endif
129 :
130 1 : void example_compare()
131 : {
132 : // EXAMPLE_START compare
133 1 : uint8_t testData[] = {0, 1, 2, 3, 4};
134 1 : ::estd::declare::vector<int32_t, 5> vec_0_1_2_3_4;
135 1 : vec_0_1_2_3_4.assign(std::begin(testData), std::end(testData));
136 :
137 1 : ::estd::declare::vector<int32_t, 3> vec_99_99(2, 99);
138 1 : ::estd::declare::vector<int32_t, 3> vec_99_15(2);
139 1 : vec_99_15[0] = 99;
140 1 : vec_99_15[1] = 15;
141 :
142 : // vectors of different sizes are not equal and "less than/greater than" relation is undefined
143 1 : EXPECT_TRUE(vec_99_99 != vec_0_1_2_3_4);
144 1 : EXPECT_FALSE(vec_99_99 > vec_0_1_2_3_4);
145 1 : EXPECT_FALSE(vec_99_99 < vec_0_1_2_3_4);
146 1 : EXPECT_FALSE(vec_0_1_2_3_4 > vec_99_99);
147 1 : EXPECT_FALSE(vec_0_1_2_3_4 < vec_99_99);
148 :
149 : // vectors of same size are compared lexicographically
150 1 : EXPECT_TRUE(vec_99_99 != vec_99_15);
151 1 : EXPECT_TRUE(vec_99_99 > vec_99_15);
152 1 : EXPECT_FALSE(vec_99_99 < vec_99_15);
153 :
154 : // vectors with same element size and value
155 1 : EXPECT_TRUE(vec_0_1_2_3_4 == vec_0_1_2_3_4);
156 1 : EXPECT_TRUE(vec_0_1_2_3_4 <= vec_0_1_2_3_4);
157 2 : EXPECT_TRUE(vec_0_1_2_3_4 >= vec_0_1_2_3_4);
158 : // EXAMPLE_END compare
159 1 : }
160 :
161 : } // namespace
162 :
163 3 : TEST(Vector, run_examples)
164 : {
165 1 : example_construction();
166 1 : example_iterate();
167 1 : example_compare();
168 1 : }
|