test_bimap_modify.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // Boost.Bimap
  2. //
  3. // Copyright (c) 2006-2007 Matias Capeletto
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. // VC++ 8.0 warns on usage of certain Standard Library and API functions that
  9. // can be cause buffer overruns or other possible security issues if misused.
  10. // See https://web.archive.org/web/20071014014301/http://msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC/default.aspx
  11. // But the wording of the warning is misleading and unsettling, there are no
  12. // portable alternative functions, and VC++ 8.0's own libraries use the
  13. // functions in question. So turn off the warnings.
  14. #define _CRT_SECURE_NO_DEPRECATE
  15. #define _SCL_SECURE_NO_DEPRECATE
  16. #include <boost/config.hpp>
  17. // Boost.Test
  18. #include <boost/test/minimal.hpp>
  19. // Boost.Bimap
  20. #include <boost/bimap/support/lambda.hpp>
  21. #include <boost/bimap/bimap.hpp>
  22. struct id{};
  23. void test_bimap_modify()
  24. {
  25. using namespace boost::bimaps;
  26. typedef bimap<int,long> bm;
  27. bm b;
  28. b.insert( bm::value_type(2,200) );
  29. BOOST_CHECK( b.left.at(2) == 200 );
  30. bool result;
  31. // replace
  32. //----------------------------------------------------------------------
  33. // successful replace in left map view
  34. {
  35. bm::left_iterator i = b.left.begin();
  36. result = b.left.replace( i, bm::left_value_type(1,100) );
  37. BOOST_CHECK( result );
  38. BOOST_CHECK( b.size() == 1 );
  39. BOOST_CHECK( i->first == 1 && i->second == 100 );
  40. BOOST_CHECK( b.left.at(1) == 100 );
  41. result = b.left.replace_key( i, 2 );
  42. BOOST_CHECK( result );
  43. BOOST_CHECK( b.size() == 1 );
  44. BOOST_CHECK( i->first == 2 && i->second == 100 );
  45. BOOST_CHECK( b.left.at(2) == 100 );
  46. result = b.left.replace_data( i, 200 );
  47. BOOST_CHECK( result );
  48. BOOST_CHECK( b.size() == 1 );
  49. BOOST_CHECK( i->first == 2 && i->second == 200 );
  50. BOOST_CHECK( b.left.at(2) == 200 );
  51. }
  52. // successful replace in right map view
  53. {
  54. bm::right_iterator i = b.right.begin();
  55. result = b.right.replace( i, bm::right_value_type(100,1) );
  56. BOOST_CHECK( result );
  57. BOOST_CHECK( b.size() == 1 );
  58. BOOST_CHECK( i->first == 100 && i->second == 1 );
  59. BOOST_CHECK( b.right.at(100) == 1 );
  60. result = b.right.replace_key( i, 200 );
  61. BOOST_CHECK( result );
  62. BOOST_CHECK( b.size() == 1 );
  63. BOOST_CHECK( i->first == 200 && i->second == 1 );
  64. BOOST_CHECK( b.right.at(200) == 1 );
  65. result = b.right.replace_data( i, 2 );
  66. BOOST_CHECK( result );
  67. BOOST_CHECK( b.size() == 1 );
  68. BOOST_CHECK( i->first == 200 && i->second == 2 );
  69. BOOST_CHECK( b.right.at(200) == 2 );
  70. }
  71. // successful replace in set of relations view
  72. {
  73. bm::iterator i = b.begin();
  74. result = b.replace( i, bm::value_type(1,100) );
  75. BOOST_CHECK( result );
  76. BOOST_CHECK( b.size() == 1 );
  77. BOOST_CHECK( i->left == 1 && i->right == 100 );
  78. BOOST_CHECK( b.left.at(1) == 100 );
  79. result = b.replace_left( i, 2 );
  80. BOOST_CHECK( result );
  81. BOOST_CHECK( b.size() == 1 );
  82. BOOST_CHECK( i->left == 2 && i->right == 100 );
  83. BOOST_CHECK( b.left.at(2) == 100 );
  84. result = b.replace_right( b.begin(), 200 );
  85. BOOST_CHECK( result );
  86. BOOST_CHECK( b.size() == 1 );
  87. BOOST_CHECK( i->left == 2 && i->right == 200 );
  88. BOOST_CHECK( b.left.at(2) == 200 );
  89. }
  90. b.clear();
  91. b.insert( bm::value_type(1,100) );
  92. b.insert( bm::value_type(2,200) );
  93. // fail to replace in left map view
  94. {
  95. bm::left_iterator i = b.left.begin();
  96. result = b.left.replace( i, bm::left_value_type(2,100) );
  97. BOOST_CHECK( ! result );
  98. BOOST_CHECK( b.size() == 2 );
  99. BOOST_CHECK( i->first == 1 && i->second == 100 );
  100. BOOST_CHECK( b.left.at(1) == 100 );
  101. BOOST_CHECK( b.left.at(2) == 200 );
  102. // Add checks for replace_key and replace_data
  103. }
  104. // Add checks for fail to replace in right map view
  105. // Add checks for fail to replace in set of relations view
  106. // modify
  107. // ----------------------------------------------------------------------
  108. b.clear();
  109. b.insert( bm::value_type(1,100) );
  110. // successful modify in left map view
  111. {
  112. result = b.left.modify_key( b.left.begin(), _key = 2 );
  113. BOOST_CHECK( result );
  114. BOOST_CHECK( b.size() == 1 );
  115. BOOST_CHECK( b.left.at(2) == 100 );
  116. result = b.left.modify_data( b.left.begin() , _data = 200 );
  117. BOOST_CHECK( result );
  118. BOOST_CHECK( b.size() == 1 );
  119. BOOST_CHECK( b.left.at(2) == 200 );
  120. }
  121. // Add checks for successful modify in right map view
  122. // Add checks for fails to modify in left map view
  123. }
  124. void test_bimap_replace_with_info()
  125. {
  126. using namespace boost::bimaps;
  127. typedef bimap<int,long,with_info<int> > bm;
  128. bm b;
  129. b.insert( bm::value_type(2,200,-2) );
  130. BOOST_CHECK( b.left.at(2) == 200 );
  131. BOOST_CHECK( b.left.info_at(2) == -2 );
  132. // Use set view
  133. {
  134. bm::iterator i = b.begin();
  135. bool result = b.replace( i, bm::value_type(1,100,-1) );
  136. BOOST_CHECK( result );
  137. BOOST_CHECK( b.size() == 1 );
  138. BOOST_CHECK( i->left == 1 && i->right == 100 );
  139. BOOST_CHECK( i->info == -1 );
  140. result = b.replace_left( i, 2 );
  141. BOOST_CHECK( result );
  142. BOOST_CHECK( b.size() == 1 );
  143. BOOST_CHECK( i->left == 2 && i->right == 100 );
  144. BOOST_CHECK( i->info == -1 );
  145. result = b.replace_right( i, 200 );
  146. BOOST_CHECK( result );
  147. BOOST_CHECK( b.size() == 1 );
  148. BOOST_CHECK( i->left == 2 && i->right == 200 );
  149. BOOST_CHECK( i->info == -1 );
  150. }
  151. // Use map view
  152. {
  153. bm::left_iterator i = b.left.begin();
  154. bool result = b.left.replace( i, bm::left_value_type(1,100,-1) );
  155. BOOST_CHECK( result );
  156. BOOST_CHECK( b.left.size() == 1 );
  157. BOOST_CHECK( i->first == 1 && i->second == 100 );
  158. BOOST_CHECK( i->info == -1 );
  159. result = b.left.replace_key( i, 2 );
  160. BOOST_CHECK( result );
  161. BOOST_CHECK( b.left.size() == 1 );
  162. BOOST_CHECK( i->first == 2 && i->second == 100 );
  163. BOOST_CHECK( i->info == -1 );
  164. result = b.left.replace_data( i, 200 );
  165. BOOST_CHECK( result );
  166. BOOST_CHECK( b.left.size() == 1 );
  167. BOOST_CHECK( i->first == 2 && i->second == 200 );
  168. BOOST_CHECK( i->info == -1 );
  169. }
  170. }
  171. int test_main( int, char* [] )
  172. {
  173. test_bimap_modify();
  174. test_bimap_replace_with_info();
  175. return 0;
  176. }