diff --git a/include/boost/unordered/detail/serialize_node_pointer.hpp b/include/boost/unordered/detail/serialize_node_pointer.hpp index ea4a4da2..95f37cb3 100644 --- a/include/boost/unordered/detail/serialize_node_pointer.hpp +++ b/include/boost/unordered/detail/serialize_node_pointer.hpp @@ -9,6 +9,7 @@ #ifndef BOOST_UNORDERED_DETAIL_SERIALIZE_NODE_POINTER_HPP #define BOOST_UNORDERED_DETAIL_SERIALIZE_NODE_POINTER_HPP +#include #include #include #include @@ -39,44 +40,58 @@ struct serialization_tracker void serialize(Archive&,unsigned int){} /* no data emitted */ }; -template -void track_node_pointer(Archive& ar,const Node* p) +template +void track_node_pointer(Archive& ar,NodePtr p) { + typedef typename boost::pointer_traits ptr_traits; + typedef typename boost::remove_const< + typename ptr_traits::element_type>::type node_type; + if(p){ ar&core::make_nvp( "node", - *reinterpret_cast*>(const_cast(p))); + *reinterpret_cast*>( + const_cast( + boost::to_address(p)))); } } -template -void serialize_node_pointer(Archive& ar,Node*& p,boost::true_type /* save */) +template +void serialize_node_pointer( + Archive& ar,NodePtr& p,boost::true_type /* save */) { - typedef typename boost::remove_const::type node_type; - typedef serialization_tracker tracker; + typedef typename boost::pointer_traits ptr_traits; + typedef typename boost::remove_const< + typename ptr_traits::element_type>::type node_type; + typedef serialization_tracker tracker; - tracker* pn= + tracker* pt= const_cast( reinterpret_cast( - const_cast(p))); - ar<( + boost::to_address(p)))); + ar< -void serialize_node_pointer(Archive& ar,Node*& p,boost::false_type /* load */) +template +void serialize_node_pointer( + Archive& ar,NodePtr& p,boost::false_type /* load */) { - typedef typename boost::remove_const::type node_type; - typedef serialization_tracker tracker; + typedef typename boost::pointer_traits ptr_traits; + typedef typename boost::remove_const< + typename ptr_traits::element_type>::type node_type; + typedef serialization_tracker tracker; - tracker* pn; - ar>>core::make_nvp("pointer",pn); - p=const_cast( - reinterpret_cast( - const_cast(pn))); + tracker* pt; + ar>>core::make_nvp("pointer",pt); + node_type* pn=const_cast( + reinterpret_cast( + const_cast(pt))); + p=pn?ptr_traits::pointer_to(*pn):0; } -template -void serialize_node_pointer(Archive& ar,Node*& p) +template +void serialize_node_pointer(Archive& ar,NodePtr& p) { serialize_node_pointer( ar,p,