stdcpp/tsrc/Boost_test/multi_index/src/test_special_set_ops.cpp
changeset 31 ce057bb09d0b
child 45 4b03adbd26ca
equal deleted inserted replaced
30:e20de85af2ee 31:ce057bb09d0b
       
     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 }