space_optimized_test.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // Test of the space optimized adaptor of the circular buffer.
  2. // Copyright (c) 2003-2008 Jan Gaspar
  3. // Use, modification, and distribution is subject to the Boost Software
  4. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #include "test.hpp"
  7. #define CB_CONTAINER circular_buffer_space_optimized
  8. #include "common.ipp"
  9. typedef circular_buffer_space_optimized<MyInteger> cb_space_optimized;
  10. typedef cb_space_optimized::capacity_type capacity_ctrl;
  11. // min_capacity test (it is useful to use a debug tool)
  12. void min_capacity_test() {
  13. vector<int> v;
  14. v.push_back(1);
  15. v.push_back(2);
  16. v.push_back(3);
  17. v.push_back(4);
  18. v.push_back(5);
  19. cb_space_optimized cb1(capacity_ctrl(10, 10));
  20. cb_space_optimized cb2(capacity_ctrl(10, 5), 1);
  21. cb_space_optimized cb3(capacity_ctrl(20, 10), v.begin(), v.end());
  22. BOOST_TEST(cb1.size() == 0);
  23. BOOST_TEST(cb1.capacity().capacity() == 10);
  24. BOOST_TEST(cb1.capacity().min_capacity() == 10);
  25. BOOST_TEST(cb2[0] == 1);
  26. BOOST_TEST(cb2.size() == 10);
  27. BOOST_TEST(cb2.capacity() == 10);
  28. BOOST_TEST(cb2.capacity().min_capacity() == 5);
  29. BOOST_TEST(cb3[0] == 1);
  30. BOOST_TEST(cb3.size() == 5);
  31. BOOST_TEST(cb3.capacity() == 20);
  32. BOOST_TEST(cb3.capacity().min_capacity() == 10);
  33. BOOST_TEST(cb1.capacity().min_capacity() <= cb1.internal_capacity());
  34. BOOST_TEST(cb2.capacity().min_capacity() <= cb2.internal_capacity());
  35. BOOST_TEST(cb3.capacity().min_capacity() <= cb3.internal_capacity());
  36. cb2.erase(cb2.begin() + 2, cb2.end());
  37. BOOST_TEST(cb2.size() == 2);
  38. BOOST_TEST(cb2.capacity().min_capacity() <= cb2.internal_capacity());
  39. cb2.clear();
  40. cb3.clear();
  41. BOOST_TEST(cb2.empty());
  42. BOOST_TEST(cb3.empty());
  43. BOOST_TEST(cb2.capacity().min_capacity() <= cb2.internal_capacity());
  44. BOOST_TEST(cb3.capacity().min_capacity() <= cb3.internal_capacity());
  45. }
  46. void capacity_control_test() {
  47. circular_buffer_space_optimized<int>::capacity_type c1 = 10;
  48. circular_buffer_space_optimized<int>::capacity_type c2 =
  49. circular_buffer_space_optimized<int>::capacity_type(20, 5);
  50. circular_buffer_space_optimized<int>::capacity_type c3 = c2;
  51. BOOST_TEST(c1.capacity() == 10);
  52. BOOST_TEST(c1.min_capacity() == 0);
  53. BOOST_TEST(c2.capacity() == 20);
  54. BOOST_TEST(c2.min_capacity() == 5);
  55. BOOST_TEST(c3.capacity() == 20);
  56. BOOST_TEST(c3.min_capacity() == 5);
  57. c1 = c2;
  58. BOOST_TEST(c1.capacity() == 20);
  59. BOOST_TEST(c1.min_capacity() == 5);
  60. }
  61. void specific_constructors_test() {
  62. cb_space_optimized cb1;
  63. BOOST_TEST(cb1.capacity() == 0);
  64. BOOST_TEST(cb1.capacity().min_capacity() == 0);
  65. BOOST_TEST(cb1.internal_capacity() == 0);
  66. BOOST_TEST(cb1.size() == 0);
  67. cb1.push_back(1);
  68. cb1.push_back(2);
  69. cb1.push_back(3);
  70. BOOST_TEST(cb1.size() == 0);
  71. BOOST_TEST(cb1.capacity() == 0);
  72. vector<int> v;
  73. v.push_back(1);
  74. v.push_back(2);
  75. v.push_back(3);
  76. cb_space_optimized cb2(v.begin(), v.end());
  77. BOOST_TEST(cb2.capacity() == 3);
  78. BOOST_TEST(cb2.capacity().min_capacity() == 0);
  79. BOOST_TEST(cb2.size() == 3);
  80. }
  81. void shrink_to_fit_test() {
  82. cb_space_optimized cb(1000);
  83. cb.push_back(1);
  84. cb.push_back(2);
  85. cb.push_back(3);
  86. BOOST_TEST(cb.size() == 3);
  87. BOOST_TEST(cb.capacity() == 1000);
  88. size_t internal_capacity = cb.internal_capacity();
  89. cb_space_optimized(cb).swap(cb);
  90. BOOST_TEST(cb.size() == 3);
  91. BOOST_TEST(cb.capacity() == 1000);
  92. BOOST_TEST(internal_capacity >= cb.internal_capacity());
  93. }
  94. void iterator_invalidation_test() {
  95. #if BOOST_CB_ENABLE_DEBUG
  96. cb_space_optimized cb1(10, 1);
  97. cb1.push_back(2);
  98. cb1.push_back(3);
  99. cb1.push_back(4);
  100. cb_space_optimized::iterator it1 = cb1.end();
  101. cb_space_optimized::const_iterator it2 = cb1.begin();
  102. cb_space_optimized::iterator it3 = cb1.begin() + 6;
  103. cb1.set_capacity(10);
  104. BOOST_TEST(it1.is_valid(&cb1));
  105. BOOST_TEST(!it2.is_valid(&cb1));
  106. BOOST_TEST(!it3.is_valid(&cb1));
  107. it1 = cb1.end();
  108. it2 = cb1.begin();
  109. it3 = cb1.begin() + 6;
  110. cb1.rset_capacity(10);
  111. BOOST_TEST(it1.is_valid(&cb1));
  112. BOOST_TEST(!it2.is_valid(&cb1));
  113. BOOST_TEST(!it3.is_valid(&cb1));
  114. it1 = cb1.end();
  115. it2 = cb1.begin();
  116. it3 = cb1.begin() + 6;
  117. cb1.resize(10);
  118. BOOST_TEST(it1.is_valid(&cb1));
  119. BOOST_TEST(!it2.is_valid(&cb1));
  120. BOOST_TEST(!it3.is_valid(&cb1));
  121. it1 = cb1.end();
  122. it2 = cb1.begin();
  123. it3 = cb1.begin() + 6;
  124. cb1.rresize(10);
  125. BOOST_TEST(it1.is_valid(&cb1));
  126. BOOST_TEST(!it2.is_valid(&cb1));
  127. BOOST_TEST(!it3.is_valid(&cb1));
  128. {
  129. cb_space_optimized cb2(10, 1);
  130. cb2.push_back(2);
  131. cb2.push_back(3);
  132. cb2.push_back(4);
  133. it1 = cb2.end();
  134. it2 = cb2.begin();
  135. it3 = cb2.begin() + 6;
  136. }
  137. BOOST_TEST(!it1.is_valid(&cb1));
  138. BOOST_TEST(!it2.is_valid(&cb1));
  139. BOOST_TEST(!it3.is_valid(&cb1));
  140. #endif // #if BOOST_CB_ENABLE_DEBUG
  141. }
  142. // test main
  143. int main()
  144. {
  145. run_common_tests();
  146. min_capacity_test();
  147. capacity_control_test();
  148. specific_constructors_test();
  149. shrink_to_fit_test();
  150. iterator_invalidation_test();
  151. return boost::report_errors();
  152. }