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? Thanks, Gokul.
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: #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 > {}; /* 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<identity<int> >, ordered_non_unique<identity<int> >, hashed_unique<identity<int> >, hashed_non_unique<identity<int> >, sequenced<> >
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>)); int main(){} HTH, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo
On Fri, Jul 30, 2010 at 7:49 PM, <joaquin@tid.es> 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? Thanks, Gokul.
Gokulakannan Somasundaram escribió:
On Fri, Jul 30, 2010 at 7:49 PM, <joaquin@tid.es <mailto:joaquin@tid.es>> 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
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@tid.es> wrote:
Gokulakannan Somasundaram escribió:
On Fri, Jul 30, 2010 at 7:49 PM, <joaquin@tid.es <mailto:joaquin@tid.es>> 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@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Gokulakannan Somasundaram
-
joaquin@tid.es