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 | |
9 | // VC++ 8.0 warns on usage of certain Standard Library and API functions that |
10 | // can be cause buffer overruns or other possible security issues if misused. |
11 | // See https://web.archive.org/web/20071014014301/http://msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC/default.aspx |
12 | // But the wording of the warning is misleading and unsettling, there are no |
13 | // portable alternative functions, and VC++ 8.0's own libraries use the |
14 | // functions in question. So turn off the warnings. |
15 | #define _CRT_SECURE_NO_DEPRECATE |
16 | #define _SCL_SECURE_NO_DEPRECATE |
17 | |
18 | #include <boost/config.hpp> |
19 | |
20 | #include <boost/core/lightweight_test.hpp> |
21 | |
22 | // Boost.Bimap |
23 | #include <boost/bimap/support/lambda.hpp> |
24 | #include <boost/bimap/bimap.hpp> |
25 | |
26 | struct id{}; |
27 | |
28 | void test_bimap_modify() |
29 | { |
30 | using namespace boost::bimaps; |
31 | |
32 | typedef bimap<int,long> bm; |
33 | |
34 | bm b; |
35 | b.insert( x: bm::value_type(2,200) ); |
36 | |
37 | BOOST_TEST( b.left.at(2) == 200 ); |
38 | |
39 | bool result; |
40 | |
41 | // replace |
42 | //---------------------------------------------------------------------- |
43 | |
44 | // successful replace in left map view |
45 | { |
46 | bm::left_iterator i = b.left.begin(); |
47 | |
48 | result = b.left.replace( position: i, x: bm::left_value_type(1,100) ); |
49 | |
50 | BOOST_TEST( result ); |
51 | BOOST_TEST( b.size() == 1 ); |
52 | BOOST_TEST( i->first == 1 && i->second == 100 ); |
53 | BOOST_TEST( b.left.at(1) == 100 ); |
54 | |
55 | result = b.left.replace_key( position: i, k: 2 ); |
56 | |
57 | BOOST_TEST( result ); |
58 | BOOST_TEST( b.size() == 1 ); |
59 | BOOST_TEST( i->first == 2 && i->second == 100 ); |
60 | BOOST_TEST( b.left.at(2) == 100 ); |
61 | |
62 | result = b.left.replace_data( position: i, d: 200 ); |
63 | |
64 | BOOST_TEST( result ); |
65 | BOOST_TEST( b.size() == 1 ); |
66 | BOOST_TEST( i->first == 2 && i->second == 200 ); |
67 | BOOST_TEST( b.left.at(2) == 200 ); |
68 | } |
69 | |
70 | // successful replace in right map view |
71 | { |
72 | bm::right_iterator i = b.right.begin(); |
73 | |
74 | result = b.right.replace( position: i, x: bm::right_value_type(100,1) ); |
75 | |
76 | BOOST_TEST( result ); |
77 | BOOST_TEST( b.size() == 1 ); |
78 | BOOST_TEST( i->first == 100 && i->second == 1 ); |
79 | BOOST_TEST( b.right.at(100) == 1 ); |
80 | |
81 | result = b.right.replace_key( position: i, k: 200 ); |
82 | |
83 | BOOST_TEST( result ); |
84 | BOOST_TEST( b.size() == 1 ); |
85 | BOOST_TEST( i->first == 200 && i->second == 1 ); |
86 | BOOST_TEST( b.right.at(200) == 1 ); |
87 | |
88 | result = b.right.replace_data( position: i, d: 2 ); |
89 | |
90 | BOOST_TEST( result ); |
91 | BOOST_TEST( b.size() == 1 ); |
92 | BOOST_TEST( i->first == 200 && i->second == 2 ); |
93 | BOOST_TEST( b.right.at(200) == 2 ); |
94 | } |
95 | |
96 | // successful replace in set of relations view |
97 | { |
98 | bm::iterator i = b.begin(); |
99 | |
100 | result = b.replace( position: i, x: bm::value_type(1,100) ); |
101 | |
102 | BOOST_TEST( result ); |
103 | BOOST_TEST( b.size() == 1 ); |
104 | BOOST_TEST( i->left == 1 && i->right == 100 ); |
105 | BOOST_TEST( b.left.at(1) == 100 ); |
106 | |
107 | result = b.replace_left( position: i, l: 2 ); |
108 | |
109 | BOOST_TEST( result ); |
110 | BOOST_TEST( b.size() == 1 ); |
111 | BOOST_TEST( i->left == 2 && i->right == 100 ); |
112 | BOOST_TEST( b.left.at(2) == 100 ); |
113 | |
114 | result = b.replace_right( position: b.begin(), r: 200 ); |
115 | |
116 | BOOST_TEST( result ); |
117 | BOOST_TEST( b.size() == 1 ); |
118 | BOOST_TEST( i->left == 2 && i->right == 200 ); |
119 | BOOST_TEST( b.left.at(2) == 200 ); |
120 | |
121 | } |
122 | |
123 | b.clear(); |
124 | b.insert( x: bm::value_type(1,100) ); |
125 | b.insert( x: bm::value_type(2,200) ); |
126 | |
127 | // fail to replace in left map view |
128 | { |
129 | bm::left_iterator i = b.left.begin(); |
130 | |
131 | result = b.left.replace( position: i, x: bm::left_value_type(2,100) ); |
132 | |
133 | BOOST_TEST( ! result ); |
134 | BOOST_TEST( b.size() == 2 ); |
135 | BOOST_TEST( i->first == 1 && i->second == 100 ); |
136 | BOOST_TEST( b.left.at(1) == 100 ); |
137 | BOOST_TEST( b.left.at(2) == 200 ); |
138 | |
139 | |
140 | // Add checks for replace_key and replace_data |
141 | } |
142 | |
143 | // Add checks for fail to replace in right map view |
144 | |
145 | // Add checks for fail to replace in set of relations view |
146 | |
147 | |
148 | // modify |
149 | // ---------------------------------------------------------------------- |
150 | |
151 | b.clear(); |
152 | b.insert( x: bm::value_type(1,100) ); |
153 | |
154 | // successful modify in left map view |
155 | { |
156 | result = b.left.modify_key( position: b.left.begin(), mod: _key = 2 ); |
157 | |
158 | BOOST_TEST( result ); |
159 | BOOST_TEST( b.size() == 1 ); |
160 | BOOST_TEST( b.left.at(2) == 100 ); |
161 | |
162 | result = b.left.modify_data( position: b.left.begin() , mod: _data = 200 ); |
163 | |
164 | BOOST_TEST( result ); |
165 | BOOST_TEST( b.size() == 1 ); |
166 | BOOST_TEST( b.left.at(2) == 200 ); |
167 | } |
168 | |
169 | // Add checks for successful modify in right map view |
170 | |
171 | // Add checks for fails to modify in left map view |
172 | |
173 | |
174 | } |
175 | |
176 | void test_bimap_replace_with_info() |
177 | { |
178 | using namespace boost::bimaps; |
179 | typedef bimap<int,long,with_info<int> > bm; |
180 | |
181 | bm b; |
182 | b.insert( x: bm::value_type(2,200,-2) ); |
183 | |
184 | BOOST_TEST( b.left.at(2) == 200 ); |
185 | BOOST_TEST( b.left.info_at(2) == -2 ); |
186 | |
187 | // Use set view |
188 | { |
189 | bm::iterator i = b.begin(); |
190 | |
191 | bool result = b.replace( position: i, x: bm::value_type(1,100,-1) ); |
192 | |
193 | BOOST_TEST( result ); |
194 | BOOST_TEST( b.size() == 1 ); |
195 | BOOST_TEST( i->left == 1 && i->right == 100 ); |
196 | BOOST_TEST( i->info == -1 ); |
197 | |
198 | result = b.replace_left( position: i, l: 2 ); |
199 | |
200 | BOOST_TEST( result ); |
201 | BOOST_TEST( b.size() == 1 ); |
202 | BOOST_TEST( i->left == 2 && i->right == 100 ); |
203 | BOOST_TEST( i->info == -1 ); |
204 | |
205 | result = b.replace_right( position: i, r: 200 ); |
206 | |
207 | BOOST_TEST( result ); |
208 | BOOST_TEST( b.size() == 1 ); |
209 | BOOST_TEST( i->left == 2 && i->right == 200 ); |
210 | BOOST_TEST( i->info == -1 ); |
211 | } |
212 | |
213 | // Use map view |
214 | { |
215 | bm::left_iterator i = b.left.begin(); |
216 | |
217 | bool result = b.left.replace( position: i, x: bm::left_value_type(1,100,-1) ); |
218 | |
219 | BOOST_TEST( result ); |
220 | BOOST_TEST( b.left.size() == 1 ); |
221 | BOOST_TEST( i->first == 1 && i->second == 100 ); |
222 | BOOST_TEST( i->info == -1 ); |
223 | |
224 | result = b.left.replace_key( position: i, k: 2 ); |
225 | |
226 | BOOST_TEST( result ); |
227 | BOOST_TEST( b.left.size() == 1 ); |
228 | BOOST_TEST( i->first == 2 && i->second == 100 ); |
229 | BOOST_TEST( i->info == -1 ); |
230 | |
231 | result = b.left.replace_data( position: i, d: 200 ); |
232 | |
233 | BOOST_TEST( result ); |
234 | BOOST_TEST( b.left.size() == 1 ); |
235 | BOOST_TEST( i->first == 2 && i->second == 200 ); |
236 | BOOST_TEST( i->info == -1 ); |
237 | } |
238 | } |
239 | |
240 | int main() |
241 | { |
242 | test_bimap_modify(); |
243 | |
244 | test_bimap_replace_with_info(); |
245 | |
246 | return boost::report_errors(); |
247 | } |
248 | |
249 | |