diff --git a/include/boost/intrusive/circular_slist_algorithms.hpp b/include/boost/intrusive/circular_slist_algorithms.hpp index ae06396..8bb95cd 100644 --- a/include/boost/intrusive/circular_slist_algorithms.hpp +++ b/include/boost/intrusive/circular_slist_algorithms.hpp @@ -63,7 +63,7 @@ class circular_slist_algorithms //! Effects: Constructs an non-used list element, putting the next //! pointer to null: - //! NodeTraits::get_next(this_node) == 0 + //! NodeTraits::get_next(this_node) == 0 //! //! Complexity: Constant //! diff --git a/include/boost/intrusive/derivation_value_traits.hpp b/include/boost/intrusive/derivation_value_traits.hpp index 6ae28a3..8711d56 100644 --- a/include/boost/intrusive/derivation_value_traits.hpp +++ b/include/boost/intrusive/derivation_value_traits.hpp @@ -14,6 +14,7 @@ #define BOOST_INTRUSIVE_DERIVATION_VALUE_TRAITS_HPP #include +#include #include namespace boost { @@ -44,10 +45,20 @@ struct derivation_value_traits { return node_ptr(&value); } static pointer to_value_ptr(node_ptr n) - { return pointer(static_cast(detail::boost_intrusive_get_pointer(n))); } + { +// This still fails in gcc < 4.4 so forget about it +// using ::boost::static_pointer_cast; +// return static_pointer_cast(n)); + return pointer(&static_cast(*n)); + } static const_pointer to_value_ptr(const_node_ptr n) - { return const_pointer(static_cast(detail::boost_intrusive_get_pointer(n))); } + { +// This still fails in gcc < 4.4 so forget about it +// using ::boost::static_pointer_cast; +// return static_pointer_cast(n)); + return const_pointer(&static_cast(*n)); + } }; } //namespace intrusive diff --git a/include/boost/intrusive/detail/any_node_and_algorithms.hpp b/include/boost/intrusive/detail/any_node_and_algorithms.hpp index e2fbbfa..513bdd9 100644 --- a/include/boost/intrusive/detail/any_node_and_algorithms.hpp +++ b/include/boost/intrusive/detail/any_node_and_algorithms.hpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace boost { namespace intrusive { @@ -87,7 +88,10 @@ struct any_unordered_node_traits static const bool optimize_multikey = true; static node_ptr get_next(const_node_ptr n) - { return node_ptr(&static_cast(*n->node_ptr_1)); } + { + using ::boost::static_pointer_cast; + return static_pointer_cast(n->node_ptr_1); + } static void set_next(node_ptr n, node_ptr next) { n->node_ptr_1 = next; } diff --git a/include/boost/intrusive/detail/hashtable_node.hpp b/include/boost/intrusive/detail/hashtable_node.hpp index a077155..72188b9 100644 --- a/include/boost/intrusive/detail/hashtable_node.hpp +++ b/include/boost/intrusive/detail/hashtable_node.hpp @@ -22,7 +22,7 @@ #include #include //remove-me #include - +#include namespace boost { namespace intrusive { namespace detail { @@ -118,7 +118,12 @@ class hashtable_iterator typedef typename Container::size_type size_type; static typename Container::node_ptr downcast_bucket(typename bucket_type::node_ptr p) - { return typename Container::node_ptr(&static_cast(*p)); } + { +// This still fails in gcc < 4.4 so forget about it +// using ::boost::static_pointer_cast; +// return static_pointer_cast(p); + return typename Container::node_ptr(&static_cast(*p)); + } public: typedef typename Container::value_type value_type; diff --git a/include/boost/intrusive/detail/parent_from_member.hpp b/include/boost/intrusive/detail/parent_from_member.hpp index 0b30867..c06d932 100644 --- a/include/boost/intrusive/detail/parent_from_member.hpp +++ b/include/boost/intrusive/detail/parent_from_member.hpp @@ -9,8 +9,8 @@ // See http://www.boost.org/libs/intrusive for documentation. // ///////////////////////////////////////////////////////////////////////////// -#ifndef BOOST_INTRUSIVE_PARENT_FROM_MEMBER_HPP -#define BOOST_INTRUSIVE_PARENT_FROM_MEMBER_HPP +#ifndef BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP +#define BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP #include #include @@ -47,15 +47,13 @@ inline std::ptrdiff_t offset_from_pointer_to_member(const Member Parent::* ptr_t template inline Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member) { - return (Parent*)((char*)member - - offset_from_pointer_to_member(ptr_to_member)); + return (Parent*)((char*)member - offset_from_pointer_to_member(ptr_to_member)); } template inline const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member) { - return (const Parent*)((const char*)member - - offset_from_pointer_to_member(ptr_to_member)); + return (const Parent*)((const char*)member - offset_from_pointer_to_member(ptr_to_member)); } } //namespace detail { @@ -68,4 +66,4 @@ inline const Parent *parent_from_member(const Member *member, const Member Paren #include -#endif //#ifndef BOOST_INTRUSIVE_PARENT_FROM_MEMBER_HPP +#endif //#ifndef BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP diff --git a/include/boost/intrusive/detail/utilities.hpp b/include/boost/intrusive/detail/utilities.hpp index a9b876b..064ff6e 100644 --- a/include/boost/intrusive/detail/utilities.hpp +++ b/include/boost/intrusive/detail/utilities.hpp @@ -410,14 +410,10 @@ struct member_hook_traits static const link_mode_type link_mode = Hook::boost_intrusive_tags::link_mode; static node_ptr to_node_ptr(reference value) - { - return reinterpret_cast(&(value.*P)); - } + { return static_cast(&(value.*P)); } static const_node_ptr to_node_ptr(const_reference value) - { - return static_cast(&(value.*P)); - } + { return static_cast(&(value.*P)); } static pointer to_value_ptr(node_ptr n) { @@ -432,6 +428,45 @@ struct member_hook_traits } }; +template +struct function_hook_traits +{ + public: + typedef typename Functor::hook_type hook_type; + typedef typename Functor::hook_ptr hook_ptr; + typedef typename Functor::const_hook_ptr const_hook_ptr; + typedef typename hook_type::boost_intrusive_tags::node_traits node_traits; + typedef typename node_traits::node node; + typedef typename Functor::value_type value_type; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::const_node_ptr const_node_ptr; + typedef typename boost::pointer_to_other::type pointer; + typedef typename boost::pointer_to_other::type const_pointer; + typedef typename std::iterator_traits::reference reference; + typedef typename std::iterator_traits::reference const_reference; + static const link_mode_type link_mode = hook_type::boost_intrusive_tags::link_mode; + + static node_ptr to_node_ptr(reference value) + { return static_cast(&*Functor::to_hook_ptr(value)); } + + static const_node_ptr to_node_ptr(const_reference value) + { return static_cast(&*Functor::to_hook_ptr(value)); } + + static pointer to_value_ptr(node_ptr n) + { return Functor::to_value_ptr(to_hook_ptr(n)); } + + static const_pointer to_value_ptr(const_node_ptr n) + { return Functor::to_value_ptr(to_hook_ptr(n)); } + + private: + static hook_ptr to_hook_ptr(node_ptr n) + { return hook_ptr(&*static_cast(&*n)); } + + static const_hook_ptr to_hook_ptr(const_node_ptr n) + { return const_hook_ptr(&*static_cast(&*n)); } +}; + + //This function uses binary search to discover the //highest set bit of the integer inline std::size_t floor_log2 (std::size_t x) @@ -454,14 +489,19 @@ inline std::size_t floor_log2 (std::size_t x) inline float fast_log2 (float val) { - boost::uint32_t * exp_ptr = - static_cast(static_cast(&val)); - boost::uint32_t x = *exp_ptr; + union caster_t + { + boost::uint32_t x; + float val; + } caster; + + caster.val = val; + boost::uint32_t x = caster.x; const int log_2 = (int)(((x >> 23) & 255) - 128); x &= ~(255 << 23); x += 127 << 23; - *exp_ptr = x; - + caster.x = x; + val = caster.val; val = ((-1.0f/3) * val + 2) * val - 2.0f/3; return (val + log_2); diff --git a/include/boost/intrusive/hashtable.hpp b/include/boost/intrusive/hashtable.hpp index 99de70d..1493eac 100644 --- a/include/boost/intrusive/hashtable.hpp +++ b/include/boost/intrusive/hashtable.hpp @@ -23,6 +23,7 @@ #include #include #include +#include //General intrusive utilities #include #include @@ -157,26 +158,22 @@ struct get_slist_impl_from_supposed_value_traits template struct unordered_bucket_impl { - /// @cond typedef typename get_slist_impl_from_supposed_value_traits ::type slist_impl; typedef detail::bucket_impl implementation_defined; - /// @endcond typedef implementation_defined type; }; template struct unordered_bucket_ptr_impl { - /// @cond typedef typename detail::get_node_traits ::type::node_ptr node_ptr; typedef typename unordered_bucket_impl ::type bucket_type; typedef typename boost::pointer_to_other ::type implementation_defined; - /// @endcond typedef implementation_defined type; }; @@ -329,7 +326,12 @@ struct group_functions typedef circular_slist_algorithms group_algorithms; static node_ptr dcast_bucket_ptr(slist_node_ptr p) - { return node_ptr(&static_cast(*p)); } + { +// This still fails in gcc < 4.4 so forget about it +// using ::boost::static_pointer_cast; +// return static_pointer_cast(p); + return node_ptr(&static_cast(*p)); + } static slist_node_ptr priv_get_bucket_before_begin (slist_node_ptr bucket_beg, slist_node_ptr bucket_end, node_ptr p) @@ -496,7 +498,6 @@ struct unordered_bucket_ptr template struct unordered_default_bucket_traits { - /// @cond typedef typename ValueTraitsOrHookOption:: template pack::value_traits supposed_value_traits; typedef typename detail:: @@ -504,7 +505,6 @@ struct unordered_default_bucket_traits ::type slist_impl; typedef detail::bucket_traits_impl implementation_defined; - /// @endcond typedef implementation_defined type; }; @@ -2322,7 +2322,12 @@ class hashtable_impl } static node_ptr dcast_bucket_ptr(typename slist_impl::node_ptr p) - { return node_ptr(&static_cast(*p)); } + { +// This still fails in gcc < 4.4 so forget about it +// using ::boost::static_pointer_cast; +// return static_pointer_cast(p); + return node_ptr(&static_cast(*p)); + } std::size_t priv_stored_or_compute_hash(const value_type &v, detail::true_) const { return node_traits::get_hash(this->get_real_value_traits().to_node_ptr(v)); } @@ -2889,7 +2894,6 @@ struct make_hashtable_opt //Real value traits must be calculated from options typedef typename detail::get_value_traits ::type value_traits; - /// @cond static const bool external_value_traits = detail::external_value_traits_is_true::value; typedef typename detail::eval_if_c @@ -2898,7 +2902,6 @@ struct make_hashtable_opt , detail::identity >::type real_value_traits; typedef typename packed_options::bucket_traits specified_bucket_traits; - /// @endcond //Real bucket traits must be calculated from options and calculated value_traits typedef typename detail::get_slist_impl diff --git a/include/boost/intrusive/intrusive_fwd.hpp b/include/boost/intrusive/intrusive_fwd.hpp index 7c9b2a1..dc18566 100644 --- a/include/boost/intrusive/intrusive_fwd.hpp +++ b/include/boost/intrusive/intrusive_fwd.hpp @@ -50,7 +50,7 @@ class rbtree_algorithms; //////////////////////////// //slist -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -64,7 +64,7 @@ template #endif class slist; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -75,7 +75,7 @@ template #endif class slist_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -87,7 +87,7 @@ template class slist_member_hook; //list -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -99,7 +99,7 @@ template #endif class list; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -110,7 +110,7 @@ template #endif class list_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -121,8 +121,19 @@ template #endif class list_member_hook; +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template + < class O1 = none + , class O2 = none + , class O3 = none + > +#else +template +#endif +class list_hook; + //rbtree/set/multiset -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -135,7 +146,7 @@ template #endif class rbtree; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -148,7 +159,7 @@ template #endif class set; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -161,7 +172,7 @@ template #endif class multiset; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -173,7 +184,7 @@ template #endif class set_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -186,7 +197,7 @@ template class set_member_hook; //splaytree/splay_set/splay_multiset -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -199,7 +210,7 @@ template #endif class splaytree; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -212,7 +223,7 @@ template #endif class splay_set; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -225,7 +236,7 @@ template #endif class splay_multiset; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -236,7 +247,7 @@ template #endif class splay_set_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -248,7 +259,7 @@ template class splay_set_member_hook; //avltree/avl_set/avl_multiset -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -261,7 +272,7 @@ template #endif class avltree; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -274,7 +285,7 @@ template #endif class avl_set; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -287,7 +298,7 @@ template #endif class avl_multiset; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -299,7 +310,7 @@ template #endif class avl_set_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -313,7 +324,7 @@ class avl_set_member_hook; //treap/treap_set/treap_multiset -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -326,7 +337,7 @@ template #endif class treap; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -339,7 +350,7 @@ template #endif class treap_set; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -357,7 +368,7 @@ template struct priority_compare; //sgtree/sg_set/sg_multiset -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -370,7 +381,7 @@ template #endif class sgtree; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -383,7 +394,7 @@ template #endif class sg_set; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -396,7 +407,7 @@ template #endif class sg_multiset; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -407,7 +418,7 @@ template #endif class bs_set_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -420,7 +431,7 @@ class bs_set_member_hook; //hashtable/unordered_set/unordered_multiset -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -439,7 +450,7 @@ template #endif class hashtable; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -458,7 +469,7 @@ template #endif class unordered_set; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class T , class O1 = none @@ -477,7 +488,7 @@ template #endif class unordered_multiset; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -489,7 +500,7 @@ template #endif class unordered_set_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -501,7 +512,7 @@ template #endif class unordered_set_member_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none @@ -512,7 +523,7 @@ template #endif class any_base_hook; -#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) && !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) template < class O1 = none , class O2 = none diff --git a/include/boost/intrusive/options.hpp b/include/boost/intrusive/options.hpp index d692b1e..9731651 100644 --- a/include/boost/intrusive/options.hpp +++ b/include/boost/intrusive/options.hpp @@ -343,6 +343,24 @@ struct member_hook }; +//!This option setter specifies the function object that will +//!be used to convert between values to be inserted in a container +//!and the hook to be used for that purpose. +template< typename Functor> +struct function_hook +{ +/// @cond + typedef detail::function_hook_traits + function_value_traits; + template + struct pack : Base + { + typedef function_value_traits value_traits; + }; +/// @endcond +}; + + //!This option setter specifies that the container //!must use the specified base hook template diff --git a/include/boost/intrusive/parent_from_member.hpp b/include/boost/intrusive/parent_from_member.hpp new file mode 100644 index 0000000..882c073 --- /dev/null +++ b/include/boost/intrusive/parent_from_member.hpp @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2010-2010 +// +// 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_GET_PARENT_FROM_MEMBER_HPP +#define BOOST_INTRUSIVE_GET_PARENT_FROM_MEMBER_HPP + +#include +#include + +namespace boost { +namespace intrusive { + +//! Given a pointer to a member and its corresponding pointer to data member, +//! this function returns the pointer of the parent containing that member. +//! Note: this function does not work with pointer to members that rely on +//! virtual inheritance. +template +inline Parent *get_parent_from_member(Member *member, const Member Parent::* ptr_to_member) +{ return ::boost::intrusive::detail::parent_from_member(member, ptr_to_member); } + +//! Given a const pointer to a member and its corresponding const pointer to data member, +//! this function returns the const pointer of the parent containing that member. +//! Note: this function does not work with pointer to members that rely on +//! virtual inheritance. +template +inline const Parent *get_parent_from_member(const Member *member, const Member Parent::* ptr_to_member) +{ return ::boost::intrusive::detail::parent_from_member(member, ptr_to_member); } + +} //namespace intrusive { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTRUSIVE_GET_PARENT_FROM_MEMBER_HPP diff --git a/include/boost/intrusive/rbtree_algorithms.hpp b/include/boost/intrusive/rbtree_algorithms.hpp index 89abcd6..a470a5d 100644 --- a/include/boost/intrusive/rbtree_algorithms.hpp +++ b/include/boost/intrusive/rbtree_algorithms.hpp @@ -57,6 +57,9 @@ #include #include +#if (defined _MSC_VER) && (_MSC_VER >= 1200) +#pragma optimize( "g", off ) +#endif namespace boost { namespace intrusive { @@ -905,6 +908,10 @@ class rbtree_algorithms } //namespace intrusive } //namespace boost +#if (defined _MSC_VER) && (_MSC_VER >= 1200) +#pragma optimize( "", on ) +#endif + #include #endif //BOOST_INTRUSIVE_RBTREE_ALGORITHMS_HPP diff --git a/include/boost/intrusive/unordered_set_hook.hpp b/include/boost/intrusive/unordered_set_hook.hpp index 286b318..61f4a72 100644 --- a/include/boost/intrusive/unordered_set_hook.hpp +++ b/include/boost/intrusive/unordered_set_hook.hpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -76,7 +77,12 @@ struct unordered_node_traits static const bool optimize_multikey = OptimizeMultiKey; static node_ptr get_next(const_node_ptr n) - { return node_ptr(&static_cast(*n->next_)); } + { +// This still fails in gcc < 4.4 so forget about it +// using ::boost::static_pointer_cast; +// return static_pointer_cast(n->next_); + return node_ptr(&static_cast(*n->next_)); + } static void set_next(node_ptr n, node_ptr next) { n->next_ = next; }