text: //////////////////////////////////////////////////////////////////////////////
  //
  // (C) Copyright Ion Gaztanaga 2007-2009. 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
  
  #include <boost/interprocess/creation_tags.hpp>
  #include <boost/interprocess/detail/type_traits.hpp>
  #include <boost/interprocess/detail/mpl.hpp>
  
  namespace boost {
  namespace interprocess {
  namespace detail {
  
  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(detail::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)T; }
  
     template<class ArgType>
     void construct(void *address, typename enable_if_c<!is_same<ArgType, no_arg_t>::value>::type * = 0) const
     {  new(address)T(m_arg); }
  
     bool operator()(void *address, std::size_t, bool created) const
     {   
        switch(m_creation_type){
           case detail::DoOpen:
              return true;
           break;
           case detail::DoCreate:
           case detail::DoOpenOrCreate:
              if(created){
                 construct<Arg>(address);
              }
              return true;
           break;
  
           default:
              return false;
           break;
        }
     }
     private:
     detail::create_enum_t m_creation_type;
     Arg m_arg;
  };
  
  }  //namespace detail {
  }  //namespace interprocess {
  }  //namespace boost {
  
  #endif   //BOOST_INTERPROCESS_SYNC_NAMED_CREATION_FUNCTOR_HPP
  