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
26struct id{};
27
28void 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
176void 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
240int main()
241{
242 test_bimap_modify();
243
244 test_bimap_replace_with_info();
245
246 return boost::report_errors();
247}
248
249

source code of boost/libs/bimap/test/test_bimap_modify.cpp