windows-nt/Source/XPSP1/NT/base/crts/crtw32/stdhpp/hash_set
2020-09-26 16:20:57 +08:00

212 lines
6.2 KiB
Plaintext

// hash_set standard header
#pragma once
#ifndef _HASH_SET_
#define _HASH_SET_
#include <xhash>
#pragma pack(push,8)
#pragma warning(push,3)
_STD_BEGIN
// TEMPLATE CLASS _Hset_traits
template<class _Kty, // key type (same as value type)
class _Tr, // comparator predicate type
class _Alloc, // actual allocator type (should be value allocator)
bool _Mfl> // true if multiple equivalent keys are permitted
class _Hset_traits
{ // traits required to make _Hash behave like a set
public:
typedef _Kty key_type;
typedef _Kty value_type;
typedef _Tr key_compare;
typedef typename _Alloc::_TEMPLATE_MEMBER rebind<value_type>::other
allocator_type;
enum
{ // make multi parameter visible as an enum constant
_Multi = _Mfl};
_Hset_traits()
: comp()
{ // construct with default comparator
}
_Hset_traits(const _Tr& _Traits)
: comp(_Traits)
{ // construct with specified comparator
}
typedef key_compare value_compare;
static const _Kty& _Kfn(const value_type& _Val)
{ // return entire value as key
return (_Val);
}
_Tr comp; // the comparator predicate for keys
};
// TEMPLATE CLASS hash_set
template<class _Kty,
class _Tr = hash_compare<_Kty, less<_Kty> >,
class _Alloc = allocator<_Kty> >
class hash_set
: public _Hash<_Hset_traits<_Kty, _Tr, _Alloc, false> >
{ // hash table of key values, unique keys
public:
typedef hash_set<_Kty, _Tr, _Alloc> _Myt;
typedef _Hash<_Hset_traits<_Kty, _Tr, _Alloc, false> > _Mybase;
typedef _Kty key_type;
typedef _Tr key_compare;
typedef typename _Mybase::value_compare value_compare;
typedef typename _Mybase::allocator_type allocator_type;
typedef typename _Mybase::size_type size_type;
typedef typename _Mybase::difference_type difference_type;
typedef typename _Mybase::pointer pointer;
typedef typename _Mybase::const_pointer const_pointer;
typedef typename _Mybase::reference reference;
typedef typename _Mybase::const_reference const_reference;
typedef typename _Mybase::iterator iterator;
typedef typename _Mybase::const_iterator const_iterator;
typedef typename _Mybase::reverse_iterator reverse_iterator;
typedef typename _Mybase::const_reverse_iterator
const_reverse_iterator;
typedef typename _Mybase::value_type value_type;
hash_set()
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults
}
explicit hash_set(const key_compare& _Traits)
: _Mybase(_Traits, allocator_type())
{ // construct empty set from comparator
}
hash_set(const key_compare& _Traits, const allocator_type& _Al)
: _Mybase(_Traits, _Al)
{ // construct empty set from comparator and allocator
}
template<class _Iter>
hash_set(_Iter _First, _Iter _Last)
: _Mybase(key_compare(), allocator_type())
{ // construct set from sequence, defaults
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
hash_set(_Iter _First, _Iter _Last, const key_compare& _Traits)
: _Mybase(_Traits, allocator_type())
{ // construct set from sequence, comparator
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
hash_set(_Iter _First, _Iter _Last, const key_compare& _Traits,
const allocator_type& _Al)
: _Mybase(_Traits, _Al)
{ // construct set from sequence, comparator, and allocator
for (; _First != _Last; ++_First)
this->insert(*_First);
}
};
// TEMPLATE CLASS hash_multiset
template<class _Kty,
class _Tr = hash_compare<_Kty, less<_Kty> >,
class _Alloc = allocator<_Kty> >
class hash_multiset
: public _Hash<_Hset_traits<_Kty, _Tr, _Alloc, true> >
{ // hash table of key values, non-unique keys
public:
typedef hash_multiset<_Kty, _Tr, _Alloc> _Myt;
typedef _Hash<_Hset_traits<_Kty, _Tr, _Alloc, true> > _Mybase;
typedef _Kty key_type;
typedef _Tr key_compare;
typedef typename _Mybase::value_compare value_compare;
typedef typename _Mybase::allocator_type allocator_type;
typedef typename _Mybase::size_type size_type;
typedef typename _Mybase::difference_type difference_type;
typedef typename _Mybase::pointer pointer;
typedef typename _Mybase::const_pointer const_pointer;
typedef typename _Mybase::reference reference;
typedef typename _Mybase::const_reference const_reference;
typedef typename _Mybase::iterator iterator;
typedef typename _Mybase::const_iterator const_iterator;
typedef typename _Mybase::reverse_iterator reverse_iterator;
typedef typename _Mybase::const_reverse_iterator
const_reverse_iterator;
typedef typename _Mybase::value_type value_type;
hash_multiset()
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults
}
explicit hash_multiset(const key_compare& _Traits)
: _Mybase(_Traits, allocator_type())
{ // construct empty set from comparator
}
hash_multiset(const key_compare& _Traits,
const allocator_type& _Al)
: _Mybase(_Traits, _Al)
{ // construct empty set from comparator and allocator
}
template<class _Iter>
hash_multiset(_Iter _First, _Iter _Last)
: _Mybase(key_compare(), allocator_type())
{ // construct from sequence, defaults
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
hash_multiset(_Iter _First, _Iter _Last, const key_compare& _Traits)
: _Mybase(_Traits, allocator_type())
{ // construct from sequence, comparator
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
hash_multiset(_Iter _First, _Iter _Last, const key_compare& _Traits,
const allocator_type& _Al)
: _Mybase(_Traits, _Al)
{ // construct from sequence, comparator, and allocator
for (; _First != _Last; ++_First)
this->insert(*_First);
}
iterator insert(const value_type& _Val)
{ // insert a key value
return (_Mybase::insert(_Val).first);
}
iterator insert(iterator _Where, const value_type& _Val)
{ // insert a key value, with hint
return (_Mybase::insert(_Where, _Val));
}
template<class _Iter>
void insert(_Iter _First, _Iter _Last)
{ // insert [_First, _Last), arbitrary iterators
for (; _First != _Last; ++_First)
insert(*_First);
}
};
_STD_END
#pragma warning(pop)
#pragma pack(pop)
#endif /* _HASH_SET_ */
/*
* Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V3.10:0009 */