summaryrefslogtreecommitdiff
path: root/boost/interprocess/indexes/iset_index.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/interprocess/indexes/iset_index.hpp')
-rw-r--r--boost/interprocess/indexes/iset_index.hpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/boost/interprocess/indexes/iset_index.hpp b/boost/interprocess/indexes/iset_index.hpp
new file mode 100644
index 0000000000..966239290a
--- /dev/null
+++ b/boost/interprocess/indexes/iset_index.hpp
@@ -0,0 +1,150 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2011. 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
+
+#include <boost/interprocess/detail/config_begin.hpp>
+#include <boost/interprocess/detail/workaround.hpp>
+
+#include <string>
+#include <functional>
+#include <utility>
+#include <boost/interprocess/detail/utilities.hpp>
+#include <boost/intrusive/set.hpp>
+
+
+//!\file
+//!Describes index adaptor of boost::intrusive::set container, to use it
+//!as name/shared memory index
+
+namespace boost {
+namespace interprocess {
+
+/// @cond
+
+//!Helper class to define typedefs from IndexTraits
+template <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;
+};
+/// @endcond
+
+//!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
+{
+ /// @cond
+ 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;
+ /// @endcond
+
+ 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;
+
+ /// @cond
+ 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);
+ }
+ };
+
+ /// @endcond
+
+ 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); }
+};
+
+/// @cond
+
+//!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;
+};
+/// @endcond
+
+} //namespace interprocess {
+} //namespace boost
+
+#include <boost/interprocess/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP