Blender  V2.93
FN_cpp_type_test.cc
Go to the documentation of this file.
1 /* Apache License, Version 2.0 */
2 
3 #include "testing/testing.h"
4 
5 #include "FN_cpp_type.hh"
6 #include "FN_cpp_type_make.hh"
7 
8 namespace blender::fn::tests {
9 
10 static const int default_constructed_value = 1;
11 static const int copy_constructed_value = 2;
12 static const int move_constructed_value = 3;
13 static const int copy_constructed_from_value = 4;
14 static const int move_constructed_from_value = 5;
15 static const int copy_assigned_value = 6;
16 static const int copy_assigned_from_value = 7;
17 static const int move_assigned_value = 8;
18 static const int move_assigned_from_value = 9;
19 static const int destructed_value = 10;
20 
21 struct TestType {
22  mutable volatile int value;
23 
25  {
27  }
28 
30  {
32  }
33 
34  TestType(const TestType &other)
35  {
38  }
39 
40  TestType(TestType &&other) noexcept
41  {
43  other.value = move_constructed_from_value;
44  }
45 
46  TestType &operator=(const TestType &other)
47  {
50  return *this;
51  }
52 
53  TestType &operator=(TestType &&other) noexcept
54  {
56  other.value = move_assigned_from_value;
57  return *this;
58  }
59 
60  friend std::ostream &operator<<(std::ostream &stream, const TestType &value)
61  {
62  stream << value.value;
63  return stream;
64  }
65 
66  friend bool operator==(const TestType &UNUSED(a), const TestType &UNUSED(b))
67  {
68  return false;
69  }
70 
71  uint64_t hash() const
72  {
73  return 0;
74  }
75 };
76 
77 } // namespace blender::fn::tests
78 
80 
81 namespace blender::fn::tests {
82 
83 static const CPPType &CPPType_TestType = CPPType::get<TestType>();
84 
85 TEST(cpp_type, Size)
86 {
88 }
89 
90 TEST(cpp_type, Alignment)
91 {
93 }
94 
95 TEST(cpp_type, Is)
96 {
97  EXPECT_TRUE(CPPType_TestType.is<TestType>());
98  EXPECT_FALSE(CPPType_TestType.is<int>());
99 }
100 
101 TEST(cpp_type, DefaultConstruction)
102 {
103  int buffer[10] = {0};
106  EXPECT_EQ(buffer[1], 0);
111  EXPECT_EQ(buffer[3], 0);
114  EXPECT_EQ(buffer[4], 0);
116  EXPECT_EQ(buffer[6], 0);
118  EXPECT_EQ(buffer[8], 0);
119 }
120 
121 TEST(cpp_type, Destruct)
122 {
123  int buffer[10] = {0};
126  EXPECT_EQ(buffer[1], 0);
127  CPPType_TestType.destruct_n((void *)buffer, 3);
131  EXPECT_EQ(buffer[3], 0);
132  CPPType_TestType.destruct_indices((void *)buffer, {2, 5, 7});
134  EXPECT_EQ(buffer[4], 0);
136  EXPECT_EQ(buffer[6], 0);
138  EXPECT_EQ(buffer[8], 0);
139 }
140 
141 TEST(cpp_type, CopyToUninitialized)
142 {
143  int buffer1[10] = {0};
144  int buffer2[10] = {0};
145  CPPType_TestType.copy_to_uninitialized((void *)buffer1, (void *)buffer2);
147  EXPECT_EQ(buffer2[0], copy_constructed_value);
148  CPPType_TestType.copy_to_uninitialized_n((void *)buffer1, (void *)buffer2, 3);
150  EXPECT_EQ(buffer2[0], copy_constructed_value);
152  EXPECT_EQ(buffer2[1], copy_constructed_value);
154  EXPECT_EQ(buffer2[2], copy_constructed_value);
155  EXPECT_EQ(buffer1[3], 0);
156  EXPECT_EQ(buffer2[3], 0);
157  CPPType_TestType.copy_to_uninitialized_indices((void *)buffer1, (void *)buffer2, {2, 5, 7});
159  EXPECT_EQ(buffer2[2], copy_constructed_value);
160  EXPECT_EQ(buffer1[4], 0);
161  EXPECT_EQ(buffer2[4], 0);
163  EXPECT_EQ(buffer2[5], copy_constructed_value);
164  EXPECT_EQ(buffer1[6], 0);
165  EXPECT_EQ(buffer2[6], 0);
167  EXPECT_EQ(buffer2[7], copy_constructed_value);
168  EXPECT_EQ(buffer1[8], 0);
169  EXPECT_EQ(buffer2[8], 0);
170 }
171 
172 TEST(cpp_type, CopyToInitialized)
173 {
174  int buffer1[10] = {0};
175  int buffer2[10] = {0};
176  CPPType_TestType.copy_to_initialized((void *)buffer1, (void *)buffer2);
177  EXPECT_EQ(buffer1[0], copy_assigned_from_value);
178  EXPECT_EQ(buffer2[0], copy_assigned_value);
179  CPPType_TestType.copy_to_initialized_n((void *)buffer1, (void *)buffer2, 3);
180  EXPECT_EQ(buffer1[0], copy_assigned_from_value);
181  EXPECT_EQ(buffer2[0], copy_assigned_value);
182  EXPECT_EQ(buffer1[1], copy_assigned_from_value);
183  EXPECT_EQ(buffer2[1], copy_assigned_value);
184  EXPECT_EQ(buffer1[2], copy_assigned_from_value);
185  EXPECT_EQ(buffer2[2], copy_assigned_value);
186  EXPECT_EQ(buffer1[3], 0);
187  EXPECT_EQ(buffer2[3], 0);
188  CPPType_TestType.copy_to_initialized_indices((void *)buffer1, (void *)buffer2, {2, 5, 7});
189  EXPECT_EQ(buffer1[2], copy_assigned_from_value);
190  EXPECT_EQ(buffer2[2], copy_assigned_value);
191  EXPECT_EQ(buffer1[4], 0);
192  EXPECT_EQ(buffer2[4], 0);
193  EXPECT_EQ(buffer1[5], copy_assigned_from_value);
194  EXPECT_EQ(buffer2[5], copy_assigned_value);
195  EXPECT_EQ(buffer1[6], 0);
196  EXPECT_EQ(buffer2[6], 0);
197  EXPECT_EQ(buffer1[7], copy_assigned_from_value);
198  EXPECT_EQ(buffer2[7], copy_assigned_value);
199  EXPECT_EQ(buffer1[8], 0);
200  EXPECT_EQ(buffer2[8], 0);
201 }
202 
203 TEST(cpp_type, RelocateToUninitialized)
204 {
205  int buffer1[10] = {0};
206  int buffer2[10] = {0};
207  CPPType_TestType.relocate_to_uninitialized((void *)buffer1, (void *)buffer2);
208  EXPECT_EQ(buffer1[0], destructed_value);
209  EXPECT_EQ(buffer2[0], move_constructed_value);
210  CPPType_TestType.relocate_to_uninitialized_n((void *)buffer1, (void *)buffer2, 3);
211  EXPECT_EQ(buffer1[0], destructed_value);
212  EXPECT_EQ(buffer2[0], move_constructed_value);
213  EXPECT_EQ(buffer1[1], destructed_value);
214  EXPECT_EQ(buffer2[1], move_constructed_value);
215  EXPECT_EQ(buffer1[2], destructed_value);
216  EXPECT_EQ(buffer2[2], move_constructed_value);
217  EXPECT_EQ(buffer1[3], 0);
218  EXPECT_EQ(buffer2[3], 0);
219  CPPType_TestType.relocate_to_uninitialized_indices((void *)buffer1, (void *)buffer2, {2, 5, 7});
220  EXPECT_EQ(buffer1[2], destructed_value);
221  EXPECT_EQ(buffer2[2], move_constructed_value);
222  EXPECT_EQ(buffer1[4], 0);
223  EXPECT_EQ(buffer2[4], 0);
224  EXPECT_EQ(buffer1[5], destructed_value);
225  EXPECT_EQ(buffer2[5], move_constructed_value);
226  EXPECT_EQ(buffer1[6], 0);
227  EXPECT_EQ(buffer2[6], 0);
228  EXPECT_EQ(buffer1[7], destructed_value);
229  EXPECT_EQ(buffer2[7], move_constructed_value);
230  EXPECT_EQ(buffer1[8], 0);
231  EXPECT_EQ(buffer2[8], 0);
232 }
233 
234 TEST(cpp_type, RelocateToInitialized)
235 {
236  int buffer1[10] = {0};
237  int buffer2[10] = {0};
238  CPPType_TestType.relocate_to_initialized((void *)buffer1, (void *)buffer2);
239  EXPECT_EQ(buffer1[0], destructed_value);
240  EXPECT_EQ(buffer2[0], move_assigned_value);
241  CPPType_TestType.relocate_to_initialized_n((void *)buffer1, (void *)buffer2, 3);
242  EXPECT_EQ(buffer1[0], destructed_value);
243  EXPECT_EQ(buffer2[0], move_assigned_value);
244  EXPECT_EQ(buffer1[1], destructed_value);
245  EXPECT_EQ(buffer2[1], move_assigned_value);
246  EXPECT_EQ(buffer1[2], destructed_value);
247  EXPECT_EQ(buffer2[2], move_assigned_value);
248  EXPECT_EQ(buffer1[3], 0);
249  EXPECT_EQ(buffer2[3], 0);
250  CPPType_TestType.relocate_to_initialized_indices((void *)buffer1, (void *)buffer2, {2, 5, 7});
251  EXPECT_EQ(buffer1[2], destructed_value);
252  EXPECT_EQ(buffer2[2], move_assigned_value);
253  EXPECT_EQ(buffer1[4], 0);
254  EXPECT_EQ(buffer2[4], 0);
255  EXPECT_EQ(buffer1[5], destructed_value);
256  EXPECT_EQ(buffer2[5], move_assigned_value);
257  EXPECT_EQ(buffer1[6], 0);
258  EXPECT_EQ(buffer2[6], 0);
259  EXPECT_EQ(buffer1[7], destructed_value);
260  EXPECT_EQ(buffer2[7], move_assigned_value);
261  EXPECT_EQ(buffer1[8], 0);
262  EXPECT_EQ(buffer2[8], 0);
263 }
264 
265 TEST(cpp_type, FillInitialized)
266 {
267  int buffer1 = 0;
268  int buffer2[10] = {0};
269  CPPType_TestType.fill_initialized((void *)&buffer1, (void *)buffer2, 3);
271  EXPECT_EQ(buffer2[0], copy_assigned_value);
272  EXPECT_EQ(buffer2[1], copy_assigned_value);
273  EXPECT_EQ(buffer2[2], copy_assigned_value);
274  EXPECT_EQ(buffer2[3], 0);
275 
276  buffer1 = 0;
277  CPPType_TestType.fill_initialized_indices((void *)&buffer1, (void *)buffer2, {1, 6, 8});
279  EXPECT_EQ(buffer2[0], copy_assigned_value);
280  EXPECT_EQ(buffer2[1], copy_assigned_value);
281  EXPECT_EQ(buffer2[2], copy_assigned_value);
282  EXPECT_EQ(buffer2[3], 0);
283  EXPECT_EQ(buffer2[4], 0);
284  EXPECT_EQ(buffer2[5], 0);
285  EXPECT_EQ(buffer2[6], copy_assigned_value);
286  EXPECT_EQ(buffer2[7], 0);
287  EXPECT_EQ(buffer2[8], copy_assigned_value);
288  EXPECT_EQ(buffer2[9], 0);
289 }
290 
291 TEST(cpp_type, FillUninitialized)
292 {
293  int buffer1 = 0;
294  int buffer2[10] = {0};
295  CPPType_TestType.fill_uninitialized((void *)&buffer1, (void *)buffer2, 3);
297  EXPECT_EQ(buffer2[0], copy_constructed_value);
298  EXPECT_EQ(buffer2[1], copy_constructed_value);
299  EXPECT_EQ(buffer2[2], copy_constructed_value);
300  EXPECT_EQ(buffer2[3], 0);
301 
302  buffer1 = 0;
303  CPPType_TestType.fill_uninitialized_indices((void *)&buffer1, (void *)buffer2, {1, 6, 8});
305  EXPECT_EQ(buffer2[0], copy_constructed_value);
306  EXPECT_EQ(buffer2[1], copy_constructed_value);
307  EXPECT_EQ(buffer2[2], copy_constructed_value);
308  EXPECT_EQ(buffer2[3], 0);
309  EXPECT_EQ(buffer2[4], 0);
310  EXPECT_EQ(buffer2[5], 0);
311  EXPECT_EQ(buffer2[6], copy_constructed_value);
312  EXPECT_EQ(buffer2[7], 0);
313  EXPECT_EQ(buffer2[8], copy_constructed_value);
314  EXPECT_EQ(buffer2[9], 0);
315 }
316 
317 TEST(cpp_type, DebugPrint)
318 {
319  int value = 42;
320  std::stringstream ss;
321  CPPType::get<int32_t>().debug_print((void *)&value, ss);
322  std::string text = ss.str();
323  EXPECT_EQ(text, "42");
324 }
325 
326 } // namespace blender::fn::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define UNUSED(x)
#define MAKE_CPP_TYPE(IDENTIFIER, TYPE_NAME)
void construct_default(void *ptr) const
Definition: FN_cpp_type.hh:329
void relocate_to_uninitialized_indices(void *src, void *dst, IndexMask mask) const
Definition: FN_cpp_type.hh:583
int64_t size() const
Definition: FN_cpp_type.hh:280
void copy_to_initialized_n(const void *src, void *dst, int64_t n) const
Definition: FN_cpp_type.hh:399
void copy_to_initialized_indices(const void *src, void *dst, IndexMask mask) const
Definition: FN_cpp_type.hh:408
void destruct_indices(void *ptr, IndexMask mask) const
Definition: FN_cpp_type.hh:372
int64_t alignment() const
Definition: FN_cpp_type.hh:291
void construct_default_indices(void *ptr, IndexMask mask) const
Definition: FN_cpp_type.hh:343
void fill_initialized(const void *value, void *dst, int64_t n) const
Definition: FN_cpp_type.hh:597
void construct_default_n(void *ptr, int64_t n) const
Definition: FN_cpp_type.hh:336
void fill_initialized_indices(const void *value, void *dst, IndexMask mask) const
Definition: FN_cpp_type.hh:605
void relocate_to_uninitialized_n(void *src, void *dst, int64_t n) const
Definition: FN_cpp_type.hh:574
void copy_to_uninitialized_n(const void *src, void *dst, int64_t n) const
Definition: FN_cpp_type.hh:434
void relocate_to_uninitialized(void *src, void *dst) const
Definition: FN_cpp_type.hh:565
void copy_to_uninitialized_indices(const void *src, void *dst, IndexMask mask) const
Definition: FN_cpp_type.hh:443
void fill_uninitialized_indices(const void *value, void *dst, IndexMask mask) const
Definition: FN_cpp_type.hh:626
void relocate_to_initialized_indices(void *src, void *dst, IndexMask mask) const
Definition: FN_cpp_type.hh:548
void destruct(void *ptr) const
Definition: FN_cpp_type.hh:358
void copy_to_initialized(const void *src, void *dst) const
Definition: FN_cpp_type.hh:390
void relocate_to_initialized(void *src, void *dst) const
Definition: FN_cpp_type.hh:530
void destruct_n(void *ptr, int64_t n) const
Definition: FN_cpp_type.hh:365
void fill_uninitialized(const void *value, void *dst, int64_t n) const
Definition: FN_cpp_type.hh:618
void copy_to_uninitialized(const void *src, void *dst) const
Definition: FN_cpp_type.hh:425
void relocate_to_initialized_n(void *src, void *dst, int64_t n) const
Definition: FN_cpp_type.hh:539
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
static unsigned a[3]
Definition: RandGen.cpp:92
static const int move_assigned_value
static const int move_constructed_from_value
static const int move_assigned_from_value
static const int copy_constructed_from_value
static const int default_constructed_value
static const int destructed_value
static const int move_constructed_value
static const int copy_constructed_value
TEST(cpp_type, Size)
static const int copy_assigned_value
static const CPPType & CPPType_TestType
static const int copy_assigned_from_value
unsigned __int64 uint64_t
Definition: stdint.h:93
TestType(TestType &&other) noexcept
TestType & operator=(const TestType &other)
friend std::ostream & operator<<(std::ostream &stream, const TestType &value)
TestType & operator=(TestType &&other) noexcept
friend bool operator==(const TestType &UNUSED(a), const TestType &UNUSED(b))
TestType(const TestType &other)