1*f8a1b7d9SAlexander Kabaev// TR1 unordered_map -*- C++ -*- 2*f8a1b7d9SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaev// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. 4*f8a1b7d9SAlexander Kabaev// 5*f8a1b7d9SAlexander Kabaev// This file is part of the GNU ISO C++ Library. This library is free 6*f8a1b7d9SAlexander Kabaev// software; you can redistribute it and/or modify it under the 7*f8a1b7d9SAlexander Kabaev// terms of the GNU General Public License as published by the 8*f8a1b7d9SAlexander Kabaev// Free Software Foundation; either version 2, or (at your option) 9*f8a1b7d9SAlexander Kabaev// any later version. 10*f8a1b7d9SAlexander Kabaev 11*f8a1b7d9SAlexander Kabaev// This library is distributed in the hope that it will be useful, 12*f8a1b7d9SAlexander Kabaev// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*f8a1b7d9SAlexander Kabaev// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*f8a1b7d9SAlexander Kabaev// GNU General Public License for more details. 15*f8a1b7d9SAlexander Kabaev 16*f8a1b7d9SAlexander Kabaev// You should have received a copy of the GNU General Public License along 17*f8a1b7d9SAlexander Kabaev// with this library; see the file COPYING. If not, write to the Free 18*f8a1b7d9SAlexander Kabaev// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19*f8a1b7d9SAlexander Kabaev// USA. 20*f8a1b7d9SAlexander Kabaev 21*f8a1b7d9SAlexander Kabaev// As a special exception, you may use this file as part of a free software 22*f8a1b7d9SAlexander Kabaev// library without restriction. Specifically, if other files instantiate 23*f8a1b7d9SAlexander Kabaev// templates or use macros or inline functions from this file, or you compile 24*f8a1b7d9SAlexander Kabaev// this file and link it with other files to produce an executable, this 25*f8a1b7d9SAlexander Kabaev// file does not by itself cause the resulting executable to be covered by 26*f8a1b7d9SAlexander Kabaev// the GNU General Public License. This exception does not however 27*f8a1b7d9SAlexander Kabaev// invalidate any other reasons why the executable file might be covered by 28*f8a1b7d9SAlexander Kabaev// the GNU General Public License. 29*f8a1b7d9SAlexander Kabaev 30*f8a1b7d9SAlexander Kabaev/** @file tr1/unordered_map 31*f8a1b7d9SAlexander Kabaev * This is a TR1 C++ Library header. 32*f8a1b7d9SAlexander Kabaev */ 33*f8a1b7d9SAlexander Kabaev 34*f8a1b7d9SAlexander Kabaev#ifndef _TR1_UNORDERED_MAP 35*f8a1b7d9SAlexander Kabaev#define _TR1_UNORDERED_MAP 1 36*f8a1b7d9SAlexander Kabaev 37*f8a1b7d9SAlexander Kabaev#include <tr1/hashtable> 38*f8a1b7d9SAlexander Kabaev#include <tr1/functional_hash.h> 39*f8a1b7d9SAlexander Kabaev 40*f8a1b7d9SAlexander Kabaevnamespace std 41*f8a1b7d9SAlexander Kabaev{ 42*f8a1b7d9SAlexander Kabaev_GLIBCXX_BEGIN_NAMESPACE(tr1) 43*f8a1b7d9SAlexander Kabaev 44*f8a1b7d9SAlexander Kabaev // XXX When we get typedef templates these class definitions 45*f8a1b7d9SAlexander Kabaev // will be unnecessary. 46*f8a1b7d9SAlexander Kabaev template<class _Key, class _Tp, 47*f8a1b7d9SAlexander Kabaev class _Hash = hash<_Key>, 48*f8a1b7d9SAlexander Kabaev class _Pred = std::equal_to<_Key>, 49*f8a1b7d9SAlexander Kabaev class _Alloc = std::allocator<std::pair<const _Key, _Tp> >, 50*f8a1b7d9SAlexander Kabaev bool __cache_hash_code = false> 51*f8a1b7d9SAlexander Kabaev class unordered_map 52*f8a1b7d9SAlexander Kabaev : public _Hashtable<_Key, std::pair<const _Key, _Tp>, _Alloc, 53*f8a1b7d9SAlexander Kabaev std::_Select1st<std::pair<const _Key, _Tp> >, _Pred, 54*f8a1b7d9SAlexander Kabaev _Hash, __detail::_Mod_range_hashing, 55*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash, 56*f8a1b7d9SAlexander Kabaev __detail::_Prime_rehash_policy, 57*f8a1b7d9SAlexander Kabaev __cache_hash_code, false, true> 58*f8a1b7d9SAlexander Kabaev { 59*f8a1b7d9SAlexander Kabaev typedef _Hashtable<_Key, std::pair<const _Key, _Tp>, _Alloc, 60*f8a1b7d9SAlexander Kabaev std::_Select1st<std::pair<const _Key, _Tp> >, _Pred, 61*f8a1b7d9SAlexander Kabaev _Hash, __detail::_Mod_range_hashing, 62*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash, 63*f8a1b7d9SAlexander Kabaev __detail::_Prime_rehash_policy, 64*f8a1b7d9SAlexander Kabaev __cache_hash_code, false, true> 65*f8a1b7d9SAlexander Kabaev _Base; 66*f8a1b7d9SAlexander Kabaev 67*f8a1b7d9SAlexander Kabaev public: 68*f8a1b7d9SAlexander Kabaev typedef typename _Base::size_type size_type; 69*f8a1b7d9SAlexander Kabaev typedef typename _Base::hasher hasher; 70*f8a1b7d9SAlexander Kabaev typedef typename _Base::key_equal key_equal; 71*f8a1b7d9SAlexander Kabaev typedef typename _Base::allocator_type allocator_type; 72*f8a1b7d9SAlexander Kabaev 73*f8a1b7d9SAlexander Kabaev explicit 74*f8a1b7d9SAlexander Kabaev unordered_map(size_type __n = 10, 75*f8a1b7d9SAlexander Kabaev const hasher& __hf = hasher(), 76*f8a1b7d9SAlexander Kabaev const key_equal& __eql = key_equal(), 77*f8a1b7d9SAlexander Kabaev const allocator_type& __a = allocator_type()) 78*f8a1b7d9SAlexander Kabaev : _Base(__n, __hf, __detail::_Mod_range_hashing(), 79*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash(), 80*f8a1b7d9SAlexander Kabaev __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a) 81*f8a1b7d9SAlexander Kabaev { } 82*f8a1b7d9SAlexander Kabaev 83*f8a1b7d9SAlexander Kabaev template<typename _InputIterator> 84*f8a1b7d9SAlexander Kabaev unordered_map(_InputIterator __f, _InputIterator __l, 85*f8a1b7d9SAlexander Kabaev size_type __n = 10, 86*f8a1b7d9SAlexander Kabaev const hasher& __hf = hasher(), 87*f8a1b7d9SAlexander Kabaev const key_equal& __eql = key_equal(), 88*f8a1b7d9SAlexander Kabaev const allocator_type& __a = allocator_type()) 89*f8a1b7d9SAlexander Kabaev : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(), 90*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash(), 91*f8a1b7d9SAlexander Kabaev __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a) 92*f8a1b7d9SAlexander Kabaev { } 93*f8a1b7d9SAlexander Kabaev }; 94*f8a1b7d9SAlexander Kabaev 95*f8a1b7d9SAlexander Kabaev template<class _Key, class _Tp, 96*f8a1b7d9SAlexander Kabaev class _Hash = hash<_Key>, 97*f8a1b7d9SAlexander Kabaev class _Pred = std::equal_to<_Key>, 98*f8a1b7d9SAlexander Kabaev class _Alloc = std::allocator<std::pair<const _Key, _Tp> >, 99*f8a1b7d9SAlexander Kabaev bool __cache_hash_code = false> 100*f8a1b7d9SAlexander Kabaev class unordered_multimap 101*f8a1b7d9SAlexander Kabaev : public _Hashtable<_Key, std::pair<const _Key, _Tp>, 102*f8a1b7d9SAlexander Kabaev _Alloc, 103*f8a1b7d9SAlexander Kabaev std::_Select1st<std::pair<const _Key, _Tp> >, _Pred, 104*f8a1b7d9SAlexander Kabaev _Hash, __detail::_Mod_range_hashing, 105*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash, 106*f8a1b7d9SAlexander Kabaev __detail::_Prime_rehash_policy, 107*f8a1b7d9SAlexander Kabaev __cache_hash_code, false, false> 108*f8a1b7d9SAlexander Kabaev { 109*f8a1b7d9SAlexander Kabaev typedef _Hashtable<_Key, std::pair<const _Key, _Tp>, 110*f8a1b7d9SAlexander Kabaev _Alloc, 111*f8a1b7d9SAlexander Kabaev std::_Select1st<std::pair<const _Key, _Tp> >, _Pred, 112*f8a1b7d9SAlexander Kabaev _Hash, __detail::_Mod_range_hashing, 113*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash, 114*f8a1b7d9SAlexander Kabaev __detail::_Prime_rehash_policy, 115*f8a1b7d9SAlexander Kabaev __cache_hash_code, false, false> 116*f8a1b7d9SAlexander Kabaev _Base; 117*f8a1b7d9SAlexander Kabaev 118*f8a1b7d9SAlexander Kabaev public: 119*f8a1b7d9SAlexander Kabaev typedef typename _Base::size_type size_type; 120*f8a1b7d9SAlexander Kabaev typedef typename _Base::hasher hasher; 121*f8a1b7d9SAlexander Kabaev typedef typename _Base::key_equal key_equal; 122*f8a1b7d9SAlexander Kabaev typedef typename _Base::allocator_type allocator_type; 123*f8a1b7d9SAlexander Kabaev 124*f8a1b7d9SAlexander Kabaev explicit 125*f8a1b7d9SAlexander Kabaev unordered_multimap(size_type __n = 10, 126*f8a1b7d9SAlexander Kabaev const hasher& __hf = hasher(), 127*f8a1b7d9SAlexander Kabaev const key_equal& __eql = key_equal(), 128*f8a1b7d9SAlexander Kabaev const allocator_type& __a = allocator_type()) 129*f8a1b7d9SAlexander Kabaev : _Base(__n, __hf, __detail::_Mod_range_hashing(), 130*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash(), 131*f8a1b7d9SAlexander Kabaev __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a) 132*f8a1b7d9SAlexander Kabaev { } 133*f8a1b7d9SAlexander Kabaev 134*f8a1b7d9SAlexander Kabaev 135*f8a1b7d9SAlexander Kabaev template<typename _InputIterator> 136*f8a1b7d9SAlexander Kabaev unordered_multimap(_InputIterator __f, _InputIterator __l, 137*f8a1b7d9SAlexander Kabaev typename _Base::size_type __n = 0, 138*f8a1b7d9SAlexander Kabaev const hasher& __hf = hasher(), 139*f8a1b7d9SAlexander Kabaev const key_equal& __eql = key_equal(), 140*f8a1b7d9SAlexander Kabaev const allocator_type& __a = allocator_type()) 141*f8a1b7d9SAlexander Kabaev : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(), 142*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash(), 143*f8a1b7d9SAlexander Kabaev __eql, std::_Select1st<std::pair<const _Key, _Tp> >(), __a) 144*f8a1b7d9SAlexander Kabaev { } 145*f8a1b7d9SAlexander Kabaev }; 146*f8a1b7d9SAlexander Kabaev 147*f8a1b7d9SAlexander Kabaev template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, 148*f8a1b7d9SAlexander Kabaev bool __cache_hash_code> 149*f8a1b7d9SAlexander Kabaev inline void 150*f8a1b7d9SAlexander Kabaev swap(unordered_map<_Key, _Tp, _Hash, _Pred, 151*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __x, 152*f8a1b7d9SAlexander Kabaev unordered_map<_Key, _Tp, _Hash, _Pred, 153*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __y) 154*f8a1b7d9SAlexander Kabaev { __x.swap(__y); } 155*f8a1b7d9SAlexander Kabaev 156*f8a1b7d9SAlexander Kabaev template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, 157*f8a1b7d9SAlexander Kabaev bool __cache_hash_code> 158*f8a1b7d9SAlexander Kabaev inline void 159*f8a1b7d9SAlexander Kabaev swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, 160*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __x, 161*f8a1b7d9SAlexander Kabaev unordered_multimap<_Key, _Tp, _Hash, _Pred, 162*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __y) 163*f8a1b7d9SAlexander Kabaev { __x.swap(__y); } 164*f8a1b7d9SAlexander Kabaev 165*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NAMESPACE 166*f8a1b7d9SAlexander Kabaev} 167*f8a1b7d9SAlexander Kabaev 168*f8a1b7d9SAlexander Kabaev#endif // _TR1_UNORDERED_MAP 169