2007-05-04 21:30:54 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// (C) Copyright Olaf Krzikalla 2004-2006.
|
2007-05-12 12:34:55 +00:00
|
|
|
// (C) Copyright Ion Gaztanaga 2006-2007.
|
2007-05-04 21:30:54 +00:00
|
|
|
//
|
|
|
|
|
// 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.
|
|
|
|
|
//
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2007-09-26 17:39:06 +00:00
|
|
|
#ifndef BOOST_INTRUSIVE_DETAIL_ITESTVALUE_HPP
|
|
|
|
|
#define BOOST_INTRUSIVE_DETAIL_ITESTVALUE_HPP
|
2007-05-04 21:30:54 +00:00
|
|
|
|
|
|
|
|
#include <iostream>
|
2007-05-12 12:34:55 +00:00
|
|
|
#include <boost/intrusive/set_hook.hpp>
|
|
|
|
|
#include <boost/intrusive/list_hook.hpp>
|
|
|
|
|
#include <boost/intrusive/slist_hook.hpp>
|
|
|
|
|
#include <boost/intrusive/unordered_set_hook.hpp>
|
2007-10-24 19:00:30 +00:00
|
|
|
#include <boost/intrusive/splay_set_hook.hpp>
|
2007-10-30 07:02:10 +00:00
|
|
|
#include <boost/intrusive/avl_set_hook.hpp>
|
2007-11-18 10:44:56 +00:00
|
|
|
#include <boost/intrusive/bs_set_hook.hpp>
|
2007-09-26 17:39:06 +00:00
|
|
|
#include <boost/intrusive/options.hpp>
|
2007-10-15 16:56:27 +00:00
|
|
|
#include <boost/functional/hash.hpp>
|
2007-05-04 21:30:54 +00:00
|
|
|
#include "smart_ptr.hpp"
|
|
|
|
|
|
|
|
|
|
namespace boost{
|
|
|
|
|
namespace intrusive{
|
|
|
|
|
|
2007-09-26 17:39:06 +00:00
|
|
|
struct my_tag;
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct set_base_hook_type
|
|
|
|
|
{ typedef set_base_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct set_auto_base_hook_type
|
2007-10-24 19:00:30 +00:00
|
|
|
{ typedef set_base_hook<link_mode<auto_unlink>, void_pointer<VoidPointer>, tag<my_tag>, optimize_size<true> > type; };
|
2007-09-26 17:39:06 +00:00
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct set_member_hook_type
|
2007-10-24 19:00:30 +00:00
|
|
|
{ typedef set_member_hook<void_pointer<VoidPointer>, optimize_size<true> > type; };
|
2007-09-26 17:39:06 +00:00
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct set_auto_member_hook_type
|
|
|
|
|
{ typedef set_member_hook<link_mode<auto_unlink>, void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
2007-10-24 19:00:30 +00:00
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct splay_set_base_hook_type
|
|
|
|
|
{ typedef splay_set_base_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct splay_set_auto_base_hook_type
|
|
|
|
|
{ typedef splay_set_base_hook<link_mode<auto_unlink>, void_pointer<VoidPointer>, tag<my_tag> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct splay_set_member_hook_type
|
|
|
|
|
{ typedef splay_set_member_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct splay_set_auto_member_hook_type
|
|
|
|
|
{ typedef splay_set_member_hook<link_mode<auto_unlink>, void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
2007-11-18 10:44:56 +00:00
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct bs_set_base_hook_type
|
|
|
|
|
{ typedef bs_set_base_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct bs_set_member_hook_type
|
|
|
|
|
{ typedef bs_set_member_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
2007-10-30 07:02:10 +00:00
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct avl_set_base_hook_type
|
|
|
|
|
{ typedef avl_set_base_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct avl_set_auto_base_hook_type
|
|
|
|
|
{ typedef avl_set_base_hook<link_mode<auto_unlink>, void_pointer<VoidPointer>, tag<my_tag>, optimize_size<true> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct avl_set_member_hook_type
|
|
|
|
|
{ typedef avl_set_member_hook<void_pointer<VoidPointer>, optimize_size<true> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct avl_set_auto_member_hook_type
|
|
|
|
|
{ typedef avl_set_member_hook<link_mode<auto_unlink>, void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
2007-09-26 17:39:06 +00:00
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct list_base_hook_type
|
|
|
|
|
{ typedef list_base_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct list_auto_base_hook_type
|
|
|
|
|
{ typedef list_base_hook<link_mode<auto_unlink>, void_pointer<VoidPointer>, tag<my_tag> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct list_member_hook_type
|
|
|
|
|
{ typedef list_member_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct list_auto_member_hook_type
|
|
|
|
|
{ typedef list_member_hook<link_mode<auto_unlink>, void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct slist_base_hook_type
|
|
|
|
|
{ typedef slist_base_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct slist_auto_base_hook_type
|
|
|
|
|
{ typedef slist_base_hook<link_mode<auto_unlink>, void_pointer<VoidPointer>, tag<my_tag> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct slist_member_hook_type
|
|
|
|
|
{ typedef slist_member_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct slist_auto_member_hook_type
|
|
|
|
|
{ typedef slist_member_hook<link_mode<auto_unlink>, void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct uset_base_hook_type
|
|
|
|
|
{ typedef unordered_set_base_hook<void_pointer<VoidPointer> > type; };
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct uset_auto_base_hook_type
|
2007-11-18 10:44:56 +00:00
|
|
|
{
|
|
|
|
|
typedef unordered_set_base_hook
|
2008-04-27 15:03:06 +00:00
|
|
|
< link_mode<auto_unlink>
|
|
|
|
|
, void_pointer<VoidPointer>
|
|
|
|
|
, tag<my_tag>
|
|
|
|
|
, store_hash<true>
|
|
|
|
|
> type;
|
2007-11-18 10:44:56 +00:00
|
|
|
};
|
2007-09-26 17:39:06 +00:00
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct uset_member_hook_type
|
2008-04-27 15:03:06 +00:00
|
|
|
{
|
|
|
|
|
typedef unordered_set_member_hook
|
|
|
|
|
< void_pointer<VoidPointer>
|
|
|
|
|
, optimize_multikey<true>
|
|
|
|
|
> type;
|
|
|
|
|
};
|
2007-09-26 17:39:06 +00:00
|
|
|
|
|
|
|
|
template<class VoidPointer>
|
|
|
|
|
struct uset_auto_member_hook_type
|
2007-11-18 10:44:56 +00:00
|
|
|
{
|
|
|
|
|
typedef unordered_set_member_hook
|
|
|
|
|
< link_mode<auto_unlink>, void_pointer<VoidPointer>
|
2008-04-27 15:03:06 +00:00
|
|
|
, store_hash<true>
|
|
|
|
|
, optimize_multikey<true>
|
|
|
|
|
> type;
|
2007-11-18 10:44:56 +00:00
|
|
|
};
|
2007-09-26 17:39:06 +00:00
|
|
|
|
2007-05-04 21:30:54 +00:00
|
|
|
template<class VoidPointer, bool ConstantTimeSize>
|
|
|
|
|
struct testvalue
|
2007-09-26 17:39:06 +00:00
|
|
|
: set_base_hook_type<VoidPointer>::type
|
|
|
|
|
, set_auto_base_hook_type<VoidPointer>::type
|
2007-10-24 19:00:30 +00:00
|
|
|
, splay_set_base_hook_type<VoidPointer>::type
|
|
|
|
|
, splay_set_auto_base_hook_type<VoidPointer>::type
|
2007-11-18 10:44:56 +00:00
|
|
|
, bs_set_base_hook_type<VoidPointer>::type
|
2007-10-30 07:02:10 +00:00
|
|
|
, avl_set_base_hook_type<VoidPointer>::type
|
|
|
|
|
, avl_set_auto_base_hook_type<VoidPointer>::type
|
2007-09-26 17:39:06 +00:00
|
|
|
, list_base_hook_type<VoidPointer>::type
|
|
|
|
|
, list_auto_base_hook_type<VoidPointer>::type
|
|
|
|
|
, slist_base_hook_type<VoidPointer>::type
|
|
|
|
|
, slist_auto_base_hook_type<VoidPointer>::type
|
|
|
|
|
, uset_base_hook_type<VoidPointer>::type
|
|
|
|
|
, uset_auto_base_hook_type<VoidPointer>::type
|
2007-05-04 21:30:54 +00:00
|
|
|
{
|
2007-10-24 19:00:30 +00:00
|
|
|
typedef typename set_auto_base_hook_type<VoidPointer>::type set_auto_base_hook_t;
|
|
|
|
|
typedef typename set_base_hook_type<VoidPointer>::type set_base_hook_t;
|
|
|
|
|
typedef typename set_auto_member_hook_type<VoidPointer>::type set_auto_member_hook_t;
|
|
|
|
|
typedef typename set_member_hook_type<VoidPointer>::type set_member_hook_t;
|
|
|
|
|
|
|
|
|
|
typedef typename splay_set_auto_base_hook_type<VoidPointer>::type splay_set_auto_base_hook_t;
|
|
|
|
|
typedef typename splay_set_base_hook_type<VoidPointer>::type splay_set_base_hook_t;
|
|
|
|
|
typedef typename splay_set_auto_member_hook_type<VoidPointer>::type splay_set_auto_member_hook_t;
|
|
|
|
|
typedef typename splay_set_member_hook_type<VoidPointer>::type splay_set_member_hook_t;
|
|
|
|
|
|
2007-11-18 10:44:56 +00:00
|
|
|
typedef typename bs_set_base_hook_type<VoidPointer>::type bs_set_base_hook_t;
|
|
|
|
|
typedef typename bs_set_member_hook_type<VoidPointer>::type bs_set_member_hook_t;
|
|
|
|
|
|
2007-10-30 07:02:10 +00:00
|
|
|
typedef typename avl_set_auto_base_hook_type<VoidPointer>::type avl_set_auto_base_hook_t;
|
|
|
|
|
typedef typename avl_set_base_hook_type<VoidPointer>::type avl_set_base_hook_t;
|
|
|
|
|
typedef typename avl_set_auto_member_hook_type<VoidPointer>::type avl_set_auto_member_hook_t;
|
|
|
|
|
typedef typename avl_set_member_hook_type<VoidPointer>::type avl_set_member_hook_t;
|
|
|
|
|
|
2007-10-24 19:00:30 +00:00
|
|
|
typedef typename uset_auto_base_hook_type<VoidPointer>::type unordered_set_auto_base_hook_t;
|
|
|
|
|
typedef typename uset_base_hook_type<VoidPointer>::type unordered_set_base_hook_t;
|
|
|
|
|
typedef typename uset_auto_member_hook_type<VoidPointer>::type unordered_set_auto_member_hook_t;
|
|
|
|
|
typedef typename uset_member_hook_type<VoidPointer>::type unordered_set_member_hook_t;
|
|
|
|
|
|
|
|
|
|
typedef typename list_auto_base_hook_type<VoidPointer>::type list_auto_base_hook_t;
|
|
|
|
|
typedef typename list_base_hook_type<VoidPointer>::type list_base_hook_t;
|
|
|
|
|
typedef typename list_auto_member_hook_type<VoidPointer>::type list_auto_member_hook_t;
|
|
|
|
|
typedef typename list_member_hook_type<VoidPointer>::type list_member_hook_t;
|
|
|
|
|
|
|
|
|
|
typedef typename slist_auto_base_hook_type<VoidPointer>::type slist_auto_base_hook_t;
|
|
|
|
|
typedef typename slist_base_hook_type<VoidPointer>::type slist_base_hook_t;
|
|
|
|
|
typedef typename slist_auto_member_hook_type<VoidPointer>::type slist_auto_member_hook_t;
|
|
|
|
|
typedef typename slist_member_hook_type<VoidPointer>::type slist_member_hook_t;
|
2007-05-04 21:30:54 +00:00
|
|
|
|
|
|
|
|
//Set members
|
2007-09-26 17:39:06 +00:00
|
|
|
set_member_hook_t set_node_;
|
|
|
|
|
set_auto_member_hook_t set_auto_node_;
|
|
|
|
|
|
2007-10-24 19:00:30 +00:00
|
|
|
//SplaySet members
|
|
|
|
|
splay_set_member_hook_t splay_set_node_;
|
|
|
|
|
splay_set_auto_member_hook_t splay_set_auto_node_;
|
|
|
|
|
|
2007-11-18 10:44:56 +00:00
|
|
|
//ScapegoatSet members
|
|
|
|
|
bs_set_member_hook_t sg_set_node_;
|
|
|
|
|
|
2007-10-30 07:02:10 +00:00
|
|
|
//AvlSet members
|
|
|
|
|
avl_set_member_hook_t avl_set_node_;
|
|
|
|
|
avl_set_auto_member_hook_t avl_set_auto_node_;
|
|
|
|
|
|
2007-09-26 17:39:06 +00:00
|
|
|
//Unordered set members
|
|
|
|
|
unordered_set_member_hook_t unordered_set_node_;
|
2007-05-12 12:34:55 +00:00
|
|
|
unordered_set_auto_member_hook_t unordered_set_auto_node_;
|
2007-05-04 21:30:54 +00:00
|
|
|
|
|
|
|
|
//List members
|
2007-09-26 17:39:06 +00:00
|
|
|
list_member_hook_t list_node_;
|
|
|
|
|
list_auto_member_hook_t list_auto_node_;
|
2007-05-04 21:30:54 +00:00
|
|
|
|
|
|
|
|
//Slist members
|
2007-09-26 17:39:06 +00:00
|
|
|
slist_member_hook_t slist_node_;
|
|
|
|
|
slist_auto_member_hook_t slist_auto_node_;
|
2007-05-04 21:30:54 +00:00
|
|
|
|
|
|
|
|
int value_;
|
|
|
|
|
|
2007-09-26 17:39:06 +00:00
|
|
|
static const bool constant_time_size = ConstantTimeSize;
|
2007-05-04 21:30:54 +00:00
|
|
|
|
|
|
|
|
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)
|
2008-01-25 23:07:51 +00:00
|
|
|
{/*
|
2007-05-12 12:34:55 +00:00
|
|
|
set_base_hook_t::operator=(src);
|
|
|
|
|
set_auto_base_hook_t::operator=(src);
|
2007-09-26 17:39:06 +00:00
|
|
|
this->set_node_ = src.set_node_;
|
2007-05-04 21:30:54 +00:00
|
|
|
this->set_auto_node_ = src.set_auto_node_;
|
|
|
|
|
|
2007-10-24 19:00:30 +00:00
|
|
|
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_;
|
|
|
|
|
|
2007-11-18 10:44:56 +00:00
|
|
|
bs_set_base_hook_t::operator=(src);
|
|
|
|
|
this->sg_set_node_ = src.sg_set_node_;
|
|
|
|
|
|
2007-10-30 07:02:10 +00:00
|
|
|
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_;
|
|
|
|
|
|
2007-05-12 12:34:55 +00:00
|
|
|
unordered_set_base_hook_t::operator=(src);
|
|
|
|
|
unordered_set_auto_base_hook_t::operator=(src);
|
2007-09-26 17:39:06 +00:00
|
|
|
this->unordered_set_node_ = src.unordered_set_node_;
|
2007-05-04 21:30:54 +00:00
|
|
|
this->unordered_set_auto_node_ = src.unordered_set_auto_node_;
|
|
|
|
|
|
2007-05-12 12:34:55 +00:00
|
|
|
list_base_hook_t::operator=(src);
|
|
|
|
|
list_auto_base_hook_t::operator=(src);
|
2007-09-26 17:39:06 +00:00
|
|
|
this->list_node_ = src.list_node_;
|
2007-05-04 21:30:54 +00:00
|
|
|
this->list_auto_node_ = src.list_auto_node_;
|
|
|
|
|
|
2007-05-12 12:34:55 +00:00
|
|
|
slist_base_hook_t::operator=(src);
|
|
|
|
|
slist_auto_base_hook_t::operator=(src);
|
2007-09-26 17:39:06 +00:00
|
|
|
this->slist_node_ = src.slist_node_;
|
2007-05-04 21:30:54 +00:00
|
|
|
this->slist_auto_node_ = src.slist_auto_node_;
|
2008-01-25 23:07:51 +00:00
|
|
|
*/
|
2007-05-04 21:30:54 +00:00
|
|
|
value_ = src.value_;
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void swap_nodes(testvalue &other)
|
|
|
|
|
{
|
2007-09-26 17:39:06 +00:00
|
|
|
//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_);
|
|
|
|
|
|
2007-10-24 19:00:30 +00:00
|
|
|
//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_);
|
|
|
|
|
|
2007-11-18 10:44:56 +00:00
|
|
|
//ScapeoatSet
|
|
|
|
|
bs_set_base_hook_t::swap_nodes(other);
|
|
|
|
|
sg_set_node_.swap_nodes(other.sg_set_node_);
|
|
|
|
|
|
2007-10-30 07:02:10 +00:00
|
|
|
//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_);
|
|
|
|
|
|
2007-09-26 17:39:06 +00:00
|
|
|
//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_);
|
2007-05-04 21:30:54 +00:00
|
|
|
|
|
|
|
|
//List
|
2007-05-12 12:34:55 +00:00
|
|
|
list_base_hook_t::swap_nodes(other);
|
|
|
|
|
list_auto_base_hook_t::swap_nodes(other);
|
2007-09-26 17:39:06 +00:00
|
|
|
list_node_.swap_nodes(other.list_node_);
|
2007-05-04 21:30:54 +00:00
|
|
|
list_auto_node_.swap_nodes(other.list_auto_node_);
|
|
|
|
|
|
|
|
|
|
//Slist
|
2007-05-12 12:34:55 +00:00
|
|
|
slist_base_hook_t::swap_nodes(other);
|
|
|
|
|
slist_auto_base_hook_t::swap_nodes(other);
|
2007-09-26 17:39:06 +00:00
|
|
|
slist_node_.swap_nodes(other.slist_node_);
|
2007-05-04 21:30:54 +00:00
|
|
|
slist_auto_node_.swap_nodes(other.slist_auto_node_);
|
|
|
|
|
}
|
|
|
|
|
|
2008-04-27 15:03:06 +00:00
|
|
|
bool is_linked() const
|
|
|
|
|
{
|
|
|
|
|
//Set
|
|
|
|
|
return set_base_hook_t::is_linked() ||
|
|
|
|
|
set_auto_base_hook_t::is_linked() ||
|
|
|
|
|
set_node_.is_linked() ||
|
|
|
|
|
set_auto_node_.is_linked() ||
|
|
|
|
|
|
|
|
|
|
//SplaySet
|
|
|
|
|
splay_set_base_hook_t::is_linked() ||
|
|
|
|
|
splay_set_auto_base_hook_t::is_linked() ||
|
|
|
|
|
splay_set_node_.is_linked() ||
|
|
|
|
|
splay_set_auto_node_.is_linked() ||
|
|
|
|
|
|
|
|
|
|
//ScapeoatSet
|
|
|
|
|
bs_set_base_hook_t::is_linked() ||
|
|
|
|
|
sg_set_node_.is_linked() ||
|
|
|
|
|
|
|
|
|
|
//AvlSet
|
|
|
|
|
avl_set_base_hook_t::is_linked() ||
|
|
|
|
|
avl_set_auto_base_hook_t::is_linked() ||
|
|
|
|
|
avl_set_node_.is_linked() ||
|
|
|
|
|
avl_set_auto_node_.is_linked() ||
|
|
|
|
|
|
|
|
|
|
//Unordered set
|
|
|
|
|
unordered_set_base_hook_t::is_linked() ||
|
|
|
|
|
unordered_set_auto_base_hook_t::is_linked() ||
|
|
|
|
|
unordered_set_node_.is_linked() ||
|
|
|
|
|
unordered_set_auto_node_.is_linked() ||
|
|
|
|
|
|
|
|
|
|
//List
|
|
|
|
|
list_base_hook_t::is_linked() ||
|
|
|
|
|
list_auto_base_hook_t::is_linked() ||
|
|
|
|
|
list_node_.is_linked() ||
|
|
|
|
|
list_auto_node_.is_linked() ||
|
|
|
|
|
|
|
|
|
|
//Slist
|
|
|
|
|
slist_base_hook_t::is_linked() ||
|
|
|
|
|
slist_auto_base_hook_t::is_linked() ||
|
|
|
|
|
slist_node_.is_linked() ||
|
|
|
|
|
slist_auto_node_.is_linked();
|
|
|
|
|
}
|
|
|
|
|
|
2007-05-04 21:30:54 +00:00
|
|
|
~testvalue()
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
bool operator< (const testvalue &other) const
|
|
|
|
|
{ return value_ < other.value_; }
|
|
|
|
|
|
|
|
|
|
bool operator==(const testvalue &other) const
|
|
|
|
|
{ return value_ == other.value_; }
|
2007-05-12 12:34:55 +00:00
|
|
|
|
2008-07-08 17:00:24 +00:00
|
|
|
bool operator!=(const testvalue &other) const
|
|
|
|
|
{ return value_ != other.value_; }
|
|
|
|
|
|
2007-05-12 12:34:55 +00:00
|
|
|
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; }
|
2008-07-08 17:00:24 +00:00
|
|
|
|
|
|
|
|
friend bool operator!= (int other1, const testvalue &other2)
|
|
|
|
|
{ return other1 != other2.value_; }
|
|
|
|
|
|
|
|
|
|
friend bool operator!= (const testvalue &other1, int other2)
|
|
|
|
|
{ return other1.value_ != other2; }
|
2007-05-04 21:30:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer, bool ConstantTimeSize>
|
|
|
|
|
std::size_t hash_value(const testvalue<VoidPointer, ConstantTimeSize> &t)
|
|
|
|
|
{
|
|
|
|
|
boost::hash<int> hasher;
|
|
|
|
|
return hasher(t.value_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class VoidPointer, bool constant_time_size>
|
|
|
|
|
std::ostream& operator<<
|
|
|
|
|
(std::ostream& s, const testvalue<VoidPointer, constant_time_size>& t)
|
|
|
|
|
{ return s << t.value_; }
|
|
|
|
|
|
|
|
|
|
struct even_odd
|
|
|
|
|
{
|
|
|
|
|
template<class VoidPointer, bool constant_time_size>
|
|
|
|
|
bool operator()
|
|
|
|
|
(const testvalue<VoidPointer, constant_time_size>& v1
|
|
|
|
|
,const testvalue<VoidPointer, constant_time_size>& v2) const
|
|
|
|
|
{
|
|
|
|
|
if ((v1.value_ & 1) == (v2.value_ & 1))
|
|
|
|
|
return v1.value_ < v2.value_;
|
|
|
|
|
else
|
|
|
|
|
return v2.value_ & 1;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2008-01-25 23:07:51 +00:00
|
|
|
struct is_even
|
|
|
|
|
{
|
|
|
|
|
template<class VoidPointer, bool constant_time_size>
|
|
|
|
|
bool operator()
|
|
|
|
|
(const testvalue<VoidPointer, constant_time_size>& v1) const
|
|
|
|
|
{ return (v1.value_ & 1) == 0; }
|
|
|
|
|
};
|
|
|
|
|
|
2007-05-04 21:30:54 +00:00
|
|
|
} //namespace boost{
|
|
|
|
|
} //namespace intrusive{
|
|
|
|
|
|
|
|
|
|
#endif
|