2 Copyright 2005-2011 Intel Corporation. All Rights Reserved.
4 This file is part of Threading Building Blocks.
6 Threading Building Blocks is free software; you can redistribute it
7 and/or modify it under the terms of the GNU General Public License
8 version 2 as published by the Free Software Foundation.
10 Threading Building Blocks is distributed in the hope that it will be
11 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
12 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with Threading Building Blocks; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 As a special exception, you may use this file as part of a free software
20 library without restriction. Specifically, if other files instantiate
21 templates or use macros or inline functions from this file, or you compile
22 this file and link it with other files to produce an executable, this
23 file does not by itself cause the resulting executable to be covered by
24 the GNU General Public License. This exception does not however
25 invalidate any other reasons why the executable file might be covered by
26 the GNU General Public License.
29 /* Container implementations in this header are based on PPL implementations
30 provided by Microsoft. */
32 #ifndef __TBB_concurrent_unordered_map_H
33 #define __TBB_concurrent_unordered_map_H
35 #include "internal/_concurrent_unordered_impl.h"
40 namespace interface5 {
42 // Template class for hash map traits
43 template<typename Key, typename T, typename Hash_compare, typename Allocator, bool Allow_multimapping>
44 class concurrent_unordered_map_traits
47 typedef std::pair<const Key, T> value_type;
49 typedef Hash_compare hash_compare;
50 typedef typename Allocator::template rebind<value_type>::other allocator_type;
51 enum { allow_multimapping = Allow_multimapping };
53 concurrent_unordered_map_traits() : my_hash_compare() {}
54 concurrent_unordered_map_traits(const hash_compare& hc) : my_hash_compare(hc) {}
56 class value_compare : public std::binary_function<value_type, value_type, bool>
58 friend class concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
61 bool operator()(const value_type& left, const value_type& right) const
63 return (my_hash_compare(left.first, right.first));
66 value_compare(const hash_compare& comparator) : my_hash_compare(comparator) {}
69 hash_compare my_hash_compare; // the comparator predicate for keys
72 template<class Type1, class Type2>
73 static const Key& get_key(const std::pair<Type1, Type2>& value) {
77 hash_compare my_hash_compare; // the comparator predicate for keys
80 template <typename Key, typename T, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
81 class concurrent_unordered_map : public internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
83 // Base type definitions
84 typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
85 typedef internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
86 typedef concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> traits_type;
87 using traits_type::my_hash_compare;
91 using traits_type::allow_multimapping;
94 using base_type::find;
95 using base_type::insert;
99 typedef typename base_type::value_type value_type;
100 typedef T mapped_type;
101 typedef Hasher hasher;
102 typedef Key_equality key_equal;
103 typedef hash_compare key_compare;
105 typedef typename base_type::allocator_type allocator_type;
106 typedef typename base_type::pointer pointer;
107 typedef typename base_type::const_pointer const_pointer;
108 typedef typename base_type::reference reference;
109 typedef typename base_type::const_reference const_reference;
111 typedef typename base_type::size_type size_type;
112 typedef typename base_type::difference_type difference_type;
114 typedef typename base_type::iterator iterator;
115 typedef typename base_type::const_iterator const_iterator;
116 typedef typename base_type::iterator local_iterator;
117 typedef typename base_type::const_iterator const_local_iterator;
119 // Construction/destruction/copying
120 explicit concurrent_unordered_map(size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
121 const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
122 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
126 concurrent_unordered_map(const Allocator& a) : base_type(8, key_compare(), a)
130 template <typename Iterator>
131 concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
132 const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
133 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
135 for (; first != last; ++first)
136 base_type::insert(*first);
139 concurrent_unordered_map(const concurrent_unordered_map& table) : base_type(table)
143 concurrent_unordered_map(const concurrent_unordered_map& table, const Allocator& a)
144 : base_type(table, a)
148 concurrent_unordered_map& operator=(const concurrent_unordered_map& table)
150 base_type::operator=(table);
154 iterator unsafe_erase(const_iterator where)
156 return base_type::unsafe_erase(where);
159 size_type unsafe_erase(const key_type& key)
161 return base_type::unsafe_erase(key);
164 iterator unsafe_erase(const_iterator first, const_iterator last)
166 return base_type::unsafe_erase(first, last);
169 void swap(concurrent_unordered_map& table)
171 base_type::swap(table);
175 hasher hash_function() const
177 return my_hash_compare.my_hash_object;
180 key_equal key_eq() const
182 return my_hash_compare.my_key_compare_object;
185 mapped_type& operator[](const key_type& key)
187 iterator where = find(key);
191 where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
194 return ((*where).second);
197 mapped_type& at(const key_type& key)
199 iterator where = find(key);
203 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
206 return ((*where).second);
209 const mapped_type& at(const key_type& key) const
211 const_iterator where = find(key);
215 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
218 return ((*where).second);
222 } // namespace interface5
224 using interface5::concurrent_unordered_map;
228 #endif// __TBB_concurrent_unordered_map_H