/* Copyright 2003-2008 Joaquin M Lopez Munoz. * 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/multi_index for library home page. */ #ifndef BOOST_MULTI_INDEX_DETAIL_INDEX_NODE_BASE_HPP #define BOOST_MULTI_INDEX_DETAIL_INDEX_NODE_BASE_HPP #if defined(_MSC_VER)&&(_MSC_VER>=1200) #pragma once #endif #include /* keep it first to prevent nasty warns in MSVC */ #include #include #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) #include #include #include #endif namespace boost{ namespace multi_index{ namespace detail{ /* index_node_base tops the node hierarchy of multi_index_container. It holds * the value of the element contained. */ template struct pod_value_holder { typename aligned_storage< sizeof(Value), alignment_of::value >::type space; }; template struct index_node_base:private pod_value_holder { typedef index_node_base base_type; /* used for serialization purposes */ typedef Value value_type; typedef Allocator allocator_type; value_type& value() { return *static_cast( static_cast(&this->space)); } const value_type& value()const { return *static_cast( static_cast(&this->space)); } static index_node_base* from_value(const value_type* p) { return static_cast( reinterpret_cast*>( /* std 9.2.17 */ const_cast(p))); } private: #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) friend class boost::serialization::access; /* nodes do not emit any kind of serialization info. They are * fed to Boost.Serialization so that pointers to nodes are * tracked correctly. */ template void serialize(Archive&,const unsigned int) { } #endif }; template Node* node_from_value( const Value* p BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(Node)) { typedef typename Node::allocator_type allocator_type; return static_cast( index_node_base::from_value(p)); } } /* namespace multi_index::detail */ } /* namespace multi_index */ #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) /* Index nodes never get constructed directly by Boost.Serialization, * as archives are always fed pointers to previously existent * nodes. So, if this is called it means we are dealing with a * somehow invalid archive. */ #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) namespace serialization{ #else namespace multi_index{ namespace detail{ #endif template inline void load_construct_data( Archive&,boost::multi_index::detail::index_node_base*, const unsigned int) { throw_exception( archive::archive_exception(archive::archive_exception::other_exception)); } #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) } /* namespace serialization */ #else } /* namespace multi_index::detail */ } /* namespace multi_index */ #endif #endif } /* namespace boost */ #endif