// Copyright (C) 2003-2004 Jeremy B. Maitin-Shepard. // Copyright (C) 2005-2008 Daniel James. // 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/unordered for documentation #ifndef BOOST_UNORDERED_SET_HPP_INCLUDED #define BOOST_UNORDERED_SET_HPP_INCLUDED #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include #include #include #include #include namespace boost { template , class Pred = std::equal_to, class Alloc = std::allocator > class unordered_set { typedef boost::unordered_detail::hash_types_unique_keys< Value, Value, Hash, Pred, Alloc > implementation; BOOST_DEDUCED_TYPENAME implementation::hash_table base; public: // types typedef Value key_type; typedef Value value_type; typedef Hash hasher; typedef Pred key_equal; typedef Alloc allocator_type; typedef BOOST_DEDUCED_TYPENAME allocator_type::pointer pointer; typedef BOOST_DEDUCED_TYPENAME allocator_type::const_pointer const_pointer; typedef BOOST_DEDUCED_TYPENAME allocator_type::reference reference; typedef BOOST_DEDUCED_TYPENAME allocator_type::const_reference const_reference; typedef BOOST_DEDUCED_TYPENAME implementation::size_type size_type; typedef BOOST_DEDUCED_TYPENAME implementation::difference_type difference_type; typedef BOOST_DEDUCED_TYPENAME implementation::const_iterator iterator; typedef BOOST_DEDUCED_TYPENAME implementation::const_iterator const_iterator; typedef BOOST_DEDUCED_TYPENAME implementation::const_local_iterator local_iterator; typedef BOOST_DEDUCED_TYPENAME implementation::const_local_iterator const_local_iterator; // construct/destroy/copy explicit unordered_set( size_type n = boost::unordered_detail::default_initial_bucket_count, const hasher &hf = hasher(), const key_equal &eql = key_equal(), const allocator_type &a = allocator_type()) : base(n, hf, eql, a) { } template unordered_set(InputIterator f, InputIterator l) : base(f, l, boost::unordered_detail::default_initial_bucket_count, hasher(), key_equal(), allocator_type()) { } template unordered_set(InputIterator f, InputIterator l, size_type n, const hasher &hf = hasher(), const key_equal &eql = key_equal(), const allocator_type &a = allocator_type()) : base(f, l, n, hf, eql, a) { } private: BOOST_DEDUCED_TYPENAME implementation::iterator_base const& get(const_iterator const& it) { return boost::unordered_detail::iterator_access::get(it); } public: allocator_type get_allocator() const { return base.get_allocator(); } // size and capacity bool empty() const { return base.empty(); } size_type size() const { return base.size(); } size_type max_size() const { return base.max_size(); } // iterators iterator begin() { return iterator(base.begin()); } const_iterator begin() const { return const_iterator(base.begin()); } iterator end() { return iterator(base.end()); } const_iterator end() const { return const_iterator(base.end()); } const_iterator cbegin() const { return const_iterator(base.begin()); } const_iterator cend() const { return const_iterator(base.end()); } // modifiers std::pair insert(const value_type& obj) { return boost::unordered_detail::pair_cast( base.insert(obj)); } iterator insert(const_iterator hint, const value_type& obj) { return iterator(base.insert(get(hint), obj)); } template void insert(InputIterator first, InputIterator last) { base.insert(first, last); } iterator erase(const_iterator position) { return iterator(base.erase(get(position))); } size_type erase(const key_type& k) { return base.erase(k); } iterator erase(const_iterator first, const_iterator last) { return iterator(base.erase(get(first), get(last))); } void clear() { base.clear(); } void swap(unordered_set& other) { base.swap(other.base); } // observers hasher hash_function() const { return base.hash_function(); } key_equal key_eq() const { return base.key_eq(); } // lookup const_iterator find(const key_type& k) const { return const_iterator(base.find(k)); } size_type count(const key_type& k) const { return base.count(k); } std::pair equal_range(const key_type& k) const { return boost::unordered_detail::pair_cast( base.equal_range(k)); } // bucket interface size_type bucket_count() const { return base.bucket_count(); } size_type max_bucket_count() const { return base.max_bucket_count(); } size_type bucket_size(size_type n) const { return base.bucket_size(n); } size_type bucket(const key_type& k) const { return base.bucket(k); } local_iterator begin(size_type n) { return local_iterator(base.begin(n)); } const_local_iterator begin(size_type n) const { return const_local_iterator(base.begin(n)); } local_iterator end(size_type n) { return local_iterator(base.end(n)); } const_local_iterator end(size_type n) const { return const_local_iterator(base.end(n)); } const_local_iterator cbegin(size_type n) const { return const_local_iterator(base.begin(n)); } const_local_iterator cend(size_type n) const { return const_local_iterator(base.end(n)); } // hash policy float load_factor() const { return base.load_factor(); } float max_load_factor() const { return base.max_load_factor(); } void max_load_factor(float m) { base.max_load_factor(m); } void rehash(size_type n) { base.rehash(n); } }; // class template unordered_set template void swap(unordered_set &m1, unordered_set &m2) { m1.swap(m2); } template , class Pred = std::equal_to, class Alloc = std::allocator > class unordered_multiset { typedef boost::unordered_detail::hash_types_equivalent_keys< Value, Value, Hash, Pred, Alloc > implementation; BOOST_DEDUCED_TYPENAME implementation::hash_table base; public: //types typedef Value key_type; typedef Value value_type; typedef Hash hasher; typedef Pred key_equal; typedef Alloc allocator_type; typedef BOOST_DEDUCED_TYPENAME allocator_type::pointer pointer; typedef BOOST_DEDUCED_TYPENAME allocator_type::const_pointer const_pointer; typedef BOOST_DEDUCED_TYPENAME allocator_type::reference reference; typedef BOOST_DEDUCED_TYPENAME allocator_type::const_reference const_reference; typedef BOOST_DEDUCED_TYPENAME implementation::size_type size_type; typedef BOOST_DEDUCED_TYPENAME implementation::difference_type difference_type; typedef BOOST_DEDUCED_TYPENAME implementation::const_iterator iterator; typedef BOOST_DEDUCED_TYPENAME implementation::const_iterator const_iterator; typedef BOOST_DEDUCED_TYPENAME implementation::const_local_iterator local_iterator; typedef BOOST_DEDUCED_TYPENAME implementation::const_local_iterator const_local_iterator; // construct/destroy/copy explicit unordered_multiset( size_type n = boost::unordered_detail::default_initial_bucket_count, const hasher &hf = hasher(), const key_equal &eql = key_equal(), const allocator_type &a = allocator_type()) : base(n, hf, eql, a) { } template unordered_multiset(InputIterator f, InputIterator l) : base(f, l, boost::unordered_detail::default_initial_bucket_count, hasher(), key_equal(), allocator_type()) { } template unordered_multiset(InputIterator f, InputIterator l, size_type n, const hasher &hf = hasher(), const key_equal &eql = key_equal(), const allocator_type &a = allocator_type()) : base(f, l, n, hf, eql, a) { } private: BOOST_DEDUCED_TYPENAME implementation::iterator_base const& get(const_iterator const& it) { return boost::unordered_detail::iterator_access::get(it); } public: allocator_type get_allocator() const { return base.get_allocator(); } // size and capacity bool empty() const { return base.empty(); } size_type size() const { return base.size(); } size_type max_size() const { return base.max_size(); } // iterators iterator begin() { return iterator(base.begin()); } const_iterator begin() const { return const_iterator(base.begin()); } iterator end() { return iterator(base.end()); } const_iterator end() const { return const_iterator(base.end()); } const_iterator cbegin() const { return const_iterator(base.begin()); } const_iterator cend() const { return const_iterator(base.end()); } // modifiers iterator insert(const value_type& obj) { return iterator(base.insert(obj)); } iterator insert(const_iterator hint, const value_type& obj) { return iterator(base.insert(get(hint), obj)); } template void insert(InputIterator first, InputIterator last) { base.insert(first, last); } iterator erase(const_iterator position) { return iterator(base.erase(get(position))); } size_type erase(const key_type& k) { return base.erase(k); } iterator erase(const_iterator first, const_iterator last) { return iterator(base.erase(get(first), get(last))); } void clear() { base.clear(); } void swap(unordered_multiset& other) { base.swap(other.base); } // observers hasher hash_function() const { return base.hash_function(); } key_equal key_eq() const { return base.key_eq(); } // lookup const_iterator find(const key_type& k) const { return const_iterator(base.find(k)); } size_type count(const key_type& k) const { return base.count(k); } std::pair equal_range(const key_type& k) const { return boost::unordered_detail::pair_cast( base.equal_range(k)); } // bucket interface size_type bucket_count() const { return base.bucket_count(); } size_type max_bucket_count() const { return base.max_bucket_count(); } size_type bucket_size(size_type n) const { return base.bucket_size(n); } size_type bucket(const key_type& k) const { return base.bucket(k); } local_iterator begin(size_type n) { return local_iterator(base.begin(n)); } const_local_iterator begin(size_type n) const { return const_local_iterator(base.begin(n)); } local_iterator end(size_type n) { return local_iterator(base.end(n)); } const_local_iterator end(size_type n) const { return const_local_iterator(base.end(n)); } const_local_iterator cbegin(size_type n) const { return const_local_iterator(base.begin(n)); } const_local_iterator cend(size_type n) const { return const_local_iterator(base.end(n)); } // hash policy float load_factor() const { return base.load_factor(); } float max_load_factor() const { return base.max_load_factor(); } void max_load_factor(float m) { base.max_load_factor(m); } void rehash(size_type n) { base.rehash(n); } }; // class template unordered_multiset template void swap(unordered_multiset &m1, unordered_multiset &m2) { m1.swap(m2); } } // namespace boost #endif // BOOST_UNORDERED_SET_HPP_INCLUDED