106 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// (C) Copyright Ion Gaztanaga  2014-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_NODE_CLONER_DISPOSER_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_DETAIL_NODE_CLONER_DISPOSER_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_CONFIG_HPP
							 | 
						||
| 
								 | 
							
								#  include <boost/config.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_HAS_PRAGMA_ONCE)
							 | 
						||
| 
								 | 
							
								#  pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/link_mode.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/mpl.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/ebo_functor_holder.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/algo_type.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/assert.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace intrusive {
							 | 
						||
| 
								 | 
							
								namespace detail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class F, class ValueTraits, algo_types AlgoType, bool IsConst = true>
							 | 
						||
| 
								 | 
							
								struct node_cloner
							 | 
						||
| 
								 | 
							
								   //Use public inheritance to avoid MSVC bugs with closures
							 | 
						||
| 
								 | 
							
								   :  public ebo_functor_holder<F>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   typedef ValueTraits                                      value_traits;
							 | 
						||
| 
								 | 
							
								   typedef typename value_traits::node_traits               node_traits;
							 | 
						||
| 
								 | 
							
								   typedef typename node_traits::node_ptr                   node_ptr;
							 | 
						||
| 
								 | 
							
								   typedef ebo_functor_holder<F>                            base_t;
							 | 
						||
| 
								 | 
							
								   typedef typename get_algo< AlgoType
							 | 
						||
| 
								 | 
							
								                            , node_traits>::type            node_algorithms;
							 | 
						||
| 
								 | 
							
								   static const bool safemode_or_autounlink =
							 | 
						||
| 
								 | 
							
								      is_safe_autounlink<value_traits::link_mode>::value;
							 | 
						||
| 
								 | 
							
								   typedef typename value_traits::value_type                value_type;
							 | 
						||
| 
								 | 
							
								   typedef typename value_traits::pointer                   pointer;
							 | 
						||
| 
								 | 
							
								   typedef typename value_traits::const_pointer             const_pointer;
							 | 
						||
| 
								 | 
							
								   typedef typename node_traits::node                       node;
							 | 
						||
| 
								 | 
							
								   typedef typename value_traits::const_node_ptr            const_node_ptr;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits<pointer>::reference      reference;
							 | 
						||
| 
								 | 
							
								   typedef typename pointer_traits
							 | 
						||
| 
								 | 
							
								      <const_pointer>::reference                            const_reference;
							 | 
						||
| 
								 | 
							
								   typedef typename if_c<IsConst, const_reference, reference>::type reference_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   node_cloner(F f, const ValueTraits *traits)
							 | 
						||
| 
								 | 
							
								      :  base_t(f), traits_(traits)
							 | 
						||
| 
								 | 
							
								   {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   // tree-based containers use this method, which is proxy-reference friendly
							 | 
						||
| 
								 | 
							
								   node_ptr operator()(const node_ptr & p)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      reference_type v = *traits_->to_value_ptr(p);
							 | 
						||
| 
								 | 
							
								      node_ptr n = traits_->to_node_ptr(*base_t::get()(v));
							 | 
						||
| 
								 | 
							
								      //Cloned node must be in default mode if the linking mode requires it
							 | 
						||
| 
								 | 
							
								      BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(n));
							 | 
						||
| 
								 | 
							
								      return n;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   const ValueTraits * const traits_;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class F, class ValueTraits, algo_types AlgoType>
							 | 
						||
| 
								 | 
							
								struct node_disposer
							 | 
						||
| 
								 | 
							
								   //Use public inheritance to avoid MSVC bugs with closures
							 | 
						||
| 
								 | 
							
								   :  public ebo_functor_holder<F>
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   typedef ValueTraits                          value_traits;
							 | 
						||
| 
								 | 
							
								   typedef typename value_traits::node_traits   node_traits;
							 | 
						||
| 
								 | 
							
								   typedef typename node_traits::node_ptr       node_ptr;
							 | 
						||
| 
								 | 
							
								   typedef ebo_functor_holder<F>                base_t;
							 | 
						||
| 
								 | 
							
								   typedef typename get_algo< AlgoType
							 | 
						||
| 
								 | 
							
								                            , node_traits>::type   node_algorithms;
							 | 
						||
| 
								 | 
							
								   static const bool safemode_or_autounlink =
							 | 
						||
| 
								 | 
							
								      is_safe_autounlink<value_traits::link_mode>::value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   node_disposer(F f, const ValueTraits *cont)
							 | 
						||
| 
								 | 
							
								      :  base_t(f), traits_(cont)
							 | 
						||
| 
								 | 
							
								   {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void operator()(const node_ptr & p)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if(safemode_or_autounlink)
							 | 
						||
| 
								 | 
							
								         node_algorithms::init(p);
							 | 
						||
| 
								 | 
							
								      base_t::get()(traits_->to_value_ptr(p));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								   const ValueTraits * const traits_;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}  //namespace detail{
							 | 
						||
| 
								 | 
							
								}  //namespace intrusive{
							 | 
						||
| 
								 | 
							
								}  //namespace boost{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif //BOOST_INTRUSIVE_DETAIL_NODE_CLONER_DISPOSER_HPP
							 |