• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/interprocess for documentation.
8 //
9 //////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP
12 #define BOOST_INTERPROCESS_ISET_INDEX_HPP
13 
14 #ifndef BOOST_CONFIG_HPP
15 #  include <boost/config.hpp>
16 #endif
17 #
18 #if defined(BOOST_HAS_PRAGMA_ONCE)
19 #  pragma once
20 #endif
21 
22 #include <boost/interprocess/detail/config_begin.hpp>
23 #include <boost/interprocess/detail/workaround.hpp>
24 
25 #include <boost/intrusive/detail/minimal_pair_header.hpp>
26 #include <boost/interprocess/detail/utilities.hpp>
27 #include <boost/intrusive/detail/minimal_pair_header.hpp>         //std::pair
28 #include <boost/intrusive/detail/minimal_less_equal_header.hpp>   //std::less
29 #include <boost/container/detail/minimal_char_traits_header.hpp>  //std::char_traits
30 #include <boost/intrusive/set.hpp>
31 
32 //!\file
33 //!Describes index adaptor of boost::intrusive::set container, to use it
34 //!as name/shared memory index
35 
36 namespace boost {
37 namespace interprocess {
38 
39 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
40 
41 //!Helper class to define typedefs from IndexTraits
42 template <class MapConfig>
43 struct iset_index_aux
44 {
45    typedef typename
46       MapConfig::segment_manager_base                          segment_manager_base;
47 
48    typedef typename
49       segment_manager_base::void_pointer                       void_pointer;
50    typedef typename bi::make_set_base_hook
51       < bi::void_pointer<void_pointer>
52       , bi::optimize_size<true>
53       >::type                                                  derivation_hook;
54 
55    typedef typename MapConfig::template
56       intrusive_value_type<derivation_hook>::type              value_type;
57    typedef std::less<value_type>                               value_compare;
58    typedef typename bi::make_set
59       < value_type
60       , bi::base_hook<derivation_hook>
61       >::type                                                  index_t;
62 };
63 #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
64 
65 //!Index type based in boost::intrusive::set.
66 //!Just derives from boost::intrusive::set
67 //!and defines the interface needed by managed memory segments*/
68 template <class MapConfig>
69 class iset_index
70    //Derive class from map specialization
71    :  public iset_index_aux<MapConfig>::index_t
72 {
73    #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
74    typedef iset_index_aux<MapConfig>                     index_aux;
75    typedef typename index_aux::index_t                   index_type;
76    typedef typename MapConfig::
77       intrusive_compare_key_type                         intrusive_compare_key_type;
78    typedef typename MapConfig::char_type                 char_type;
79    #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
80 
81    public:
82    typedef typename index_type::iterator                 iterator;
83    typedef typename index_type::const_iterator           const_iterator;
84    typedef typename index_type::insert_commit_data       insert_commit_data;
85    typedef typename index_type::value_type               value_type;
86 
87    #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
88    private:
89 
90    struct intrusive_key_value_less
91    {
operator ()boost::interprocess::iset_index::intrusive_key_value_less92       bool operator()(const intrusive_compare_key_type &i, const value_type &b) const
93       {
94          std::size_t blen = b.name_length();
95          return (i.m_len < blen) ||
96                   (i.m_len == blen &&
97                   std::char_traits<char_type>::compare
98                      (i.mp_str, b.name(), i.m_len) < 0);
99       }
100 
operator ()boost::interprocess::iset_index::intrusive_key_value_less101       bool operator()(const value_type &b, const intrusive_compare_key_type &i) const
102       {
103          std::size_t blen = b.name_length();
104          return (blen < i.m_len) ||
105                   (blen == i.m_len &&
106                   std::char_traits<char_type>::compare
107                      (b.name(), i.mp_str, i.m_len) < 0);
108       }
109    };
110 
111    #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
112 
113    public:
114 
115    //!Constructor. Takes a pointer to the
116    //!segment manager. Can throw
iset_index(typename MapConfig::segment_manager_base *)117    iset_index(typename MapConfig::segment_manager_base *)
118       : index_type(/*typename index_aux::value_compare()*/)
119    {}
120 
121    //!This reserves memory to optimize the insertion of n
122    //!elements in the index
reserve(typename MapConfig::segment_manager_base::size_type)123    void reserve(typename MapConfig::segment_manager_base::size_type)
124    {  /*Does nothing, map has not reserve or rehash*/  }
125 
126    //!This frees all unnecessary memory
shrink_to_fit()127    void shrink_to_fit()
128    {  /*Does nothing, this intrusive index does not allocate memory;*/   }
129 
find(const intrusive_compare_key_type & key)130    iterator find(const intrusive_compare_key_type &key)
131    {  return index_type::find(key, intrusive_key_value_less());  }
132 
find(const intrusive_compare_key_type & key) const133    const_iterator find(const intrusive_compare_key_type &key) const
134    {  return index_type::find(key, intrusive_key_value_less());  }
135 
insert_check(const intrusive_compare_key_type & key,insert_commit_data & commit_data)136    std::pair<iterator, bool>insert_check
137       (const intrusive_compare_key_type &key, insert_commit_data &commit_data)
138    {  return index_type::insert_check(key, intrusive_key_value_less(), commit_data); }
139 };
140 
141 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
142 
143 //!Trait class to detect if an index is an intrusive
144 //!index.
145 template<class MapConfig>
146 struct is_intrusive_index
147    <boost::interprocess::iset_index<MapConfig> >
148 {
149    static const bool value = true;
150 };
151 #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
152 
153 }  //namespace interprocess {
154 }  //namespace boost
155 
156 #include <boost/interprocess/detail/config_end.hpp>
157 
158 #endif   //#ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP
159