1 |
|
---|
2 |
|
---|
3 | #include <string>
|
---|
4 | #include <boost/multi_index_container.hpp>
|
---|
5 | #include <boost/multi_index/hashed_index.hpp>
|
---|
6 | #include <boost/multi_index/ordered_index.hpp>
|
---|
7 | #include <boost/multi_index/identity.hpp>
|
---|
8 | #include <boost/multi_index/member.hpp>
|
---|
9 |
|
---|
10 | using boost::multi_index_container;
|
---|
11 | using namespace boost::multi_index;
|
---|
12 |
|
---|
13 | struct employee
|
---|
14 | {
|
---|
15 | int id;
|
---|
16 | std::string name;
|
---|
17 | int ssnumber;
|
---|
18 |
|
---|
19 | employee(int id,const std::string& name,int ssnumber):
|
---|
20 | id(id),name(name),ssnumber(ssnumber){}
|
---|
21 |
|
---|
22 | bool operator<(const employee& e)const{return id<e.id;}
|
---|
23 | };
|
---|
24 |
|
---|
25 | struct ustring_hasher {
|
---|
26 |
|
---|
27 | std::size_t operator ()(std::string const& wstr) const {
|
---|
28 | boost::hash<std::string> hasher;
|
---|
29 | return hasher(wstr);
|
---|
30 | }
|
---|
31 | };
|
---|
32 |
|
---|
33 | struct name{} ; // just for boost tags
|
---|
34 |
|
---|
35 | typedef multi_index_container<
|
---|
36 | employee,
|
---|
37 | indexed_by<
|
---|
38 | // hashed on name
|
---|
39 | hashed_unique<tag<name>, member<employee,std::string,&employee::name>, ustring_hasher >
|
---|
40 | >
|
---|
41 | > employee_set;
|
---|
42 |
|
---|
43 | typedef employee_set::index<name>::type employee_set_by_name;
|
---|
44 |
|
---|
45 |
|
---|
46 | #define StrConst1 "Foobar!@##$%%^&Yavapai@QuuxQUUX@@27"
|
---|
47 | #define StrConst2 "CabbagesAndTurnips$haveDrivenMeAway"
|
---|
48 |
|
---|
49 | class UT_Boost {
|
---|
50 | public:
|
---|
51 | virtual void Run() { testBasic(); }
|
---|
52 |
|
---|
53 | protected:
|
---|
54 | void testBasic() {
|
---|
55 | employee_set testSet;
|
---|
56 | std::string s(StrConst1);
|
---|
57 | employee e1(1, s, 100);
|
---|
58 | testSet.insert(e1);
|
---|
59 |
|
---|
60 | s = std::string(StrConst2);
|
---|
61 | employee e2(2, s, 101);
|
---|
62 | testSet.insert(e2);
|
---|
63 |
|
---|
64 | employee_set_by_name& name_index = testSet.get<name>();
|
---|
65 |
|
---|
66 | s = std::string(StrConst1);
|
---|
67 |
|
---|
68 | employee_set::index_iterator<name>::type it = name_index.find(s);
|
---|
69 | BT_TEST_CONDITION(it != testSet.end());
|
---|
70 | BT_TEST_CONDITION(it->id == 1);
|
---|
71 |
|
---|
72 | s = std::string("Hello There");
|
---|
73 | it = name_index.find(s);
|
---|
74 | BT_TEST_CONDITION(it == testSet.end());
|
---|
75 |
|
---|
76 | }
|
---|
77 | };
|
---|
78 |
|
---|