///////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2013-2013 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/intrusive for documentation. // ///////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include #include "smart_ptr.hpp" #include //std::greater/std::less using namespace boost::intrusive; struct my_tag; template class MyClass : public make_list_base_hook < void_pointer, link_mode >::type , public make_slist_base_hook < void_pointer, link_mode >::type , public make_set_base_hook < void_pointer, link_mode >::type , public make_unordered_set_base_hook < void_pointer, link_mode >::type , public make_avl_set_base_hook < void_pointer, link_mode >::type , public make_bs_set_base_hook < void_pointer, link_mode >::type { int int_; public: MyClass(int i) : int_(i) {} friend bool operator<(const MyClass &l, const MyClass &r) { return l.int_ < r.int_; } friend bool operator==(const MyClass &l, const MyClass &r) { return l.int_ == r.int_; } friend std::size_t hash_value(const MyClass &v) { return boost::hash_value(v.int_); } friend bool priority_order(const MyClass &l, const MyClass &r) { return l.int_ < r.int_; } }; template struct inverse_priority { bool operator()(const T &l, const T &r) { return l.int_ > r.int_; } }; template struct inverse_hash { bool operator()(const T &l) { return hash_value(l); } }; template struct alternative_equal { bool operator()(const T &l, const T &r) { return l.int_ == r.int_; } }; int main() { //////////// // list //////////// BOOST_STATIC_ASSERT((!detail::is_same< list >::iterator , list >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< list, constant_time_size >::iterator , list, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< list >::iterator , list > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< list, size_type >::iterator , list, size_type >::iterator >::value)); //////////// // slist //////////// BOOST_STATIC_ASSERT((!detail::is_same< slist >::iterator , slist >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< slist, constant_time_size >::iterator , slist, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< slist >::iterator , slist > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< slist, size_type >::iterator , slist, size_type >::iterator >::value)); //cache_last does not change iterator BOOST_STATIC_ASSERT((detail::is_same< slist, cache_last >::iterator , slist, cache_last >::iterator >::value)); //linear does not change iterator BOOST_STATIC_ASSERT((detail::is_same< slist, linear >::iterator , slist, linear >::iterator >::value)); //////////// // set //////////// BOOST_STATIC_ASSERT((!detail::is_same< set >::iterator , set >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< set, constant_time_size >::iterator , set, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< set >::iterator , set > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< set, size_type >::iterator , set, size_type >::iterator >::value)); //compare does not change iterator BOOST_STATIC_ASSERT((detail::is_same< set, compare< std::greater > > >::iterator , set, compare< std::less > > >::iterator >::value)); //////////// // avl_set //////////// BOOST_STATIC_ASSERT((!detail::is_same< avl_set >::iterator , avl_set >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< avl_set, constant_time_size >::iterator , avl_set, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< avl_set >::iterator , avl_set > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< avl_set, size_type >::iterator , avl_set, size_type >::iterator >::value)); //compare does not change iterator BOOST_STATIC_ASSERT((detail::is_same< avl_set, compare< std::greater > > >::iterator , avl_set, compare< std::less > > >::iterator >::value)); //////////// // sg_set //////////// BOOST_STATIC_ASSERT((!detail::is_same< sg_set >::iterator , sg_set >::const_iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< sg_set >::iterator , sg_set > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< sg_set, size_type >::iterator , sg_set, size_type >::iterator >::value)); //compare does not change iterator BOOST_STATIC_ASSERT((detail::is_same< sg_set, compare< std::greater > > >::iterator , sg_set, compare< std::less > > >::iterator >::value)); //floating_point does not change iterator BOOST_STATIC_ASSERT((detail::is_same< sg_set, floating_point >::iterator , sg_set, floating_point >::iterator >::value)); //////////// // bs_set //////////// BOOST_STATIC_ASSERT((!detail::is_same< bs_set >::iterator , bs_set >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< bs_set, constant_time_size >::iterator , bs_set, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< bs_set >::iterator , bs_set > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< bs_set, size_type >::iterator , bs_set, size_type >::iterator >::value)); //compare does not change iterator BOOST_STATIC_ASSERT((detail::is_same< bs_set, compare< std::greater > > >::iterator , bs_set, compare< std::less > > >::iterator >::value)); //////////// // splay_set //////////// BOOST_STATIC_ASSERT((!detail::is_same< splay_set >::iterator , splay_set >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< splay_set, constant_time_size >::iterator , splay_set, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< splay_set >::iterator , splay_set > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< splay_set, size_type >::iterator , splay_set, size_type >::iterator >::value)); //compare does not change iterator BOOST_STATIC_ASSERT((detail::is_same< splay_set, compare< std::greater > > >::iterator , splay_set, compare< std::less > > >::iterator >::value)); //////////// // treap_set //////////// BOOST_STATIC_ASSERT((!detail::is_same< treap_set >::iterator , treap_set >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< treap_set, constant_time_size >::iterator , treap_set, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< treap_set >::iterator , treap_set > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< treap_set, size_type >::iterator , treap_set, size_type >::iterator >::value)); //compare does not change iterator BOOST_STATIC_ASSERT((detail::is_same< treap_set, compare< std::greater > > >::iterator , treap_set, compare< std::less > > >::iterator >::value)); //priority does not change iterator BOOST_STATIC_ASSERT((detail::is_same< treap_set >::iterator , treap_set, priority< inverse_priority > > >::iterator >::value)); ////////////// // common tree ////////////// BOOST_STATIC_ASSERT((detail::is_same< bs_set >::iterator , sg_set >::iterator >::value)); BOOST_STATIC_ASSERT((detail::is_same< bs_set >::iterator , treap_set >::iterator >::value)); BOOST_STATIC_ASSERT((detail::is_same< bs_set >::iterator , splay_set >::iterator >::value)); //////////// // unordered_set //////////// BOOST_STATIC_ASSERT((!detail::is_same< unordered_set >::iterator , unordered_set >::const_iterator >::value)); //constant_time_size does not change iterator BOOST_STATIC_ASSERT((detail::is_same< unordered_set, constant_time_size >::iterator , unordered_set, constant_time_size >::iterator >::value)); //void_pointer does change iterator BOOST_STATIC_ASSERT((!detail::is_same< unordered_set >::iterator , unordered_set > >::iterator >::value)); //size_type does not change iterator BOOST_STATIC_ASSERT((detail::is_same< unordered_set, size_type >::iterator , unordered_set, size_type >::iterator >::value)); //hash does not change iterator BOOST_STATIC_ASSERT((detail::is_same< unordered_set >::iterator , unordered_set, hash< inverse_hash > > >::iterator >::value)); //equal does not change iterator BOOST_STATIC_ASSERT((detail::is_same< unordered_set >::iterator , unordered_set, equal< alternative_equal > > >::iterator >::value)); //power_2_buckets does not change iterator BOOST_STATIC_ASSERT((detail::is_same< unordered_set >::iterator , unordered_set, power_2_buckets >::iterator >::value)); //cache_begin does not change iterator BOOST_STATIC_ASSERT((detail::is_same< unordered_set >::iterator , unordered_set, cache_begin >::iterator >::value)); return 0; }