Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / bimap / test / test_bimap_modify.cpp
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 // Boost.Test
21 #include <boost/test/minimal.hpp>
22
23 // Boost.Bimap
24 #include <boost/bimap/support/lambda.hpp>
25 #include <boost/bimap/bimap.hpp>
26
27 struct id{};
28
29 void test_bimap_modify()
30 {
31     using namespace boost::bimaps;
32
33     typedef bimap<int,long> bm;
34
35     bm b;
36     b.insert( bm::value_type(2,200) );
37
38     BOOST_CHECK( b.left.at(2) == 200 );
39
40     bool result;
41
42     // replace
43     //----------------------------------------------------------------------
44
45     // successful replace in left map view
46     {
47         bm::left_iterator i = b.left.begin();
48
49         result = b.left.replace( i, bm::left_value_type(1,100) );
50
51         BOOST_CHECK( result );
52         BOOST_CHECK( b.size() == 1 );
53         BOOST_CHECK( i->first == 1 && i->second == 100 );
54         BOOST_CHECK( b.left.at(1) == 100 );
55
56         result = b.left.replace_key( i, 2 );
57
58         BOOST_CHECK( result );
59         BOOST_CHECK( b.size() == 1 );
60         BOOST_CHECK( i->first == 2 && i->second == 100 );
61         BOOST_CHECK( b.left.at(2) == 100 );
62
63         result = b.left.replace_data( i, 200 );
64
65         BOOST_CHECK( result );
66         BOOST_CHECK( b.size() == 1 );
67         BOOST_CHECK( i->first == 2 && i->second == 200 );
68         BOOST_CHECK( b.left.at(2) == 200 );
69     }
70
71     // successful replace in right map view
72     {
73         bm::right_iterator i = b.right.begin();
74
75         result = b.right.replace( i, bm::right_value_type(100,1) );
76
77         BOOST_CHECK( result );
78         BOOST_CHECK( b.size() == 1 );
79         BOOST_CHECK( i->first == 100 && i->second == 1 );
80         BOOST_CHECK( b.right.at(100) == 1 );
81
82         result = b.right.replace_key( i, 200 );
83
84         BOOST_CHECK( result );
85         BOOST_CHECK( b.size() == 1 );
86         BOOST_CHECK( i->first == 200 && i->second == 1 );
87         BOOST_CHECK( b.right.at(200) == 1 );
88
89         result = b.right.replace_data( i, 2 );
90
91         BOOST_CHECK( result );
92         BOOST_CHECK( b.size() == 1 );
93         BOOST_CHECK( i->first == 200 && i->second == 2 );
94         BOOST_CHECK( b.right.at(200) == 2 );
95     }
96
97     // successful replace in set of relations view
98     {
99         bm::iterator i = b.begin();
100
101         result = b.replace( i, bm::value_type(1,100) );
102
103         BOOST_CHECK( result );
104         BOOST_CHECK( b.size() == 1 );
105         BOOST_CHECK( i->left == 1 && i->right == 100 );
106         BOOST_CHECK( b.left.at(1) == 100 );
107
108         result = b.replace_left( i, 2 );
109
110         BOOST_CHECK( result );
111         BOOST_CHECK( b.size() == 1 );
112         BOOST_CHECK( i->left == 2 && i->right == 100 );
113         BOOST_CHECK( b.left.at(2) == 100 );
114
115         result = b.replace_right( b.begin(), 200 );
116
117         BOOST_CHECK( result );
118         BOOST_CHECK( b.size() == 1 );
119         BOOST_CHECK( i->left == 2 && i->right == 200 );
120         BOOST_CHECK( b.left.at(2) == 200 );
121
122     }
123
124     b.clear();
125     b.insert( bm::value_type(1,100) );
126     b.insert( bm::value_type(2,200) );
127
128     // fail to replace in left map view
129     {
130         bm::left_iterator i = b.left.begin();
131
132         result = b.left.replace( i, bm::left_value_type(2,100) );
133
134         BOOST_CHECK( ! result );
135         BOOST_CHECK( b.size() == 2 );
136         BOOST_CHECK( i->first == 1 && i->second == 100 );
137         BOOST_CHECK( b.left.at(1) == 100 );
138         BOOST_CHECK( b.left.at(2) == 200 );
139
140
141         // Add checks for replace_key and replace_data
142     }
143
144     // Add checks for fail to replace in right map view
145
146     // Add checks for fail to replace in set of relations view
147
148
149     // modify
150     // ----------------------------------------------------------------------
151
152     b.clear();
153     b.insert( bm::value_type(1,100) );
154
155     // successful modify in left map view
156     {
157         result = b.left.modify_key( b.left.begin(), _key = 2 );
158
159         BOOST_CHECK( result );
160         BOOST_CHECK( b.size() == 1 );
161         BOOST_CHECK( b.left.at(2) == 100 );
162
163         result = b.left.modify_data( b.left.begin() , _data = 200 );
164
165         BOOST_CHECK( result );
166         BOOST_CHECK( b.size() == 1 );
167         BOOST_CHECK( b.left.at(2) == 200 );
168     }
169
170     // Add checks for successful modify in right map view
171
172     // Add checks for fails to modify in left map view
173
174
175 }
176
177 void test_bimap_replace_with_info() 
178 {
179     using namespace boost::bimaps;
180     typedef bimap<int,long,with_info<int> > bm;
181
182     bm b;
183     b.insert( bm::value_type(2,200,-2) );
184
185     BOOST_CHECK( b.left.at(2)      == 200 );
186     BOOST_CHECK( b.left.info_at(2) ==  -2 );
187  
188     // Use set view
189     {
190         bm::iterator i = b.begin();
191
192         bool result = b.replace( i, bm::value_type(1,100,-1) );
193
194         BOOST_CHECK( result );
195         BOOST_CHECK( b.size() == 1 );
196         BOOST_CHECK( i->left == 1 && i->right == 100 );
197         BOOST_CHECK( i->info == -1 );
198         
199         result = b.replace_left( i, 2 );
200
201         BOOST_CHECK( result );
202         BOOST_CHECK( b.size() == 1 );
203         BOOST_CHECK( i->left == 2 && i->right == 100 );
204         BOOST_CHECK( i->info == -1 );
205         
206         result = b.replace_right( i, 200 );
207
208         BOOST_CHECK( result );
209         BOOST_CHECK( b.size() == 1 );
210         BOOST_CHECK( i->left == 2 && i->right == 200 );
211         BOOST_CHECK( i->info == -1 );
212     }
213
214     // Use map view
215     {
216         bm::left_iterator i = b.left.begin();
217
218         bool result = b.left.replace( i, bm::left_value_type(1,100,-1) );
219
220         BOOST_CHECK( result );
221         BOOST_CHECK( b.left.size() == 1 );
222         BOOST_CHECK( i->first == 1 && i->second == 100 );
223         BOOST_CHECK( i->info == -1 );
224         
225         result = b.left.replace_key( i, 2 );
226
227         BOOST_CHECK( result );
228         BOOST_CHECK( b.left.size() == 1 );
229         BOOST_CHECK( i->first == 2 && i->second == 100 );
230         BOOST_CHECK( i->info == -1 );
231         
232         result = b.left.replace_data( i, 200 );
233
234         BOOST_CHECK( result );
235         BOOST_CHECK( b.left.size() == 1 );
236         BOOST_CHECK( i->first == 2 && i->second == 200 );
237         BOOST_CHECK( i->info == -1 );
238     }
239 }
240
241 int test_main( int, char* [] )
242 {
243     test_bimap_modify();
244
245     test_bimap_replace_with_info();
246     
247     return 0;
248 }
249