1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
8 #include <unordered_map>
11 #include <gtest/gtest.h>
13 #include <vpu/utils/containers.hpp>
14 #include <vpu/utils/range.hpp>
15 #include <vpu/utils/handle.hpp>
17 using namespace testing;
21 struct TestStruct final : public vpu::EnableHandleFromThis<TestStruct> {
23 vpu::IntrusivePtrListNode<TestStruct> node1;
24 vpu::IntrusivePtrListNode<TestStruct> node2;
25 explicit TestStruct(int val) : val(val), node1(this), node2(this) {}
30 TEST(VPU_Containers, SmallVector_API) {
31 std::vector<int> vec1;
32 vpu::SmallVector<int, 5> vec2;
34 for (size_t i = 0; i < 5; ++i) {
39 for (size_t i = 0; i < vec1.size(); ++i) {
40 ASSERT_EQ(vec1.at(i), vec2.at(i));
46 for (size_t i = 0; i < 5; ++i) {
49 vec2.insert(vec2.end(), vec1.begin(), vec1.end());
51 auto it1 = std::find(vec1.begin(), vec1.end(), 2);
52 auto it2 = std::find(vec2.begin(), vec2.end(), 2);
54 ASSERT_NE(it1, vec1.end());
55 ASSERT_NE(it2, vec2.end());
60 for (size_t i = 0; i < vec1.size(); ++i) {
61 ASSERT_EQ(vec1.at(i), vec2.at(i));
70 for (size_t i = 0; i < vec1.size(); ++i) {
71 ASSERT_EQ(vec1.at(i), vec2.at(i));
75 TEST(VPU_Containers, SmallVector_Equal) {
76 vpu::SmallVector<int, 5> vec1;
77 vpu::SmallVector<int, 5> vec2;
78 vpu::SmallVector<int, 5> vec3;
80 for (size_t i = 0; i < 5; ++i) {
83 vec3.push_back(i + 1);
86 ASSERT_EQ(vec1, vec2);
87 ASSERT_NE(vec1, vec3);
90 TEST(VPU_Containers, SmallVector_Swap) {
91 vpu::SmallVector<int, 5> vec1;
92 vpu::SmallVector<int, 5> vec2;
94 for (size_t i = 0; i < 5; ++i) {
96 vec2.push_back(5 - i);
101 for (size_t i = 0; i < 5; ++i) {
102 ASSERT_EQ(vec1[i], 5 - i);
103 ASSERT_EQ(vec2[i], i);
107 template <class Cont>
108 Cont buildTestVector(int contSize) {
111 for (int i = 0; i < contSize; ++i) {
118 TEST(VPU_Containers, IntrusivePtrList) {
122 std::vector<std::shared_ptr<TestStruct>> base;
123 for (int i = 0; i < count; ++i) {
124 base.push_back(std::make_shared<TestStruct>(i));
127 vpu::IntrusivePtrList<TestStruct> list1(&TestStruct::node1);
128 vpu::IntrusivePtrList<TestStruct> list2(&TestStruct::node2);
130 for (int i = 0; i < count; ++i) {
131 list1.push_back(base[i]);
134 ASSERT_FALSE(list1.empty());
135 ASSERT_TRUE(list2.empty());
138 for (const auto& ptr1 : list1) {
139 ASSERT_NE(ptr1, nullptr);
140 ASSERT_EQ(ptr1->val, gold);
141 ASSERT_EQ(ptr1.get(), base[ptr1->val].get());
144 ASSERT_EQ(gold, count);
146 for (int i = 0; i < count / 2; ++i) {
147 list2.push_back(base[i]);
150 ASSERT_FALSE(list2.empty());
153 for (const auto& ptr2 : list2) {
154 ASSERT_NE(ptr2, nullptr);
155 ASSERT_EQ(ptr2->val, gold);
156 ASSERT_EQ(ptr2.get(), base[ptr2->val].get());
162 ASSERT_EQ(gold, count / 2);
165 for (const auto& ptr1 : list1) {
166 ASSERT_NE(ptr1, nullptr);
167 ASSERT_EQ(ptr1->val, gold);
168 ASSERT_EQ(ptr1.get(), base[ptr1->val].get());
171 ASSERT_EQ(gold, count);
174 TEST(VPU_Containers, IntrusivePtrList_MoveFromOneListToAnother) {
177 std::list<std::shared_ptr<TestStruct>> base;
179 vpu::IntrusivePtrList<TestStruct> list1(&TestStruct::node1);
180 vpu::IntrusivePtrList<TestStruct> list2(&TestStruct::node1);
182 for (int i = 0; i < count; ++i) {
183 auto ptr = std::make_shared<TestStruct>(i);
185 list1.push_back(ptr);
188 ASSERT_EQ(list1.size(), base.size());
189 ASSERT_TRUE(list2.empty());
191 for (const auto& item : list1) {
193 list2.push_back(item);
196 ASSERT_TRUE(list1.empty());
197 ASSERT_EQ(list2.size(), base.size());
200 TEST(VPU_Containers, IntrusivePtrList_ReleaseOrigObject) {
204 std::list<std::shared_ptr<TestStruct>> base;
206 vpu::IntrusivePtrList<TestStruct> list(&TestStruct::node1);
208 for (int i = 0; i < count; ++i) {
209 auto ptr = std::make_shared<TestStruct>(i);
214 ASSERT_EQ(list.size(), base.size());
217 ASSERT_EQ(list.size(), base.size());
220 ASSERT_EQ(list.size(), base.size());
223 ASSERT_TRUE(list.empty());
226 for (const auto& item : base) {
227 ASSERT_EQ(item->val, gold + 1);
230 ASSERT_EQ(gold, count - 2);