|
1 /* Boost.MultiIndex test for special set operations. |
|
2 * |
|
3 * Copyright 2003-2005 Joaquín M López Muñoz. |
|
4 * Distributed under the Boost Software License, Version 1.0. |
|
5 * (See accompanying file LICENSE_1_0.txt or copy at |
|
6 * http://www.boost.org/LICENSE_1_0.txt) |
|
7 * |
|
8 * See http://www.boost.org/libs/multi_index for library home page. |
|
9 */ |
|
10 |
|
11 #include "test_special_set_ops.hpp" |
|
12 |
|
13 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */ |
|
14 #include <algorithm> |
|
15 #include <sstream> |
|
16 #include "pre_multi_index.hpp" |
|
17 #include "employee.hpp" |
|
18 #include <boost/test/test_tools.hpp> |
|
19 |
|
20 using namespace boost::multi_index; |
|
21 |
|
22 static int string_to_int(const std::string& str) |
|
23 { |
|
24 std::istringstream iss(str); |
|
25 int res = 0; |
|
26 iss>>res; |
|
27 return res; |
|
28 } |
|
29 |
|
30 struct comp_int_string |
|
31 { |
|
32 bool operator()(int x,const std::string& y)const |
|
33 { |
|
34 return x<string_to_int(y); |
|
35 } |
|
36 |
|
37 bool operator()(const std::string& x,int y)const |
|
38 { |
|
39 return string_to_int(x)<y; |
|
40 } |
|
41 }; |
|
42 |
|
43 struct hash_string_as_int |
|
44 { |
|
45 int operator()(const std::string& x)const |
|
46 { |
|
47 return boost::hash<int>()(string_to_int(x)); |
|
48 } |
|
49 }; |
|
50 |
|
51 struct eq_string_int |
|
52 { |
|
53 bool operator()(int x,const std::string& y)const |
|
54 { |
|
55 return x==string_to_int(y); |
|
56 } |
|
57 |
|
58 bool operator()(const std::string& x,int y)const |
|
59 { |
|
60 return operator()(y,x); |
|
61 } |
|
62 }; |
|
63 |
|
64 void test_special_set_ops() |
|
65 { |
|
66 employee_set es; |
|
67 |
|
68 es.insert(employee(0,"Joe",31,1123)); |
|
69 es.insert(employee(1,"Robert",27,5601)); |
|
70 es.insert(employee(2,"John",40,7889)); |
|
71 es.insert(employee(3,"Albert",20,9012)); |
|
72 es.insert(employee(4,"John",57,1002)); |
|
73 |
|
74 std::pair<employee_set_by_ssn::iterator,employee_set_by_ssn::iterator> p= |
|
75 get<ssn>(es).equal_range( |
|
76 "7889",hash_string_as_int(),eq_string_int()); |
|
77 |
|
78 BOOST_CHECK(std::distance(p.first,p.second)==1&&(p.first)->id==2); |
|
79 |
|
80 BOOST_CHECK( |
|
81 get<ssn>(es).count( |
|
82 "5601",hash_string_as_int(),eq_string_int())==1); |
|
83 |
|
84 BOOST_CHECK( |
|
85 get<ssn>(es).find( |
|
86 "1123",hash_string_as_int(),eq_string_int())->name=="Joe"); |
|
87 |
|
88 BOOST_CHECK( |
|
89 std::distance( |
|
90 get<age>(es).lower_bound("27",comp_int_string()), |
|
91 get<age>(es).upper_bound("40",comp_int_string()))==3); |
|
92 |
|
93 BOOST_CHECK(es.count(2,employee::comp_id())==1); |
|
94 BOOST_CHECK(es.count(5,employee::comp_id())==0); |
|
95 } |