///////////////////////////////////////////////////////////////////////////// // // (C) Copyright Olaf Krzikalla 2004-2006. // (C) Copyright Ion Gaztanaga 2006-2007. // // 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. // ///////////////////////////////////////////////////////////////////////////// #ifndef BOOST_INTRUSIVE_DETAIL_ITESTVALUE_HPP #define BOOST_INTRUSIVE_DETAIL_ITESTVALUE_HPP #include #include #include #include #include #include #include #include #include #include #include "smart_ptr.hpp" namespace boost{ namespace intrusive{ struct my_tag; template struct set_base_hook_type { typedef set_base_hook > type; }; template struct set_auto_base_hook_type { typedef set_base_hook, void_pointer, tag, optimize_size > type; }; template struct set_member_hook_type { typedef set_member_hook, optimize_size > type; }; template struct set_auto_member_hook_type { typedef set_member_hook, void_pointer > type; }; template struct splay_set_base_hook_type { typedef splay_set_base_hook > type; }; template struct splay_set_auto_base_hook_type { typedef splay_set_base_hook, void_pointer, tag > type; }; template struct splay_set_member_hook_type { typedef splay_set_member_hook > type; }; template struct splay_set_auto_member_hook_type { typedef splay_set_member_hook, void_pointer > type; }; template struct bs_set_base_hook_type { typedef bs_set_base_hook > type; }; template struct bs_set_member_hook_type { typedef bs_set_member_hook > type; }; template struct avl_set_base_hook_type { typedef avl_set_base_hook > type; }; template struct avl_set_auto_base_hook_type { typedef avl_set_base_hook, void_pointer, tag, optimize_size > type; }; template struct avl_set_member_hook_type { typedef avl_set_member_hook, optimize_size > type; }; template struct avl_set_auto_member_hook_type { typedef avl_set_member_hook, void_pointer > type; }; template struct list_base_hook_type { typedef list_base_hook > type; }; template struct list_auto_base_hook_type { typedef list_base_hook, void_pointer, tag > type; }; template struct list_member_hook_type { typedef list_member_hook > type; }; template struct list_auto_member_hook_type { typedef list_member_hook, void_pointer > type; }; template struct slist_base_hook_type { typedef slist_base_hook > type; }; template struct slist_auto_base_hook_type { typedef slist_base_hook, void_pointer, tag > type; }; template struct slist_member_hook_type { typedef slist_member_hook > type; }; template struct slist_auto_member_hook_type { typedef slist_member_hook, void_pointer > type; }; template struct uset_base_hook_type { typedef unordered_set_base_hook > type; }; template struct uset_auto_base_hook_type { typedef unordered_set_base_hook < link_mode, void_pointer , tag, store_hash > type; }; template struct uset_member_hook_type { typedef unordered_set_member_hook > type; }; template struct uset_auto_member_hook_type { typedef unordered_set_member_hook < link_mode, void_pointer , store_hash > type; }; template struct testvalue : set_base_hook_type::type , set_auto_base_hook_type::type , splay_set_base_hook_type::type , splay_set_auto_base_hook_type::type , bs_set_base_hook_type::type , avl_set_base_hook_type::type , avl_set_auto_base_hook_type::type , list_base_hook_type::type , list_auto_base_hook_type::type , slist_base_hook_type::type , slist_auto_base_hook_type::type , uset_base_hook_type::type , uset_auto_base_hook_type::type { typedef typename set_auto_base_hook_type::type set_auto_base_hook_t; typedef typename set_base_hook_type::type set_base_hook_t; typedef typename set_auto_member_hook_type::type set_auto_member_hook_t; typedef typename set_member_hook_type::type set_member_hook_t; typedef typename splay_set_auto_base_hook_type::type splay_set_auto_base_hook_t; typedef typename splay_set_base_hook_type::type splay_set_base_hook_t; typedef typename splay_set_auto_member_hook_type::type splay_set_auto_member_hook_t; typedef typename splay_set_member_hook_type::type splay_set_member_hook_t; typedef typename bs_set_base_hook_type::type bs_set_base_hook_t; typedef typename bs_set_member_hook_type::type bs_set_member_hook_t; typedef typename avl_set_auto_base_hook_type::type avl_set_auto_base_hook_t; typedef typename avl_set_base_hook_type::type avl_set_base_hook_t; typedef typename avl_set_auto_member_hook_type::type avl_set_auto_member_hook_t; typedef typename avl_set_member_hook_type::type avl_set_member_hook_t; typedef typename uset_auto_base_hook_type::type unordered_set_auto_base_hook_t; typedef typename uset_base_hook_type::type unordered_set_base_hook_t; typedef typename uset_auto_member_hook_type::type unordered_set_auto_member_hook_t; typedef typename uset_member_hook_type::type unordered_set_member_hook_t; typedef typename list_auto_base_hook_type::type list_auto_base_hook_t; typedef typename list_base_hook_type::type list_base_hook_t; typedef typename list_auto_member_hook_type::type list_auto_member_hook_t; typedef typename list_member_hook_type::type list_member_hook_t; typedef typename slist_auto_base_hook_type::type slist_auto_base_hook_t; typedef typename slist_base_hook_type::type slist_base_hook_t; typedef typename slist_auto_member_hook_type::type slist_auto_member_hook_t; typedef typename slist_member_hook_type::type slist_member_hook_t; //Set members set_member_hook_t set_node_; set_auto_member_hook_t set_auto_node_; //SplaySet members splay_set_member_hook_t splay_set_node_; splay_set_auto_member_hook_t splay_set_auto_node_; //ScapegoatSet members bs_set_member_hook_t sg_set_node_; //AvlSet members avl_set_member_hook_t avl_set_node_; avl_set_auto_member_hook_t avl_set_auto_node_; //Unordered set members unordered_set_member_hook_t unordered_set_node_; unordered_set_auto_member_hook_t unordered_set_auto_node_; //List members list_member_hook_t list_node_; list_auto_member_hook_t list_auto_node_; //Slist members slist_member_hook_t slist_node_; slist_auto_member_hook_t slist_auto_node_; int value_; static const bool constant_time_size = ConstantTimeSize; testvalue() {} testvalue(int i) : value_(i) {} testvalue (const testvalue& src) : value_ (src.value_) {} // testvalue is used in std::vector and thus prev and next // have to be handled appropriately when copied: testvalue & operator= (const testvalue& src) {/* set_base_hook_t::operator=(src); set_auto_base_hook_t::operator=(src); this->set_node_ = src.set_node_; this->set_auto_node_ = src.set_auto_node_; splay_set_base_hook_t::operator=(src); splay_set_auto_base_hook_t::operator=(src); this->splay_set_node_ = src.splay_set_node_; this->splay_set_auto_node_ = src.splay_set_auto_node_; bs_set_base_hook_t::operator=(src); this->sg_set_node_ = src.sg_set_node_; avl_set_base_hook_t::operator=(src); avl_set_auto_base_hook_t::operator=(src); this->avl_set_node_ = src.avl_set_node_; this->avl_set_auto_node_ = src.avl_set_auto_node_; unordered_set_base_hook_t::operator=(src); unordered_set_auto_base_hook_t::operator=(src); this->unordered_set_node_ = src.unordered_set_node_; this->unordered_set_auto_node_ = src.unordered_set_auto_node_; list_base_hook_t::operator=(src); list_auto_base_hook_t::operator=(src); this->list_node_ = src.list_node_; this->list_auto_node_ = src.list_auto_node_; slist_base_hook_t::operator=(src); slist_auto_base_hook_t::operator=(src); this->slist_node_ = src.slist_node_; this->slist_auto_node_ = src.slist_auto_node_; */ value_ = src.value_; return *this; } void swap_nodes(testvalue &other) { //Set set_base_hook_t::swap_nodes(other); set_auto_base_hook_t::swap_nodes(other); set_node_.swap_nodes(other.set_node_); set_auto_node_.swap_nodes(other.set_auto_node_); //SplaySet splay_set_base_hook_t::swap_nodes(other); splay_set_auto_base_hook_t::swap_nodes(other); splay_set_node_.swap_nodes(other.splay_set_node_); splay_set_auto_node_.swap_nodes(other.splay_set_auto_node_); //ScapeoatSet bs_set_base_hook_t::swap_nodes(other); sg_set_node_.swap_nodes(other.sg_set_node_); //AvlSet avl_set_base_hook_t::swap_nodes(other); avl_set_auto_base_hook_t::swap_nodes(other); avl_set_node_.swap_nodes(other.avl_set_node_); avl_set_auto_node_.swap_nodes(other.avl_set_auto_node_); //Unordered set unordered_set_base_hook_t::swap_nodes(other); unordered_set_auto_base_hook_t::swap_nodes(other); unordered_set_node_.swap_nodes(other.unordered_set_node_); unordered_set_auto_node_.swap_nodes(other.unordered_set_auto_node_); //List list_base_hook_t::swap_nodes(other); list_auto_base_hook_t::swap_nodes(other); list_node_.swap_nodes(other.list_node_); list_auto_node_.swap_nodes(other.list_auto_node_); //Slist slist_base_hook_t::swap_nodes(other); slist_auto_base_hook_t::swap_nodes(other); slist_node_.swap_nodes(other.slist_node_); slist_auto_node_.swap_nodes(other.slist_auto_node_); } ~testvalue() {} bool operator< (const testvalue &other) const { return value_ < other.value_; } bool operator==(const testvalue &other) const { return value_ == other.value_; } friend bool operator< (int other1, const testvalue &other2) { return other1 < other2.value_; } friend bool operator< (const testvalue &other1, int other2) { return other1.value_ < other2; } friend bool operator== (int other1, const testvalue &other2) { return other1 == other2.value_; } friend bool operator== (const testvalue &other1, int other2) { return other1.value_ == other2; } }; template std::size_t hash_value(const testvalue &t) { boost::hash hasher; return hasher(t.value_); } template std::ostream& operator<< (std::ostream& s, const testvalue& t) { return s << t.value_; } struct even_odd { template bool operator() (const testvalue& v1 ,const testvalue& v2) const { if ((v1.value_ & 1) == (v2.value_ & 1)) return v1.value_ < v2.value_; else return v2.value_ & 1; } }; struct is_even { template bool operator() (const testvalue& v1) const { return (v1.value_ & 1) == 0; } }; } //namespace boost{ } //namespace intrusive{ #endif