188 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			188 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// (C) Copyright Ion Gaztanaga  2006-2014
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// 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_HOOK_TRAITS_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_DETAIL_HOOK_TRAITS_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_CONFIG_HPP
							 | 
						||
| 
								 | 
							
								#  include <boost/config.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_HAS_PRAGMA_ONCE)
							 | 
						||
| 
								 | 
							
								#  pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/workaround.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/pointer_traits.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/parent_from_member.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/link_mode.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/mpl.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/to_raw_pointer.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/node_holder.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace intrusive {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T, class NodePtr, class Tag, unsigned int Type>
							 | 
						||
| 
								 | 
							
								struct bhtraits_base
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   public:
							 | 
						||
| 
								 | 
							
								   typedef NodePtr                                                   node_ptr;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<node_ptr>::element_type           node;
							 | 
						||
| 
								 | 
							
								   typedef node_holder<node, Tag, Type>                              node_holder_type;
							 | 
						||
| 
								 | 
							
								   typedef T                                                         value_type;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<node_ptr>::
							 | 
						||
| 
								 | 
							
								      template rebind_pointer<const node>::type                      const_node_ptr;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<node_ptr>::
							 | 
						||
| 
								 | 
							
								      template rebind_pointer<T>::type                               pointer;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<node_ptr>::
							 | 
						||
| 
								 | 
							
								      template rebind_pointer<const T>::type                         const_pointer;
							 | 
						||
| 
								 | 
							
								   //typedef typename pointer_traits<pointer>::reference               reference;
							 | 
						||
| 
								 | 
							
								   //typedef typename pointer_traits<const_pointer>::reference         const_reference;
							 | 
						||
| 
								 | 
							
								   typedef T &                                                       reference;
							 | 
						||
| 
								 | 
							
								   typedef const T &                                                 const_reference;
							 | 
						||
| 
								 | 
							
								   typedef node_holder_type &                                        node_holder_reference;
							 | 
						||
| 
								 | 
							
								   typedef const node_holder_type &                                  const_node_holder_reference;
							 | 
						||
| 
								 | 
							
								   typedef node&                                                     node_reference;
							 | 
						||
