1*f8a1b7d9SAlexander Kabaev// TR1 unordered_set -*- 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_set 31*f8a1b7d9SAlexander Kabaev * This is a TR1 C++ Library header. 32*f8a1b7d9SAlexander Kabaev */ 33*f8a1b7d9SAlexander Kabaev 34*f8a1b7d9SAlexander Kabaev#ifndef _TR1_UNORDERED_SET 35*f8a1b7d9SAlexander Kabaev#define _TR1_UNORDERED_SET 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 _Value, 47*f8a1b7d9SAlexander Kabaev class _Hash = hash<_Value>, 48*f8a1b7d9SAlexander Kabaev class _Pred = std::equal_to<_Value>, 49*f8a1b7d9SAlexander Kabaev class _Alloc = std::allocator<_Value>, 50*f8a1b7d9SAlexander Kabaev bool __cache_hash_code = false> 51*f8a1b7d9SAlexander Kabaev class unordered_set 52*f8a1b7d9SAlexander Kabaev : public _Hashtable<_Value, _Value, _Alloc, 53*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>, _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, true, true> 58*f8a1b7d9SAlexander Kabaev { 59*f8a1b7d9SAlexander Kabaev typedef _Hashtable<_Value, _Value, _Alloc, 60*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>, _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, true, 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_set(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(), __eql, 80*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>(), __a) 81*f8a1b7d9SAlexander Kabaev { } 82*f8a1b7d9SAlexander Kabaev 83*f8a1b7d9SAlexander Kabaev template<typename _InputIterator> 84*f8a1b7d9SAlexander Kabaev unordered_set(_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(), __eql, 91*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>(), __a) 92*f8a1b7d9SAlexander Kabaev { } 93*f8a1b7d9SAlexander Kabaev }; 94*f8a1b7d9SAlexander Kabaev 95*f8a1b7d9SAlexander Kabaev template<class _Value, 96*f8a1b7d9SAlexander Kabaev class _Hash = hash<_Value>, 97*f8a1b7d9SAlexander Kabaev class _Pred = std::equal_to<_Value>, 98*f8a1b7d9SAlexander Kabaev class _Alloc = std::allocator<_Value>, 99*f8a1b7d9SAlexander Kabaev bool __cache_hash_code = false> 100*f8a1b7d9SAlexander Kabaev class unordered_multiset 101*f8a1b7d9SAlexander Kabaev : public _Hashtable<_Value, _Value, _Alloc, 102*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>, _Pred, 103*f8a1b7d9SAlexander Kabaev _Hash, __detail::_Mod_range_hashing, 104*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash, 105*f8a1b7d9SAlexander Kabaev __detail::_Prime_rehash_policy, 106*f8a1b7d9SAlexander Kabaev __cache_hash_code, true, false> 107*f8a1b7d9SAlexander Kabaev { 108*f8a1b7d9SAlexander Kabaev typedef _Hashtable<_Value, _Value, _Alloc, 109*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>, _Pred, 110*f8a1b7d9SAlexander Kabaev _Hash, __detail::_Mod_range_hashing, 111*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash, 112*f8a1b7d9SAlexander Kabaev __detail::_Prime_rehash_policy, 113*f8a1b7d9SAlexander Kabaev __cache_hash_code, true, false> 114*f8a1b7d9SAlexander Kabaev _Base; 115*f8a1b7d9SAlexander Kabaev 116*f8a1b7d9SAlexander Kabaev public: 117*f8a1b7d9SAlexander Kabaev typedef typename _Base::size_type size_type; 118*f8a1b7d9SAlexander Kabaev typedef typename _Base::hasher hasher; 119*f8a1b7d9SAlexander Kabaev typedef typename _Base::key_equal key_equal; 120*f8a1b7d9SAlexander Kabaev typedef typename _Base::allocator_type allocator_type; 121*f8a1b7d9SAlexander Kabaev 122*f8a1b7d9SAlexander Kabaev explicit 123*f8a1b7d9SAlexander Kabaev unordered_multiset(size_type __n = 10, 124*f8a1b7d9SAlexander Kabaev const hasher& __hf = hasher(), 125*f8a1b7d9SAlexander Kabaev const key_equal& __eql = key_equal(), 126*f8a1b7d9SAlexander Kabaev const allocator_type& __a = allocator_type()) 127*f8a1b7d9SAlexander Kabaev : _Base(__n, __hf, __detail::_Mod_range_hashing(), 128*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash(), __eql, 129*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>(), __a) 130*f8a1b7d9SAlexander Kabaev { } 131*f8a1b7d9SAlexander Kabaev 132*f8a1b7d9SAlexander Kabaev 133*f8a1b7d9SAlexander Kabaev template<typename _InputIterator> 134*f8a1b7d9SAlexander Kabaev unordered_multiset(_InputIterator __f, _InputIterator __l, 135*f8a1b7d9SAlexander Kabaev typename _Base::size_type __n = 0, 136*f8a1b7d9SAlexander Kabaev const hasher& __hf = hasher(), 137*f8a1b7d9SAlexander Kabaev const key_equal& __eql = key_equal(), 138*f8a1b7d9SAlexander Kabaev const allocator_type& __a = allocator_type()) 139*f8a1b7d9SAlexander Kabaev : _Base(__f, __l, __n, __hf, __detail::_Mod_range_hashing(), 140*f8a1b7d9SAlexander Kabaev __detail::_Default_ranged_hash(), __eql, 141*f8a1b7d9SAlexander Kabaev std::_Identity<_Value>(), __a) 142*f8a1b7d9SAlexander Kabaev { } 143*f8a1b7d9SAlexander Kabaev }; 144*f8a1b7d9SAlexander Kabaev 145*f8a1b7d9SAlexander Kabaev template<class _Value, class _Hash, class _Pred, class _Alloc, 146*f8a1b7d9SAlexander Kabaev bool __cache_hash_code> 147*f8a1b7d9SAlexander Kabaev inline void 148*f8a1b7d9SAlexander Kabaev swap (unordered_set<_Value, _Hash, _Pred, 149*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __x, 150*f8a1b7d9SAlexander Kabaev unordered_set<_Value, _Hash, _Pred, 151*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __y) 152*f8a1b7d9SAlexander Kabaev { __x.swap(__y); } 153*f8a1b7d9SAlexander Kabaev 154*f8a1b7d9SAlexander Kabaev template<class _Value, class _Hash, class _Pred, class _Alloc, 155*f8a1b7d9SAlexander Kabaev bool __cache_hash_code> 156*f8a1b7d9SAlexander Kabaev inline void 157*f8a1b7d9SAlexander Kabaev swap(unordered_multiset<_Value, _Hash, _Pred, 158*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __x, 159*f8a1b7d9SAlexander Kabaev unordered_multiset<_Value, _Hash, _Pred, 160*f8a1b7d9SAlexander Kabaev _Alloc, __cache_hash_code>& __y) 161*f8a1b7d9SAlexander Kabaev { __x.swap(__y); } 162*f8a1b7d9SAlexander Kabaev 163*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NAMESPACE 164*f8a1b7d9SAlexander Kabaev} 165*f8a1b7d9SAlexander Kabaev 166*f8a1b7d9SAlexander Kabaev#endif // _TR1_UNORDERED_SET 167