| ////////////////////////////////////////////////////////////////////////////// |
| // |
| // (C) Copyright Ion Gaztanaga 2005-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_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(std::size_t) |
| { /*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> > |
| { |
| enum{ value = true }; |
| }; |
| /// @endcond |
| |
| } //namespace interprocess { |
| } //namespace boost |
| |
| #include <boost/interprocess/detail/config_end.hpp> |
| |
| #endif //#ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP |