$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] Multi Index: Nested std::pair
From: Etienne Philip Pretorius (icewolfhunter_at_[hidden])
Date: 2009-04-26 12:57:52
JOAQUIN M. LOPEZ MUÑOZ wrote:
> ________________________________________
> De: boost-users-bounces_at_[hidden] [boost-users-bounces_at_[hidden]] En nombre de Etienne Philip Pretorius [icewolfhunter_at_[hidden]]
> Enviado el: domingo, 26 de abril de 2009 16:17
> Para: boost-users_at_[hidden]
> Asunto: Re: [Boost-users] Multi Index: Nested std::pair
> 
> JOAQUIN M. LOPEZ MUÑOZ wrote:
> 
>>> First of all, you're defining a multi_index_container of *lists*,
>>> i.e. each element of the container is a list of triplets (value,x,y).
>>> Is this what you really meant, or maybe the std::list part has to be
>>> dropped?
>> Thank you. Yes, I'll drop the list. Each element should only be (value,x,y);
> 
> OK, let's analyze the problem then. For the sake of brevity we
> first introduce the following typedef:
> 
>   typedef std::pair<
>       /*value*/
>       unsigned char,
>       std::pair<
>           /*x co-ordinate*/
>           unsigned char,
>           /*y co-ordinate*/
>           unsigned char
>      >
>   > value_type;
> 
> The value extractor can be specified using boost::multi_index::member:
> 
>   boost::multi_index::member<
>       value_type,
>       unsigned char,
>       &value_type::first
>   >
> 
> As for x and y, there is no way to do it with predefined extractors and we
> have to write our own custom key extractor (http://tinyurl.com/dafk2f ):
> 
>   struct x_extractor
>   {
>       typedef unsigned char result_type;
>       result_type operator()(const value_type& x)const
>       {
>           return x.second.first;
>       }
>   };
> 
>   struct y_extractor
>   {
>       typedef unsigned char result_type;
>       result_type operator()(const value_type& x)const
>       {
>           return x.second.second;
>       }
>   };
> 
> So the final declaration looks like this:
> 
>   boost::multi_index_container<
>       value_type,
>       boost::multi_index::indexed_by<
>           /*value*/
>           boost::multi_index::ordered_non_unique<
>               boost::multi_index::member<
>                   value_type,
>                   unsigned char,
>                   &value_type::first
>               >
>           >,
>           /*x co-ordinate*/
>           boost::multi_index::ordered_non_unique<x_extractor>,
>           /*y co-ordinate*/
>           boost::multi_index::ordered_non_unique<y_extractor>
>       >
>   > m;
> 
> Nevertheless, I don't see any good reason why you have to define
> your elements using such a convoluted combination of std::pairs.
> You can have it in a more user friendly way, say:
> 
>   struct value_type
>   {
>       value_type(unsigned char value,unsigned char x,unsigned char y):
>           value(value),x(x),y(y){}
>       unsigned char value;
>       unsigned char x;
>       unsigned char y;
>   };
> 
> which allows us you to define your multi_index_container without
> resorting to custom key extractors:
> 
>   boost::multi_index_container<
>       value_type,
>       boost::multi_index::indexed_by<
>           /*value*/
>           boost::multi_index::ordered_non_unique<
>               boost::multi_index::member<
>                   value_type,
>                   unsigned char,
>                   &value_type::value
>               >
>           >,
>           /*x co-ordinate*/
>           boost::multi_index::ordered_non_unique<
>               boost::multi_index::member<
>                   value_type,
>                   unsigned char,
>                   &value_type::x
>               >
>           >,
>           /*y co-ordinate*/
>           boost::multi_index::ordered_non_unique<
>               boost::multi_index::member<
>                   value_type,
>                   unsigned char,
>                   &value_type::y
>               >
>           >
>       >
>   > m;
> 
> HTH.
> 
> Joaquín M López Muñoz
> Telefónica, Investigación y Desarrollo
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://listarchives.boost.org/mailman/listinfo.cgi/boost-users
Thank you!
It is starting to make sense. Just what I needed :).
Etienne