Boost logo

Boost Users :

From: Boris (boriss_at_[hidden])
Date: 2007-02-22 19:54:03


struct employee {
   std::string name;
};

typedef multi_index_container<
   employee,
   indexed_by<
     hashed_unique<member<employee, std::string, &employee::name> >
>
> mi;

If I want to change the index to make it case-insensitive I have to write
my own key extractor, right? Would the following code then be correct (it
is based on boost::multi_index::member)?

template<class Class, std::string Class::*PtrToMember>
struct caseinsensitive_string
{
   typedef std::string result_type;

   template<typename ChainedPtr>
   std::string operator()(const ChainedPtr& x) const
   {
     return operator()(*x);
   }

   std::string operator()(const Class& x) const
   {
     return boost::algorithm::to_lower_copy(x.*PtrToMember);
   }

   std::string operator()(Class& x) const
   {
     return boost::algorithm::to_lower_copy(x.*PtrToMember);
   }

   std::string operator()(const boost::reference_wrapper<const Class>& x)
const
   {
     return operator()(x.get());
   }

   std::string operator()(const boost::reference_wrapper<Class> x) const
   {
     return operator()(x.get());
   }
};

With the following typedef I get a container which does not change the
name of an employee (I want to retain the name without making it lower- or
uppercase) but refuses items with the same case-insensitive name?

typedef multi_index_container<
   employee,
   indexed_by<
     hashed_unique<caseinsensitive_string<employee, &employee::name> >
>
> mi2;

Boris


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net