| 1 | /* Boost.MultiIndex test for modifier memfuns. |
|---|
| 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_modifiers.hpp" |
|---|
| 12 | |
|---|
| 13 | #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */ |
|---|
| 14 | #include <vector> |
|---|
| 15 | #include "pre_multi_index.hpp" |
|---|
| 16 | #include "employee.hpp" |
|---|
| 17 | #include <boost/test/test_tools.hpp> |
|---|
| 18 | |
|---|
| 19 | using namespace boost::multi_index; |
|---|
| 20 | |
|---|
| 21 | void test_modifiers() |
|---|
| 22 | { |
|---|
| 23 | employee_set es; |
|---|
| 24 | employee_set_by_name& i1=get<name>(es); |
|---|
| 25 | employee_set_by_age& i2=get<age>(es); |
|---|
| 26 | employee_set_as_inserted& i3=get<as_inserted>(es); |
|---|
| 27 | employee_set_by_ssn& i4=get<ssn>(es); |
|---|
| 28 | |
|---|
| 29 | es.insert(employee(0,"Joe",31,1123)); |
|---|
| 30 | BOOST_CHECK(es.insert(employee(0,"Joe",31,1123)).second==false); |
|---|
| 31 | BOOST_CHECK(i1.insert(employee(0,"Joe Jr.",5,2563)).second==false); |
|---|
| 32 | BOOST_CHECK(i2.insert(employee(1,"Victor",5,1123)).second==false); |
|---|
| 33 | BOOST_CHECK(i3.insert(i3.begin(),employee(1,"Victor",5,1123)).second |
|---|
| 34 | ==false); |
|---|
| 35 | BOOST_CHECK(i3.push_front(employee(0,"Joe Jr.",5,2563)).second==false); |
|---|
| 36 | BOOST_CHECK(i3.push_back(employee(0,"Joe Jr.",5,2563)).second==false); |
|---|
| 37 | |
|---|
| 38 | employee_set_by_name::iterator it1=i1.find("Joe"); |
|---|
| 39 | i1.insert(it1,employee(1,"Joe Jr.",5,2563)); |
|---|
| 40 | BOOST_CHECK(es.size()==2); |
|---|
| 41 | |
|---|
| 42 | employee_set_by_age::iterator it2=i2.find(31); |
|---|
| 43 | i2.insert(it2,employee(2,"Grandda Joe",64,7881)); |
|---|
| 44 | BOOST_CHECK(es.size()==3); |
|---|
| 45 | |
|---|
| 46 | employee_set_as_inserted::iterator it3=i3.begin(); |
|---|
| 47 | i3.insert(it3,100,employee(3,"Judy",39,6201)); |
|---|
| 48 | BOOST_CHECK(es.size()==4); |
|---|
| 49 | |
|---|
| 50 | es.erase(employee(1,"Joe Jr.",5,2563)); |
|---|
| 51 | BOOST_CHECK(i2.size()==3&&i3.size()==3); |
|---|
| 52 | |
|---|
| 53 | BOOST_CHECK(i1.erase("Judy")==1); |
|---|
| 54 | BOOST_CHECK(es.size()==2&&i2.size()==2); |
|---|
| 55 | |
|---|
| 56 | BOOST_CHECK(i2.erase(it2)->age==64); |
|---|
| 57 | BOOST_CHECK(es.size()==1&&i1.size()==1); |
|---|
| 58 | |
|---|
| 59 | i3.pop_front(); |
|---|
| 60 | BOOST_CHECK(es.size()==0&&i2.size()==0); |
|---|
| 61 | |
|---|
| 62 | es.insert(employee(0,"Joe",31,1123)); |
|---|
| 63 | BOOST_CHECK(i1.erase(i1.begin())==i1.end()); |
|---|
| 64 | BOOST_CHECK(i1.size()==0); |
|---|
| 65 | |
|---|
| 66 | es.insert(employee(0,"Joe",31,1123)); |
|---|
| 67 | es.insert(employee(1,"Jack",31,5032)); |
|---|
| 68 | BOOST_CHECK(i2.erase(31)==2); |
|---|
| 69 | BOOST_CHECK(i2.size()==0); |
|---|
| 70 | |
|---|
| 71 | i3.push_front(employee(1,"Jack",31,5032)); |
|---|
| 72 | i3.push_back(employee(0,"Joe",31,1123)); |
|---|
| 73 | BOOST_CHECK(i3.front()==employee(1,"Jack",31,5032)); |
|---|
| 74 | BOOST_CHECK(i3.back()==employee(0,"Joe",31,1123)); |
|---|
| 75 | |
|---|
| 76 | i3.pop_back(); |
|---|
| 77 | BOOST_CHECK(i3.back()==employee(1,"Jack",31,5032)); |
|---|
| 78 | BOOST_CHECK(es.size()==1); |
|---|
| 79 | |
|---|
| 80 | i3.pop_front(); |
|---|
| 81 | BOOST_CHECK(es.size()==0); |
|---|
| 82 | |
|---|
| 83 | std::vector<employee> ve; |
|---|
| 84 | ve.push_back(employee(3,"Anna",31,5388)); |
|---|
| 85 | ve.push_back(employee(1,"Rachel",27,9012)); |
|---|
| 86 | ve.push_back(employee(2,"Agatha",40,1520)); |
|---|
| 87 | |
|---|
| 88 | i1.insert(ve.begin(),ve.end()); |
|---|
| 89 | BOOST_CHECK(i2.size()==3); |
|---|
| 90 | |
|---|
| 91 | BOOST_CHECK(i4.erase(i4.begin(),i4.end())==i4.end()); |
|---|
| 92 | BOOST_CHECK(es.size()==0); |
|---|
| 93 | |
|---|
| 94 | i2.insert(ve.begin(),ve.end()); |
|---|
| 95 | BOOST_CHECK(i3.size()==3); |
|---|
| 96 | |
|---|
| 97 | BOOST_CHECK(*(i3.erase(i3.begin()))==employee(1,"Rachel",27,9012)); |
|---|
| 98 | BOOST_CHECK(i3.erase(i3.begin(),i3.end())==i3.end()); |
|---|
| 99 | BOOST_CHECK(es.size()==0); |
|---|
| 100 | |
|---|
| 101 | i3.insert(i3.end(),ve.begin(),ve.end()); |
|---|
| 102 | BOOST_CHECK(es.size()==3); |
|---|
| 103 | |
|---|
| 104 | BOOST_CHECK(es.erase(es.begin(),es.end())==es.end()); |
|---|
| 105 | BOOST_CHECK(i2.size()==0); |
|---|
| 106 | |
|---|
| 107 | es.insert(employee(0,"Joe",31,1123)); |
|---|
| 108 | es.insert(employee(1,"Robert",27,5601)); |
|---|
| 109 | es.insert(employee(2,"John",40,7889)); |
|---|
| 110 | es.insert(employee(3,"Albert",20,9012)); |
|---|
| 111 | es.insert(employee(4,"John",57,1002)); |
|---|
| 112 | |
|---|
| 113 | employee_set es_backup(es); |
|---|
| 114 | |
|---|
| 115 | employee_set es2; |
|---|
| 116 | es2.insert(employee(3,"Anna",31,5388)); |
|---|
| 117 | es2.insert(employee(1,"Rachel",27,9012)); |
|---|
| 118 | es2.insert(employee(2,"Agatha",40,1520)); |
|---|
| 119 | |
|---|
| 120 | employee_set es2_backup(es2); |
|---|
| 121 | |
|---|
| 122 | i1.swap(get<1>(es2)); |
|---|
| 123 | BOOST_CHECK(es==es2_backup&&es2==es_backup); |
|---|
| 124 | |
|---|
| 125 | i2.swap(get<2>(es2)); |
|---|
| 126 | BOOST_CHECK(es==es_backup&&es2==es2_backup); |
|---|
| 127 | |
|---|
| 128 | i3.swap(get<3>(es2)); |
|---|
| 129 | BOOST_CHECK(es==es2_backup&&es2==es_backup); |
|---|
| 130 | |
|---|
| 131 | #if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) |
|---|
| 132 | ::boost::multi_index::detail::swap(i1,get<1>(es2)); |
|---|
| 133 | #else |
|---|
| 134 | using std::swap; |
|---|
| 135 | swap(i1,get<1>(es2)); |
|---|
| 136 | #endif |
|---|
| 137 | |
|---|
| 138 | BOOST_CHECK(es==es_backup&&es2==es2_backup); |
|---|
| 139 | |
|---|
| 140 | #if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) |
|---|
| 141 | ::boost::multi_index::detail::swap(i2,get<2>(es2)); |
|---|
| 142 | #else |
|---|
| 143 | using std::swap; |
|---|
| 144 | swap(i2,get<2>(es2)); |
|---|
| 145 | #endif |
|---|
| 146 | |
|---|
| 147 | BOOST_CHECK(es==es2_backup&&es2==es_backup); |
|---|
| 148 | |
|---|
| 149 | #if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) |
|---|
| 150 | ::boost::multi_index::detail::swap(i3,get<3>(es2)); |
|---|
| 151 | #else |
|---|
| 152 | using std::swap; |
|---|
| 153 | swap(i3,get<3>(es2)); |
|---|
| 154 | #endif |
|---|
| 155 | |
|---|
| 156 | BOOST_CHECK(es==es_backup&&es2==es2_backup); |
|---|
| 157 | |
|---|
| 158 | i3.clear(); |
|---|
| 159 | BOOST_CHECK(i3.size()==0); |
|---|
| 160 | |
|---|
| 161 | es=es2; |
|---|
| 162 | i4.clear(); |
|---|
| 163 | BOOST_CHECK(i4.size()==0); |
|---|
| 164 | |
|---|
| 165 | es2.clear(); |
|---|
| 166 | BOOST_CHECK(es2.size()==0); |
|---|
| 167 | } |
|---|