Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

213 lines
6.2 KiB

// set standard header
#pragma once
#ifndef _SET_
#define _SET_
#include <xtree>
#pragma pack(push,8)
#pragma warning(push,3)
_STD_BEGIN
// TEMPLATE CLASS _Tset_traits
template<class _Kty, // key/value type
class _Pr, // comparator predicate type
class _Alloc, // actual allocator type (should be value allocator)
bool _Mfl> // true if multiple equivalent keys are permitted
class _Tset_traits
{ // traits required to make _Tree behave like a set
public:
typedef _Kty key_type;
typedef _Kty value_type;
typedef _Pr key_compare;
typedef typename _Alloc::_TEMPLATE_MEMBER rebind<value_type>::other
allocator_type;
// use _CPOINTER_X and _CREFERENCE_X for nonmutable set elements
typedef _POINTER_X(value_type, allocator_type) _ITptr;
typedef _REFERENCE_X(value_type, allocator_type) _IReft;
enum
{ // make multi parameter visible as an enumeration constant
_Multi = _Mfl};
_Tset_traits()
: comp()
{ // construct with default comparator
}
_Tset_traits(_Pr _Parg)
: comp(_Parg)
{ // construct with specified comparator
}
typedef key_compare value_compare;
static const _Kty& _Kfn(const value_type& _Val)
{ // extract key from element value
return (_Val);
}
_Pr comp; // the comparator predicate for keys
};
// TEMPLATE CLASS set
template<class _Kty,
class _Pr = less<_Kty>,
class _Alloc = allocator<_Kty> >
class set
: public _Tree<_Tset_traits<_Kty, _Pr, _Alloc, false> >
{ // ordered red-black tree of key values, unique keys
public:
typedef set<_Kty, _Pr, _Alloc> _Myt;
typedef _Tree<_Tset_traits<_Kty, _Pr, _Alloc, false> > _Mybase;
typedef _Kty key_type;
typedef _Pr 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;
set()
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults
}
explicit set(const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct empty set from comparator
}
set(const key_compare& _Pred, const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct empty set from comparator and allocator
}
template<class _Iter>
set(_Iter _First, _Iter _Last)
: _Mybase(key_compare(), allocator_type())
{ // construct set from [_First, _Last), defaults
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
set(_Iter _First, _Iter _Last, const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct set from [_First, _Last), comparator
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
set(_Iter _First, _Iter _Last, const key_compare& _Pred,
const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct set from [_First, _Last), defaults, and allocator
for (; _First != _Last; ++_First)
this->insert(*_First);
}
};
// TEMPLATE CLASS multiset
template<class _Kty,
class _Pr = less<_Kty>,
class _Alloc = allocator<_Kty> >
class multiset
: public _Tree<_Tset_traits<_Kty, _Pr, _Alloc, true> >
{ // ordered red-black tree of key values, non-unique keys
public:
typedef multiset<_Kty, _Pr, _Alloc> _Myt;
typedef _Tree<_Tset_traits<_Kty, _Pr, _Alloc, true> > _Mybase;
typedef _Kty key_type;
typedef _Pr 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;
multiset()
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults
}
explicit multiset(const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct empty set from comparator
}
multiset(const key_compare& _Pred, const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct empty set from comparator and allocator
}
template<class _Iter>
multiset(_Iter _First, _Iter _Last)
: _Mybase(key_compare(), allocator_type())
{ // construct set from [_First, _Last)
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
multiset(_Iter _First, _Iter _Last, const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct set from [_First, _Last), comparator
for (; _First != _Last; ++_First)
this->insert(*_First);
}
template<class _Iter>
multiset(_Iter _First, _Iter _Last, const key_compare& _Pred,
const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct set from [_First, _Last), 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)
for (; _First != _Last; ++_First)
this->insert(*_First);
}
};
_STD_END
#pragma warning(pop)
#pragma pack(pop)
#endif /* _SET_ */
/*
* Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V3.10:0009 */