| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 | ////////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2005-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_ISET_INDEX_HPP#define BOOST_INTERPROCESS_ISET_INDEX_HPP#ifndef BOOST_CONFIG_HPP#  include <boost/config.hpp>#endif##if defined(BOOST_HAS_PRAGMA_ONCE)#  pragma once#endif#include <boost/interprocess/detail/config_begin.hpp>#include <boost/interprocess/detail/workaround.hpp>#include <boost/intrusive/detail/minimal_pair_header.hpp>#include <boost/interprocess/detail/utilities.hpp>#include <boost/intrusive/detail/minimal_pair_header.hpp>         //std::pair#include <boost/intrusive/detail/minimal_less_equal_header.hpp>   //std::less#include <boost/container/detail/minimal_char_traits_header.hpp>  //std::char_traits#include <boost/intrusive/set.hpp>//!\file//!Describes index adaptor of boost::intrusive::set container, to use it//!as name/shared memory indexnamespace boost {namespace interprocess {#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)//!Helper class to define typedefs from IndexTraitstemplate <class MapConfig>struct iset_index_aux{   typedef typename      MapConfig::segment_manager_base                          segment_manager_base;   typedef typename      segment_manager_base::void_pointer                       void_pointer;   typedef typename bi::make_set_base_hook      < bi::void_pointer<void_pointer>      , bi::optimize_size<true>      >::type                                                  derivation_hook;   typedef typename MapConfig::template      intrusive_value_type<derivation_hook>::type              value_type;   typedef std::less<value_type>                               value_compare;   typedef typename bi::make_set      < value_type      , bi::base_hook<derivation_hook>      >::type                                                  index_t;};#endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED//!Index type based in boost::intrusive::set.//!Just derives from boost::intrusive::set//!and defines the interface needed by managed memory segments*/template <class MapConfig>class iset_index   //Derive class from map specialization   :  public iset_index_aux<MapConfig>::index_t{   #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)   typedef iset_index_aux<MapConfig>                     index_aux;   typedef typename index_aux::index_t                   index_type;   typedef typename MapConfig::      intrusive_compare_key_type                         intrusive_compare_key_type;   typedef typename MapConfig::char_type                 char_type;   #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED   public:   typedef typename index_type::iterator                 iterator;   typedef typename index_type::const_iterator           const_iterator;   typedef typename index_type::insert_commit_data       insert_commit_data;   typedef typename index_type::value_type               value_type;   #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)   private:   struct intrusive_key_value_less   {      bool operator()(const intrusive_compare_key_type &i, const value_type &b) const      {         std::size_t blen = b.name_length();         return (i.m_len < blen) ||                  (i.m_len == blen &&                  std::char_traits<char_type>::compare                     (i.mp_str, b.name(), i.m_len) < 0);      }      bool operator()(const value_type &b, const intrusive_compare_key_type &i) const      {         std::size_t blen = b.name_length();         return (blen < i.m_len) ||                  (blen == i.m_len &&                  std::char_traits<char_type>::compare                     (b.name(), i.mp_str, i.m_len) < 0);      }   };   #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED   public:   //!Constructor. Takes a pointer to the   //!segment manager. Can throw   iset_index(typename MapConfig::segment_manager_base *)      : index_type(/*typename index_aux::value_compare()*/)   {}   //!This reserves memory to optimize the insertion of n   //!elements in the index   void reserve(typename MapConfig::segment_manager_base::size_type)   {  /*Does nothing, map has not reserve or rehash*/  }   //!This frees all unnecessary memory   void shrink_to_fit()   {  /*Does nothing, this intrusive index does not allocate memory;*/   }   iterator find(const intrusive_compare_key_type &key)   {  return index_type::find(key, intrusive_key_value_less());  }   const_iterator find(const intrusive_compare_key_type &key) const   {  return index_type::find(key, intrusive_key_value_less());  }   std::pair<iterator, bool>insert_check      (const intrusive_compare_key_type &key, insert_commit_data &commit_data)   {  return index_type::insert_check(key, intrusive_key_value_less(), commit_data); }};#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)//!Trait class to detect if an index is an intrusive//!index.template<class MapConfig>struct is_intrusive_index   <boost::interprocess::iset_index<MapConfig> >{   static const bool value = true;};#endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED}  //namespace interprocess {}  //namespace boost#include <boost/interprocess/detail/config_end.hpp>#endif   //#ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP
 |