DynamicArray.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <tests/framework/Framework.h>
  6. #include <anki/util/DynamicArray.h>
  7. #include <vector>
  8. namespace anki
  9. {
  10. static I64 constructor0Count = 0;
  11. static I64 constructor1Count = 0;
  12. static I64 constructor2Count = 0;
  13. static I64 constructor3Count = 0;
  14. static I64 destructorCount = 0;
  15. static I64 copyCount = 0;
  16. static I64 moveCount = 0;
  17. class DynamicArrayFoo
  18. {
  19. public:
  20. int m_x;
  21. DynamicArrayFoo()
  22. : m_x(0)
  23. {
  24. ++constructor0Count;
  25. }
  26. DynamicArrayFoo(int x)
  27. : m_x(x)
  28. {
  29. ++constructor1Count;
  30. }
  31. DynamicArrayFoo(const DynamicArrayFoo& b)
  32. : m_x(b.m_x)
  33. {
  34. ++constructor2Count;
  35. }
  36. DynamicArrayFoo(DynamicArrayFoo&& b)
  37. : m_x(b.m_x)
  38. {
  39. b.m_x = 0;
  40. ++constructor3Count;
  41. }
  42. ~DynamicArrayFoo()
  43. {
  44. ++destructorCount;
  45. }
  46. DynamicArrayFoo& operator=(const DynamicArrayFoo& b)
  47. {
  48. m_x = b.m_x;
  49. ++copyCount;
  50. return *this;
  51. }
  52. DynamicArrayFoo& operator=(DynamicArrayFoo&& b)
  53. {
  54. m_x = b.m_x;
  55. b.m_x = 0;
  56. ++moveCount;
  57. return *this;
  58. }
  59. };
  60. } // end namespace anki
  61. ANKI_TEST(Util, DynamicArray)
  62. {
  63. {
  64. HeapAllocator<U8> alloc(allocAligned, nullptr);
  65. DynamicArrayAuto<DynamicArrayFoo> arr(alloc);
  66. arr.resize(0);
  67. arr.resize(2, 1);
  68. arr.resize(3, 2);
  69. arr.resize(4, 3);
  70. ANKI_TEST_EXPECT_EQ(arr.getSize(), 4);
  71. ANKI_TEST_EXPECT_EQ(arr[0].m_x, 1);
  72. ANKI_TEST_EXPECT_EQ(arr[1].m_x, 1);
  73. ANKI_TEST_EXPECT_EQ(arr[2].m_x, 2);
  74. ANKI_TEST_EXPECT_EQ(arr[3].m_x, 3);
  75. arr.emplaceBack(4);
  76. ANKI_TEST_EXPECT_EQ(arr.getSize(), 5);
  77. ANKI_TEST_EXPECT_EQ(arr[4].m_x, 4);
  78. arr.resize(1);
  79. arr.resize(0);
  80. }
  81. // Fuzzy
  82. {
  83. srand(time(nullptr));
  84. HeapAllocator<U8> alloc(allocAligned, nullptr);
  85. DynamicArrayAuto<DynamicArrayFoo> arr(alloc);
  86. std::vector<DynamicArrayFoo> vec;
  87. const U ITERATIONS = 1000000;
  88. for(U i = 0; i < ITERATIONS; ++i)
  89. {
  90. const Bool grow = arr.getSize() > 0 && (rand() & 1);
  91. PtrSize newSize;
  92. U32 value = rand();
  93. if(grow)
  94. {
  95. newSize = vec.size() * randRange(1.0, 4.0);
  96. }
  97. else
  98. {
  99. newSize = vec.size() * randRange(0.0, 0.9);
  100. }
  101. vec.resize(newSize, value);
  102. arr.resize(newSize, value);
  103. // Validate
  104. ANKI_TEST_EXPECT_EQ(arr.getSize(), vec.size());
  105. for(U i = 0; i < arr.getSize(); ++i)
  106. {
  107. ANKI_TEST_EXPECT_EQ(arr[i].m_x, vec[i].m_x);
  108. }
  109. arr.validate();
  110. }
  111. arr = DynamicArrayAuto<DynamicArrayFoo>(alloc);
  112. vec = std::vector<DynamicArrayFoo>();
  113. ANKI_TEST_EXPECT_GT(destructorCount, 0);
  114. ANKI_TEST_EXPECT_EQ(
  115. constructor0Count + constructor1Count + constructor2Count + constructor3Count, destructorCount);
  116. }
  117. }