| 
								 | 
							
								   typedef const node &                                              const_node_reference;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static pointer to_value_ptr(const node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<pointer>::pointer_to
							 | 
						||
| 
								 | 
							
								         (static_cast<reference>(static_cast<node_holder_reference>(*n)));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static const_pointer to_value_ptr(const const_node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<const_pointer>::pointer_to
							 | 
						||
| 
								 | 
							
								         (static_cast<const_reference>(static_cast<const_node_holder_reference>(*n)));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static node_ptr to_node_ptr(reference value)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<node_ptr>::pointer_to
							 | 
						||
| 
								 | 
							
								         (static_cast<node_reference>(static_cast<node_holder_reference>(value)));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static const_node_ptr to_node_ptr(const_reference value)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<const_node_ptr>::pointer_to
							 | 
						||
| 
								 | 
							
								         (static_cast<const_node_reference>(static_cast<const_node_holder_reference>(value)));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T, class NodeTraits, link_mode_type LinkMode, class Tag, unsigned int Type>
							 | 
						||
| 
								 | 
							
								struct bhtraits
							 | 
						||
| 
								 | 
							
								   : public bhtraits_base<T, typename NodeTraits::node_ptr, Tag, Type>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   static const link_mode_type link_mode = LinkMode;
							 | 
						||
| 
								 | 
							
								   typedef NodeTraits node_traits;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T, class Hook, Hook T::* P>
							 | 
						||
| 
								 | 
							
								struct mhtraits
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   public:
							 | 
						||
| 
								 | 
							
								   typedef Hook                                                      hook_type;
							 | 
						||
| 
								 | 
							
								   typedef typename hook_type::hooktags::node_traits                 node_traits;
							 | 
						||
| 
								 | 
							
								   typedef typename node_traits::node                                node;
							 | 
						||
| 
								 | 
							
								   typedef T                                                         value_type;
							 | 
						||
| 
								 | 
							
								   typedef typename node_traits::node_ptr                            node_ptr;
							 | 
						||
| 
								 | 
							
								   typedef typename node_traits::const_node_ptr                      const_node_ptr;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<node_ptr>::
							 | 
						||
| 
								 | 
							
								      template rebind_pointer<T>::type                               pointer;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<node_ptr>::
							 | 
						||
| 
								 | 
							
								      template rebind_pointer<const T>::type                         const_pointer;
							 | 
						||
| 
								 | 
							
								   typedef T &                                                       reference;
							 | 
						||
| 
								 | 
							
								   typedef const T &                                                 const_reference;
							 | 
						||
| 
								 | 
							
								   typedef node&                                                     node_reference;
							 | 
						||
| 
								 | 
							
								   typedef const node &                                              const_node_reference;
							 | 
						||
| 
								 | 
							
								   typedef hook_type&                                                hook_reference;
							 | 
						||
| 
								 | 
							
								   typedef const hook_type &                                         const_hook_reference;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static const link_mode_type link_mode = Hook::hooktags::link_mode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static node_ptr to_node_ptr(reference value)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<node_ptr>::pointer_to
							 | 
						||
| 
								 | 
							
								         (static_cast<node_reference>(static_cast<hook_reference>(value.*P)));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static const_node_ptr to_node_ptr(const_reference value)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<const_node_ptr>::pointer_to
							 | 
						||
| 
								 | 
							
								         (static_cast<const_node_reference>(static_cast<const_hook_reference>(value.*P)));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static pointer to_value_ptr(const node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<pointer>::pointer_to
							 | 
						||
| 
								 | 
							
								         (*detail::parent_from_member<T, Hook>
							 | 
						||
| 
								 | 
							
								            (static_cast<Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_INTRUSIVE_FORCEINLINE static const_pointer to_value_ptr(const const_node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return pointer_traits<const_pointer>::pointer_to
							 | 
						||
| 
								 | 
							
								         (*detail::parent_from_member<T, Hook>
							 | 
						||
| 
								 | 
							
								            (static_cast<const Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class Functor>
							 | 
						||
| 
								 | 
							
								struct fhtraits
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   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::hooktags::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 pointer_traits<node_ptr>::
							 | 
						||
| 
								 | 
							
								      template rebind_pointer<value_type>::type                      pointer;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<node_ptr>::
							 | 
						||
| 
								 | 
							
								      template rebind_pointer<const value_type>::type                const_pointer;
							 | 
						||
| 
								 | 
							
								   typedef value_type &                                              reference;
							 | 
						||
| 
								 | 
							
								   typedef const value_type &                                        const_reference;
							 | 
						||
| 
								 | 
							
								   static const link_mode_type link_mode = hook_type::hooktags::link_mode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static node_ptr to_node_ptr(reference value)
							 | 
						||
| 
								 | 
							
								   {  return static_cast<node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value)));  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static const_node_ptr to_node_ptr(const_reference value)
							 | 
						||
| 
								 | 
							
								   {  return static_cast<const node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value)));  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static pointer to_value_ptr(const node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {  return Functor::to_value_ptr(to_hook_ptr(n));  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static const_pointer to_value_ptr(const const_node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {  return Functor::to_value_ptr(to_hook_ptr(n));  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   private:
							 | 
						||
| 
								 | 
							
								   static hook_ptr to_hook_ptr(const node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {  return hook_ptr(&*static_cast<hook_type*>(&*n));  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static const_hook_ptr to_hook_ptr(const const_node_ptr & n)
							 | 
						||
| 
								 | 
							
								   {  return const_hook_ptr(&*static_cast<const hook_type*>(&*n));  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} //namespace intrusive
							 | 
						||
| 
								 | 
							
								} //namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif //BOOST_INTRUSIVE_DETAIL_HOOK_TRAITS_HPP
							 |