|
Boost Users : |
Subject: Re: [Boost-users] A doubt in Boost multi index
From: Gokulakannan Somasundaram (gokul007_at_[hidden])
Date: 2010-07-30 09:24:51
Thanks a lot. I could make sense of your first one with some difficulty.
I am trying to understand the next one. Anyways, i will just use it as
template to solve my problem.
Thanks,
Gokul.
On Fri, Jul 30, 2010 at 8:35 PM, <joaquin_at_[hidden]> wrote:
> Gokulakannan Somasundaram escribió:
>
>
>>
>> On Fri, Jul 30, 2010 at 7:49 PM, <joaquin_at_[hidden] <mailto:joaquin_at_[hidden]>>
>> wrote:
>>
>> Gokulakannan Somasundaram escribió:
>>
>> Hi,
>> In boost multi-index, can i verify whether a particular
>> index type is
>> ordered/not or not through meta programming? There are the
>> ordered
>> indexes, hash indexes, sequence indexes etc. Can i find them out
>> through meta programming?
>>
>>
>> You can if you're given the multi_index_containr type and the position
>> of the index:
>>
>>
>> Thanks a lot. Is it possible to do the same with named tags?
>>
>>
> With a little more effort:
>
>
> #include <boost/multi_index/ordered_index.hpp>
> #include <boost/mpl/at.hpp>
> #include <boost/mpl/bool.hpp>
>
> template<typename IndexSpecifier>
> struct is_ordered_index_impl:boost::mpl::false_{};
>
> template<typename KeyFromValue,typename Compare>
> struct is_ordered_index_impl<
> boost::multi_index::ordered_unique<KeyFromValue,Compare>
> >:boost::mpl::true_{};
>
> template<typename KeyFromValue,typename Compare>
> struct is_ordered_index_impl<
> boost::multi_index::ordered_non_unique<KeyFromValue,Compare>
> >:boost::mpl::true_{};
>
> template<typename MultiIndexContainer,int N>
> struct is_ordered_index:
> is_ordered_index_impl<
> typename boost::mpl::at_c<
> typename MultiIndexContainer::index_specifier_type_list,
> N
> >::type
> >
> {};
>
> #include <boost/mpl/begin_end.hpp>
> #include <boost/mpl/contains.hpp>
> #include <boost/mpl/distance.hpp>
> #include <boost/mpl/find_if.hpp>
>
> template<typename Index>
> struct tag_list
> {
> typedef typename Index::tag_list type;
> };
>
> template<typename Tag,typename IndexList>
> struct tag_pos:
> boost::mpl::distance<
> typename boost::mpl::begin<IndexList>::type,
> typename boost::mpl::find_if<
> IndexList,
> boost::mpl::contains<tag_list<boost::mpl::_>,Tag>
> >::type
> >
> {};
>
> template<typename MultiIndexContainer,typename Tag>
> struct is_ordered_index_with_tag:
> is_ordered_index<
> MultiIndexContainer,
> tag_pos<Tag,typename MultiIndexContainer::index_type_list>::value
>
> >
> {};
>
>
> /* testing */
>
> #include <boost/multi_index_container.hpp>
> #include <boost/multi_index/sequenced_index.hpp>
> #include <boost/multi_index/hashed_index.hpp>
> #include <boost/multi_index/identity.hpp>
> #include <boost/mpl/assert.hpp>
>
> using namespace boost::multi_index;
>
> typedef multi_index_container<
> int,
> indexed_by<
> ordered_unique<tag<struct i0>,identity<int> >,
> ordered_non_unique<tag<struct i1>, identity<int> >,
> hashed_unique<tag<struct i2>, identity<int> >,
> hashed_non_unique<tag<struct i3>, identity<int> >,
> sequenced<tag<struct i4> >
>
> >
> > multi_t;
>
> BOOST_MPL_ASSERT ((is_ordered_index<multi_t,0>));
> BOOST_MPL_ASSERT ((is_ordered_index<multi_t,1>));
> BOOST_MPL_ASSERT_NOT((is_ordered_index<multi_t,2>));
> BOOST_MPL_ASSERT_NOT((is_ordered_index<multi_t,3>));
> BOOST_MPL_ASSERT_NOT((is_ordered_index<multi_t,4>));
>
> BOOST_MPL_ASSERT ((is_ordered_index_with_tag<multi_t,i0>));
> BOOST_MPL_ASSERT ((is_ordered_index_with_tag<multi_t,i1>));
> BOOST_MPL_ASSERT_NOT((is_ordered_index_with_tag<multi_t,i2>));
> BOOST_MPL_ASSERT_NOT((is_ordered_index_with_tag<multi_t,i3>));
> BOOST_MPL_ASSERT_NOT((is_ordered_index_with_tag<multi_t,i4>));
>
> int main(){}
>
>
> Joaquín M López Muñoz
> Telefónica, Investigación y Desarrollo
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
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