82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// (C) Copyright Ion Gaztanaga 2007-2012. 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/interprocess for documentation.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_INTERPROCESS_SYNC_NAMED_CREATION_FUNCTOR_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_INTERPROCESS_SYNC_NAMED_CREATION_FUNCTOR_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_CONFIG_HPP
							 | 
						||
| 
								 | 
							
								#  include <boost/config.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_HAS_PRAGMA_ONCE)
							 | 
						||
| 
								 | 
							
								#  pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/interprocess/creation_tags.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/interprocess/detail/type_traits.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/interprocess/detail/mpl.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/container/detail/placement_new.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace interprocess {
							 | 
						||
| 
								 | 
							
								namespace ipcdetail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct named_creation_functor_no_arg{};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T, class Arg = named_creation_functor_no_arg>
							 | 
						||
| 
								 | 
							
								class named_creation_functor
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   typedef named_creation_functor_no_arg no_arg_t;
							 | 
						||
| 
								 | 
							
								   public:
							 | 
						||
| 
								 | 
							
								   named_creation_functor(create_enum_t type, Arg arg = Arg())
							 | 
						||
| 
								 | 
							
								      :  m_creation_type(type), m_arg(arg){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   template<class ArgType>
							 | 
						||
| 
								 | 
							
								   void construct(void *address, typename enable_if_c<is_same<ArgType, no_arg_t>::value>::type * = 0) const
							 | 
						||
| 
								 | 
							
								   {  ::new(address, boost_container_new_t())T; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   template<class ArgType>
							 | 
						||
| 
								 | 
							
								   void construct(void *address, typename enable_if_c<!is_same<ArgType, no_arg_t>::value>::type * = 0) const
							 | 
						||
| 
								 | 
							
								   {  ::new(address, boost_container_new_t())T(m_arg); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool operator()(void *address, std::size_t, bool created) const
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      switch(m_creation_type){
							 | 
						||
| 
								 | 
							
								         case DoOpen:
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								         break;
							 | 
						||
| 
								 | 
							
								         case DoCreate:
							 | 
						||
| 
								 | 
							
								         case DoOpenOrCreate:
							 | 
						||
| 
								 | 
							
								            if(created){
							 | 
						||
| 
								 | 
							
								               construct<Arg>(address);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								         break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         default:
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								         break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static std::size_t get_min_size()
							 | 
						||
| 
								 | 
							
								   {  return sizeof(T);  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   private:
							 | 
						||
| 
								 | 
							
								   create_enum_t m_creation_type;
							 | 
						||
| 
								 | 
							
								   Arg m_arg;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}  //namespace ipcdetail {
							 | 
						||
| 
								 | 
							
								}  //namespace interprocess {
							 | 
						||
| 
								 | 
							
								}  //namespace boost {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif   //BOOST_INTERPROCESS_SYNC_NAMED_CREATION_FUNCTOR_HPP
							 |