STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Public Types | Public Member Functions | Public Attributes | Static Public Attributes | Private Attributes | List of all members
cliext::impl::hash< _Traits_t > Class Template Reference
Inheritance diagram for cliext::impl::hash< _Traits_t >:

Public Types

typedef hash< _Traits_t > _Mytype_t
 
typedef _Traits_t _Mybase_t
 
typedef _Traits_t::key_type _Key_t
 
typedef _Traits_t::value_type _Value_t
 
typedef _STLCLR IHash< _Key_t, _Value_t_Mycont_it
 
typedef System::Collections::Generic::IEnumerable< _Value_t_Myenum_it
 
typedef cli::array< _Value_t_Myarray_t
 
typedef list< _Value_t_Mylist_t
 
typedef list_node< _Value_tnode_type
 
typedef cli::array< node_type^> _Myvector_t
 
typedef _Mylist_t::iterator iterator
 
typedef _Mylist_t::const_iterator const_iterator
 
typedef _Mylist_t::reverse_iterator reverse_iterator
 
typedef _Mylist_t::const_reverse_iterator const_reverse_iterator
 
typedef _Traits_t::key_type key_type
 
typedef _Traits_t::value_type value_type
 
typedef _Traits_t::key_compare key_compare
 
typedef _Traits_t::value_compare value_compare
 
typedef _Traits_t::hasher hasher
 
typedef int size_type
 
typedef int difference_type
 
typedef value_type reference
 
typedef value_type const_reference
 
typedef _Mycont_it generic_container
 
typedef value_type generic_value
 
typedef _STLCLR Generic::ContainerBidirectionalIterator< _Value_tgeneric_iterator
 
typedef _Mylist_t::generic_reverse_iterator generic_reverse_iterator
 
typedef _STLCLR GenericPair< iterator, boolpair_iter_bool
 
typedef _STLCLR GenericPair< iterator, iteratorpair_iter_iter
 
typedef _STLCLR GenericPair< node_type^, bool_Pairnb
 
typedef _STLCLR GenericPair< node_type^, node_type^> _Pairnn
 
typedef _STLCLR GenericPair< generic_iterator^, boolgeneric_pair_iter_bool
 
typedef _STLCLR GenericPair< generic_iterator^, generic_iterator^> generic_pair_iter_iter
 

Public Member Functions

 hash ()
 
 hash (hash%_Right)
 
hash operator= (hash%_Right)
 
 operator _Mycont_it^ ()
 
 hash (key_compare^_Pred)
 
 hash (key_compare^_Pred, hasher^_Hashfn)
 
 ~hash ()
 
unsigned long get_generation ()
 
node_type get_node (iterator _Where)
 
node_type hash_node (size_type _Idx)
 
void set_hash_node (size_type _Idx, node_type^_Node)
 
node_type front_node ()
 
node_type back_node ()
 
node_type head_node ()
 
_Myarray_t to_array ()
 
key_compare key_comp () new
 
value_compare value_comp () new
 
hasher hash_delegate () new
 
iterator make_iterator (node_type^_Node)
 
iterator begin ()
 
iterator end ()
 
reverse_iterator rbegin ()
 
reverse_iterator rend ()
 
size_type size ()
 
bool empty ()
 
int bucket_count ()
 
float load_factor ()
 
float max_load_factor ()
 
void max_load_factor (float _Newmax)
 
void rehash (int _Buckets)
 
pair_iter_bool insert (value_type _Val)
 
iterator insert (iterator, value_type _Val)
 
template<typename _Iter_t >
void insert (_Iter_t _First, _Iter_t _Last)
 
void insert (_STLCLR Generic::IInputIterator< _Value_t >^_First, _STLCLR Generic::IInputIterator< _Value_t >^_Last)
 
void insert (_Myenum_it^_Right)
 
void insert (System::Collections::IEnumerable^_Right)
 
_Pairnb insert_node (value_type _Val, list_node< value_type >^_Newnode)
 
iterator erase (iterator _Where)
 
iterator erase (iterator _First, iterator _Last)
 
size_type erase (key_type _Keyval)
 
node_type erase_node (node_type^_Where)
 
void clear ()
 
void swap (_Mytype_t%_Right)
 
iterator find (key_type _Keyval)
 
size_type count (key_type _Keyval)
 
iterator lower_bound (key_type _Keyval)
 
node_type lower_bound_node (key_type _Keyval)
 
iterator upper_bound (key_type _Keyval)
 
node_type upper_bound_node (key_type _Keyval)
 
pair_iter_iter equal_range (key_type _Keyval)
 
_Pairnn equal_range_node (key_type _Keyval)
 
void dumptab ()
 
 for (;_Idx< _Oldsize;++_Idx) _Newvector[_Idx]
 
 for (;_Idx< _Newvector->Length;++_Idx) _Newvector[_Idx]
 
void _Grow (int _Buckets)
 
size_type _Hashval (key_type%_Keyval)
 
void _Init (int _Buckets)
 
void _Reinsert ()
 
void _Rebuild_table (int _Buckets)
 
int _True_buckets (int _Buckets)
 
virtual System::Object Clone ()
 

Public Attributes

_STLCLR_FIELD_ACCESS __pad0__: void _Resize(size_type _Newsize
 
_STLCLR_FIELD_ACCESS node_type _Pad
 
size_type _Oldsize = _Myvector == nullptr ? 0 : _Myvector->Length
 
_Myvector_t _Newvector = gcnew _Myvector_t(_Newsize)
 
 _Myvector = _Newvector
 
_Mylist_t _Mylist
 
_Myvector_t _Myvector
 
unsigned long _Mygen
 
int _Mask
 
int _Maxidx
 
float _Max_load_factor
 

Static Public Attributes

static const int _Maxsize = MAX_CONTAINER_SIZE
 
static const int _Default_load = 4
 
static const int _Default_buckets = 16
 

Private Attributes

property size_type Count
 
property bool IsSynchronized
 
property System::Object SyncRoot
 

Member Typedef Documentation

template<typename _Traits_t>
typedef _Traits_t::key_type cliext::impl::hash< _Traits_t >::_Key_t
template<typename _Traits_t>
typedef cli::array<_Value_t> cliext::impl::hash< _Traits_t >::_Myarray_t
template<typename _Traits_t>
typedef _Traits_t cliext::impl::hash< _Traits_t >::_Mybase_t
template<typename _Traits_t>
typedef _STLCLR IHash<_Key_t, _Value_t> cliext::impl::hash< _Traits_t >::_Mycont_it
template<typename _Traits_t>
typedef System::Collections::Generic::IEnumerable<_Value_t> cliext::impl::hash< _Traits_t >::_Myenum_it
template<typename _Traits_t>
typedef list<_Value_t> cliext::impl::hash< _Traits_t >::_Mylist_t
template<typename _Traits_t>
typedef hash<_Traits_t> cliext::impl::hash< _Traits_t >::_Mytype_t
template<typename _Traits_t>
typedef cli::array<node_type^> cliext::impl::hash< _Traits_t >::_Myvector_t
template<typename _Traits_t>
typedef _STLCLR GenericPair<node_type^, bool> cliext::impl::hash< _Traits_t >::_Pairnb
template<typename _Traits_t>
typedef _STLCLR GenericPair<node_type^, node_type^> cliext::impl::hash< _Traits_t >::_Pairnn
template<typename _Traits_t>
typedef _Traits_t::value_type cliext::impl::hash< _Traits_t >::_Value_t
template<typename _Traits_t>
typedef _Mylist_t::const_iterator cliext::impl::hash< _Traits_t >::const_iterator
template<typename _Traits_t>
typedef value_type cliext::impl::hash< _Traits_t >::const_reference
template<typename _Traits_t>
typedef _Mylist_t::const_reverse_iterator cliext::impl::hash< _Traits_t >::const_reverse_iterator
template<typename _Traits_t>
typedef int cliext::impl::hash< _Traits_t >::difference_type
template<typename _Traits_t>
typedef _Mycont_it cliext::impl::hash< _Traits_t >::generic_container
template<typename _Traits_t>
typedef _STLCLR Generic::ContainerBidirectionalIterator<_Value_t> cliext::impl::hash< _Traits_t >::generic_iterator
template<typename _Traits_t>
typedef _STLCLR GenericPair<generic_iterator^, bool> cliext::impl::hash< _Traits_t >::generic_pair_iter_bool
template<typename _Traits_t>
typedef _STLCLR GenericPair<generic_iterator^, generic_iterator^> cliext::impl::hash< _Traits_t >::generic_pair_iter_iter
template<typename _Traits_t>
typedef _Mylist_t::generic_reverse_iterator cliext::impl::hash< _Traits_t >::generic_reverse_iterator
template<typename _Traits_t>
typedef value_type cliext::impl::hash< _Traits_t >::generic_value
template<typename _Traits_t>
typedef _Traits_t::hasher cliext::impl::hash< _Traits_t >::hasher
template<typename _Traits_t>
typedef _Mylist_t::iterator cliext::impl::hash< _Traits_t >::iterator
template<typename _Traits_t>
typedef _Traits_t::key_compare cliext::impl::hash< _Traits_t >::key_compare
template<typename _Traits_t>
typedef _Traits_t::key_type cliext::impl::hash< _Traits_t >::key_type
template<typename _Traits_t>
typedef list_node<_Value_t> cliext::impl::hash< _Traits_t >::node_type
template<typename _Traits_t>
typedef _STLCLR GenericPair<iterator, bool> cliext::impl::hash< _Traits_t >::pair_iter_bool
template<typename _Traits_t>
typedef _STLCLR GenericPair<iterator, iterator> cliext::impl::hash< _Traits_t >::pair_iter_iter
template<typename _Traits_t>
typedef value_type cliext::impl::hash< _Traits_t >::reference
template<typename _Traits_t>
typedef _Mylist_t::reverse_iterator cliext::impl::hash< _Traits_t >::reverse_iterator
template<typename _Traits_t>
typedef int cliext::impl::hash< _Traits_t >::size_type
template<typename _Traits_t>
typedef _Traits_t::value_compare cliext::impl::hash< _Traits_t >::value_compare
template<typename _Traits_t>
typedef _Traits_t::value_type cliext::impl::hash< _Traits_t >::value_type

Constructor & Destructor Documentation

template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::hash ( )
inline
100  { // construct empty hash from default
101  _Init(0);
102  }
void _Init(int _Buckets)
Definition: xhash:681
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::hash ( hash< _Traits_t >%  _Right)
inline
105  : _Mybase_t(_Right.comp, _Right.hash_fun)
106  { // construct by copying _Right
107  _Init(_Right.bucket_count());
109  _Right._Mylist->front_node(), _Right._Mylist->head_node());
110  _Reinsert();
111  }
void _Init(int _Buckets)
Definition: xhash:681
void _Reinsert()
Definition: xhash:694
_Mylist_t _Mylist
Definition: xhash:727
void insert_node(node_type^_Where, size_type _Count, value_type _Val)
Definition: list:578
_Traits_t _Mybase_t
Definition: xhash:44
node_type head_node()
Definition: list:264
const _Ty & _Right
Definition: algorithm:4087
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::hash ( key_compare _Pred)
inlineexplicit
132  : _Mybase_t(_Pred)
133  { // construct empty hash from compare
134  _Init(0);
135  }
_FwdIt const _Ty _Pr _Pred
Definition: algorithm:1985
void _Init(int _Buckets)
Definition: xhash:681
_Traits_t _Mybase_t
Definition: xhash:44
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::hash ( key_compare _Pred,
hasher _Hashfn 
)
inline
138  : _Mybase_t(_Pred, _Hashfn)
139  { // construct empty hash from compare and hash
140  _Init(0);
141  }
_FwdIt const _Ty _Pr _Pred
Definition: algorithm:1985
void _Init(int _Buckets)
Definition: xhash:681
_Traits_t _Mybase_t
Definition: xhash:44
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::~hash ( )
inline
145  { // destroy the object
146  clear();
147  _Mylist = nullptr;
148  _Myvector = nullptr;
149  ++_Mygen;
150  }
void clear()
Definition: xhash:466
_Mylist_t _Mylist
Definition: xhash:727
unsigned long _Mygen
Definition: xhash:729
_Myvector
Definition: xhash:608

Member Function Documentation

template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::_Grow ( int  _Buckets)
inline
612  { // incrementally grow table
613  for (; bucket_count() < _Buckets; )
614  { // too dense, need to grow hash table
615  node_type^ _Node;
616 
617  if (_Myvector->Length - 1 <= _Maxidx)
618  { // table full, double its size
619  _Mask = ((_Myvector->Length - 1) << 1) - 1;
620  _Resize(_Mask + 2, head_node());
621  }
622  else if (_Mask < _Maxidx)
623  _Mask = (_Mask << 1) + 1;
624 
625  size_type _Bucket = _Maxidx - (_Mask >> 1) - 1;
626 
627  for (_Node = hash_node(_Bucket);
628  _Node != hash_node(_Bucket + 1); )
629  { // split old bucket
630  size_type _Newbucket =
631  this->hash_fun(this->get_key(_Node->_Myval)) & _Mask;
632 
633  if (_Newbucket == _Bucket)
634  _Node = _Node->next_node(); // leave element in old bucket
635  else
636  { // move element to new bucket
637  size_type _Idx;
638  node_type^ _Next = _Node->next_node();
639 
640  if (_Next != head_node())
641  { // not at end, move it
642  for (_Idx = _Bucket; _Node == hash_node(_Idx); )
643  { // update end iterators if moving first
644  set_hash_node(_Idx, _Next);
645  if (--_Idx < 0)
646  break;
647  }
649  (list_node<value_type>^)_Node,
650  (list_node<value_type>^)_Next);
651  _Node = back_node();
652  _Myvector[_Maxidx + 1] = head_node();
653  }
654 
655  for (_Idx = _Maxidx; _Bucket < _Idx; --_Idx)
656  { // update end iterators if new bucket filled
657  if (hash_node(_Idx) != head_node())
658  break;
659  set_hash_node(_Idx, _Node);
660  }
661 
662  if (_Next == head_node())
663  break;
664  else
665  _Node = _Next;
666  }
667  }
668  ++_Maxidx; // open new bucket for hash lookup
669  }
670  }
for(;_Idx< _Oldsize;++_Idx) _Newvector[_Idx]
node_type head_node()
Definition: xhash:183
int bucket_count()
Definition: xhash:257
int _Maxidx
Definition: xhash:732
_Mylist_t _Mylist
Definition: xhash:727
node_type back_node()
Definition: xhash:178
int _Mask
Definition: xhash:731
void set_hash_node(size_type _Idx, node_type^_Node)
Definition: xhash:168
list_node< _Value_t > node_type
Definition: xhash:52
_Myvector
Definition: xhash:608
int size_type
Definition: xhash:70
node_type head_node()
Definition: list:264
void splice_node(node_type^_Where, _Mytype_t^_Right, node_type^_First, node_type^_Last)
Definition: list:714
node_type hash_node(size_type _Idx)
Definition: xhash:163
template<typename _Traits_t>
size_type cliext::impl::hash< _Traits_t >::_Hashval ( key_type _Keyval)
inline
673  { // return hash value, masked and wrapped to current table size
674  size_type _Num = this->hash_fun(_Keyval) & _Mask;
675 
676  if (_Maxidx <= _Num)
677  _Num -= (_Mask >> 1) + 1;
678  return (_Num);
679  }
int _Maxidx
Definition: xhash:732
int _Mask
Definition: xhash:731
int size_type
Definition: xhash:70
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::_Init ( int  _Buckets)
inline
682  { // initialize for a minimum table size of _Buckets
683  _Buckets = _True_buckets(_Buckets);
684  _Mylist = gcnew _Mylist_t;
685  _Myvector = nullptr;
686  _Resize(_Buckets + 1, head_node());
687  _Mygen = 0;
688 
689  _Mask = _Buckets - 1;
690  _Maxidx = _Buckets;
692  }
float _Max_load_factor
Definition: xhash:733
node_type head_node()
Definition: xhash:183
int _Maxidx
Definition: xhash:732
int _True_buckets(int _Buckets)
Definition: xhash:714
static const int _Default_load
Definition: xhash:95
_Mylist_t _Mylist
Definition: xhash:727
int _Mask
Definition: xhash:731
unsigned long _Mygen
Definition: xhash:729
_Myvector
Definition: xhash:608
list< _Value_t > _Mylist_t
Definition: xhash:51
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::_Rebuild_table ( int  _Buckets)
inline
705  { // rebuild hash table
706  _Myvector = nullptr;
707  _Resize(_Buckets + 1, head_node());
708  _Mask = _Buckets - 1;
709  _Maxidx = _Buckets; // blow away old hash table
710 
711  _Reinsert(); // insert old list into table
712  }
node_type head_node()
Definition: xhash:183
int _Maxidx
Definition: xhash:732
void _Reinsert()
Definition: xhash:694
int _Mask
Definition: xhash:731
_Myvector
Definition: xhash:608
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::_Reinsert ( )
inline
695  { // insert elements at beginning of list into table
696  for (; front_node() != hash_node(0); )
697  { // hash another node
698  list_node<value_type>^ _Node = _Mylist->front_node();
699 
700  insert_node(_Node->_Myval, _Node);
701  }
702  }
_Pairnb insert_node(value_type _Val, list_node< value_type >^_Newnode)
Definition: xhash:372
node_type front_node()
Definition: list:254
_Mylist_t _Mylist
Definition: xhash:727
node_type front_node()
Definition: xhash:173
node_type hash_node(size_type _Idx)
Definition: xhash:163
template<typename _Traits_t>
int cliext::impl::hash< _Traits_t >::_True_buckets ( int  _Buckets)
inline
715  { // canonicalize bucket count
716  if (_Buckets < 0)
717  throw gcnew System::ArgumentException();
718 
719  int _Newsize = _Default_buckets;
720 
721  for (; _Newsize < _Buckets && _Newsize < _Maxsize / 2; )
722  _Newsize *= 2; // double until big enough
723  return (_Newsize);
724  }
static const int _Default_buckets
Definition: xhash:96
static const int _Maxsize
Definition: xhash:94
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::back_node ( )
inline
179  { // return rightmost node in list
180  return (_Mylist->back_node());
181  }
node_type back_node()
Definition: list:259
_Mylist_t _Mylist
Definition: xhash:727
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::begin ( )
inline
222  { // return iterator for beginning of mutable sequence
223  return (_Mylist->begin());
224  }
_Mylist_t _Mylist
Definition: xhash:727
iterator begin()
Definition: list:331
template<typename _Traits_t>
int cliext::impl::hash< _Traits_t >::bucket_count ( )
inline
258  { // return number of buckets in table
259  return (_Maxidx);
260  }
int _Maxidx
Definition: xhash:732
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::clear ( )
inline
467  { // erase all
468  _Mylist->clear();
469  _Rebuild_table(_Myvector->Length - 1);
470  ++_Mygen;
471  }
void clear()
Definition: list:670
_Mylist_t _Mylist
Definition: xhash:727
unsigned long _Mygen
Definition: xhash:729
_Myvector
Definition: xhash:608
void _Rebuild_table(int _Buckets)
Definition: xhash:704
template<typename _Traits_t>
virtual System::Object cliext::impl::hash< _Traits_t >::Clone ( )
inlinevirtual

Reimplemented in cliext::hash_multimap< _Key1_t, _Mapped_t >, cliext::hash_map< _Key1_t, _Mapped_t >, cliext::hash_multiset< _Key1_t >, and cliext::hash_set< _Key1_t >.

738  { // clone the hash
739  return (gcnew hash(*this));
740  }
hash()
Definition: xhash:99
template<typename _Traits_t>
size_type cliext::impl::hash< _Traits_t >::count ( key_type  _Keyval)
inline
509  { // count all elements that match _Keyval
510  node_type^ _First = lower_bound_node(_Keyval);
511  node_type^ _Last = upper_bound_node(_Keyval);
512  size_type _Num = 0;
513 
514  for (; _First != _Last; _First = _First->next_node())
515  ++_Num;
516  return (_Num);
517  }
node_type upper_bound_node(key_type _Keyval)
Definition: xhash:542
list_node< _Value_t > node_type
Definition: xhash:52
node_type lower_bound_node(key_type _Keyval)
Definition: xhash:524
int size_type
Definition: xhash:70
_FwdIt _Last
Definition: algorithm:1936
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::dumptab ( )
inline
571  {
572  int i;
573  int siz = _Myvector->Length;
574 
575  System::Console::WriteLine("\nmaxidx = {0}, mask = {1}", _Maxidx, _Mask);
576  for (i = 0; i < siz; ++i)
577  {
578  node_type^ p;
579 
580  System::Console::Write("bucket {0}:", i);
581  if (hash_node(i) != head_node())
582  System::Console::Write("begins with {0}:",
583  (char)hash_node(i)->_Myval->first);
584  if (hash_node(i) == head_node())
585  break;
586  else if (i + 1 == siz)
587  for (p = hash_node(i); p != head_node(); p = p->next_node())
588  System::Console::Write(" {0}", (char)p->_Myval->first);
589  else
590  for (p = hash_node(i); p != hash_node(i + 1); p = p->next_node())
591  System::Console::Write(" {0}", (char)p->_Myval->first);
592  System::Console::WriteLine(" end");
593  }
594  System::Console::WriteLine("dump end");
595  }
node_type head_node()
Definition: xhash:183
int _Maxidx
Definition: xhash:732
int i[4]
Definition: dvec.h:70
int _Mask
Definition: xhash:731
list_node< _Value_t > node_type
Definition: xhash:52
_Myvector
Definition: xhash:608
node_type hash_node(size_type _Idx)
Definition: xhash:163
template<typename _Traits_t>
bool cliext::impl::hash< _Traits_t >::empty ( )
inline
253  { // test if sequence is empty
254  return (size() == 0);
255  }
size_type size()
Definition: xhash:247
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::end ( )
inline
227  { // return iterator for end of mutable sequence
228  return (_Mylist->end());
229  }
_Mylist_t _Mylist
Definition: xhash:727
iterator end()
Definition: list:336
template<typename _Traits_t>
pair_iter_iter cliext::impl::hash< _Traits_t >::equal_range ( key_type  _Keyval)
inline
558  { // find range equivalent to _Keyval
559  _Pairnn _Ans = equal_range_node(_Keyval);
560  return (pair_iter_iter(iterator(_Ans.first),
561  iterator(_Ans.second)));
562  }
Definition: xutility:337
_STLCLR GenericPair< node_type^, node_type^> _Pairnn
Definition: xhash:86
_STLCLR GenericPair< iterator, iterator > pair_iter_iter
Definition: xhash:84
_Pairnn equal_range_node(key_type _Keyval)
Definition: xhash:564
_Mylist_t::iterator iterator
Definition: xhash:56
template<typename _Traits_t>
_Pairnn cliext::impl::hash< _Traits_t >::equal_range_node ( key_type  _Keyval)
inline
565  { // find range equivalent to _Keyval
566  return (_Pairnn(lower_bound_node(_Keyval),
567  upper_bound_node(_Keyval)));
568  }
node_type upper_bound_node(key_type _Keyval)
Definition: xhash:542
_STLCLR GenericPair< node_type^, node_type^> _Pairnn
Definition: xhash:86
node_type lower_bound_node(key_type _Keyval)
Definition: xhash:524
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::erase ( iterator  _Where)
inline
420  { // erase element at _Where
421  return (make_iterator(erase_node(get_node(_Where))));
422  }
iterator make_iterator(node_type^_Node)
Definition: xhash:216
node_type erase_node(node_type^_Where)
Definition: xhash:448
node_type get_node(iterator _Where)
Definition: xhash:158
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::erase ( iterator  _First,
iterator  _Last 
)
inline
425  { // erase [_First, _Last)
426  node_type^ _First_node = get_node(_First);
427  node_type^ _Last_node = get_node(_Last);
428 
429  if (_First_node == front_node() && _Last_node == head_node())
430  clear(); // erase all
431  else
432  for (; _First_node != _Last_node; )
433  _First_node = erase_node(_First_node);
434  return (_Last);
435  }
node_type head_node()
Definition: xhash:183
void clear()
Definition: xhash:466
list_node< _Value_t > node_type
Definition: xhash:52
node_type erase_node(node_type^_Where)
Definition: xhash:448
node_type front_node()
Definition: xhash:173
node_type get_node(iterator _Where)
Definition: xhash:158
template<typename _Traits_t>
size_type cliext::impl::hash< _Traits_t >::erase ( key_type  _Keyval)
inline
438  { // erase and count all that match _Keyval
439  node_type^ _First = lower_bound_node(_Keyval);
440  node_type^ _Last = upper_bound_node(_Keyval);
441  size_type _Num = 0;
442 
443  for (; _First != _Last; ++_Num)
444  _First = erase_node(_First); // erase an element matching key
445  return (_Num);
446  }
node_type upper_bound_node(key_type _Keyval)
Definition: xhash:542
list_node< _Value_t > node_type
Definition: xhash:52
node_type erase_node(node_type^_Where)
Definition: xhash:448
node_type lower_bound_node(key_type _Keyval)
Definition: xhash:524
int size_type
Definition: xhash:70
_FwdIt _Last
Definition: algorithm:1936
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::erase_node ( node_type _Where)
inline
449  { // erase node at _Where
450  if (_Where->container() != _Mylist || _Where->is_head())
451  throw gcnew System::InvalidOperationException();
452 
453  size_type _Bucket = _Hashval(this->get_key(_Where->_Myval));
454 
455  for (; _Where == hash_node(_Bucket); --_Bucket)
456  { // update end iterators if erasing first
457  set_hash_node(_Bucket, hash_node(_Bucket)->next_node());
458  if (_Bucket == 0)
459  break;
460  }
461 
462  ++_Mygen;
463  return (_Mylist->erase_node((list_node<value_type>^)_Where));
464  }
size_type _Hashval(key_type%_Keyval)
Definition: xhash:672
_Mylist_t _Mylist
Definition: xhash:727
void set_hash_node(size_type _Idx, node_type^_Node)
Definition: xhash:168
unsigned long _Mygen
Definition: xhash:729
node_type erase_node(node_type^_Where)
Definition: list:645
int size_type
Definition: xhash:70
node_type hash_node(size_type _Idx)
Definition: xhash:163
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::find ( key_type  _Keyval)
inline
504  { // find an element that matches _Keyval, return iterator
505  return (make_iterator(lower_bound_node(_Keyval)));
506  }
iterator make_iterator(node_type^_Node)
Definition: xhash:216
node_type lower_bound_node(key_type _Keyval)
Definition: xhash:524
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::for ( )
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::for ( ;_Idx< _Newvector->Length;++  _Idx)
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::front_node ( )
inline
174  { // return leftmost node in list
175  return (_Mylist->front_node());
176  }
node_type front_node()
Definition: list:254
_Mylist_t _Mylist
Definition: xhash:727
template<typename _Traits_t>
unsigned long cliext::impl::hash< _Traits_t >::get_generation ( )
inline
154  { // get underlying container generation
155  return (_Mygen);
156  }
unsigned long _Mygen
Definition: xhash:729
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::get_node ( iterator  _Where)
inline
159  { // get node from valid iterator
160  return (_Mylist->get_node(_Mylist_t::iterator(_Where)));
161  }
BidirectionalIterator< _Mytype_t > iterator
Definition: list:121
node_type get_node(iterator _Where)
Definition: list:245
_Mylist_t _Mylist
Definition: xhash:727
template<typename _Traits_t>
hasher cliext::impl::hash< _Traits_t >::hash_delegate ( )
inlinenew
211  { // return object for hashing key
212  return (_Mybase_t::hash_delegate());
213  }
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::hash_node ( size_type  _Idx)
inline
164  { // get node from hash table
165  return (_Myvector[_Idx]);
166  }
_Myvector
Definition: xhash:608
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::head_node ( )
inline
184  { // get head node
185  return (_Mylist->head_node());
186  }
_Mylist_t _Mylist
Definition: xhash:727
node_type head_node()
Definition: list:264
template<typename _Traits_t>
pair_iter_bool cliext::impl::hash< _Traits_t >::insert ( value_type  _Val)
inline
301  { // try to insert node with value _Val, return iterator, bool
302  _Pairnb _Ans = insert_node(_Val, nullptr);
303 
304  return (pair_iter_bool(iterator(_Ans.first),
305  _Ans.second));
306  }
_Pairnb insert_node(value_type _Val, list_node< value_type >^_Newnode)
Definition: xhash:372
_STLCLR GenericPair< node_type^, bool > _Pairnb
Definition: xhash:85
_STLCLR GenericPair< iterator, bool > pair_iter_bool
Definition: xhash:83
_FwdIt const _Ty _Val
Definition: algorithm:1938
_Mylist_t::iterator iterator
Definition: xhash:56
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::insert ( iterator  ,
value_type  _Val 
)
inline
310  { // try to insert node with value _Val at _Where, return iterator
311  _Pairnb _Ans = insert_node(_Val, nullptr);
312 
313  return (make_iterator(_Ans.first));
314  }
_Pairnb insert_node(value_type _Val, list_node< value_type >^_Newnode)
Definition: xhash:372
_STLCLR GenericPair< node_type^, bool > _Pairnb
Definition: xhash:85
iterator make_iterator(node_type^_Node)
Definition: xhash:216
_FwdIt const _Ty _Val
Definition: algorithm:1938
template<typename _Traits_t>
template<typename _Iter_t >
void cliext::impl::hash< _Traits_t >::insert ( _Iter_t  _First,
_Iter_t  _Last 
)
inline
318  { // insert [_First, _Last) one at a time
319 #pragma warning(push)
320 #pragma warning(disable: 4127)
321  if (_Iter_container(_First) != _Mylist)
322  for (; _First != _Last; ++_First)
323  insert_node(*_First, nullptr);
324  else if (_Multi)
325  { // worth assigning to self
326  for (; _First != _Last; ++_First)
327  _Mylist->insert_node(_Mylist->front_node(), 1, *_First);
328  _Reinsert();
329  }
330 #pragma warning(pop)
331  }
_Pairnb insert_node(value_type _Val, list_node< value_type >^_Newnode)
Definition: xhash:372
void _Reinsert()
Definition: xhash:694
node_type front_node()
Definition: list:254
_Mylist_t _Mylist
Definition: xhash:727
void insert_node(node_type^_Where, size_type _Count, value_type _Val)
Definition: list:578
System::Object _Iter_container(_Iter_t%_Next)
Definition: iterator:4248
_FwdIt _Last
Definition: algorithm:1936
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::insert ( _STLCLR Generic::IInputIterator< _Value_t >^  _First,
_STLCLR Generic::IInputIterator< _Value_t >^  _Last 
)
inline
336  { // insert [_First, _Last) one at a time
337 #pragma warning(push)
338 #pragma warning(disable: 4127)
339  if (_First->container() != _Mylist)
340  for (; !_First->equal_to(_Last); _First->next())
341  insert_node((value_type%)_First->get_cref(), nullptr);
342  else if (_Multi)
343  { // worth assigning to self
344  for (; !_First->equal_to(_Last); _First->next())
346  (value_type%)_First->get_cref());
347  _Reinsert();
348  }
349 #pragma warning(pop)
350  }
_Pairnb insert_node(value_type _Val, list_node< value_type >^_Newnode)
Definition: xhash:372
_Traits_t::value_type value_type
Definition: xhash:65
void _Reinsert()
Definition: xhash:694
_Mylist_t _Mylist
Definition: xhash:727
void insert_node(node_type^_Where, size_type _Count, value_type _Val)
Definition: list:578
node_type front_node()
Definition: xhash:173
_FwdIt _Last
Definition: algorithm:1936
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::insert ( _Myenum_it _Right)
inline
353  { // insert enumerable
354  for each (value_type _Val in _Right)
356  _Reinsert();
357  }
_Traits_t::value_type value_type
Definition: xhash:65
void _Reinsert()
Definition: xhash:694
node_type front_node()
Definition: list:254
_Mylist_t _Mylist
Definition: xhash:727
void insert_node(node_type^_Where, size_type _Count, value_type _Val)
Definition: list:578
_FwdIt const _Ty _Val
Definition: algorithm:1938
const _Ty & _Right
Definition: algorithm:4087
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::insert ( System::Collections::IEnumerable^  _Right)
inline
360  { // insert enumerable
361  for each (value_type _Val in _Right)
363  _Reinsert();
364  }
_Traits_t::value_type value_type
Definition: xhash:65
void _Reinsert()
Definition: xhash:694
node_type front_node()
Definition: list:254
_Mylist_t _Mylist
Definition: xhash:727
void insert_node(node_type^_Where, size_type _Count, value_type _Val)
Definition: list:578
_FwdIt const _Ty _Val
Definition: algorithm:1938
const _Ty & _Right
Definition: algorithm:4087
template<typename _Traits_t>
_Pairnb cliext::impl::hash< _Traits_t >::insert_node ( value_type  _Val,
list_node< value_type >^  _Newnode 
)
inline
373  { // try to insert node with value _Val, return node pointer, bool
374 #pragma warning(push)
375 #pragma warning(disable: 4127)
376  size_type _Bucket = _Hashval(this->get_key(_Val));
377  node_type^ _Node = hash_node(_Bucket + 1); // end node for bucket
378 
379  for (; _Node != hash_node(_Bucket); )
380  if (!this->comp(this->get_key(_Val),
381  this->get_key((_Node = _Node->prev_node())->_Myval)))
382  ; // still too high in bucket list
383  else if (_Multi
384  || !this->comp(this->get_key(_Node->_Myval),
385  this->get_key(_Val)))
386  { // found insertion point, back up to it
387  _Node = _Node->next_node();
388  break;
389  }
390  else
391  { // discard new node and return existing node
392  if (_Newnode != nullptr)
393  _Mylist->erase_node(_Newnode);
394  return (_Pairnb(_Node, false));
395  }
396  if (_Newnode != nullptr)
397  _Mylist->splice_node((list_node<value_type>^)_Node, _Mylist,
398  _Newnode, _Newnode->_Next); // place existing node
399  else
400  { // insert value to make new node
401  _Mylist->insert_node((list_node<value_type>^)_Node, 1, _Val);
402  _Newnode = (list_node<value_type>^)_Node->prev_node();
403  }
404 
405  for (; _Node == hash_node(_Bucket); --_Bucket)
406  { // update end iterators if new first bucket element
407  set_hash_node(_Bucket, _Newnode);
408  if (_Bucket == 0)
409  break;
410  }
411 
412  if (max_load_factor() < load_factor())
413  _Grow(bucket_count() + 1);
414  ++_Mygen;
415  return (_Pairnb(_Newnode, true)); // return added node
416 #pragma warning(pop)
417  }
_Node _Next
Definition: list:955
_STLCLR GenericPair< node_type^, bool > _Pairnb
Definition: xhash:85
size_type _Hashval(key_type%_Keyval)
Definition: xhash:672
int bucket_count()
Definition: xhash:257
_Mylist_t _Mylist
Definition: xhash:727
float load_factor()
Definition: xhash:262
void insert_node(node_type^_Where, size_type _Count, value_type _Val)
Definition: list:578
void _Grow(int _Buckets)
Definition: xhash:611
void set_hash_node(size_type _Idx, node_type^_Node)
Definition: xhash:168
unsigned long _Mygen
Definition: xhash:729
list_node< _Value_t > node_type
Definition: xhash:52
node_type erase_node(node_type^_Where)
Definition: list:645
float max_load_factor()
Definition: xhash:267
int size_type
Definition: xhash:70
_FwdIt const _Ty _Val
Definition: algorithm:1938
void splice_node(node_type^_Where, _Mytype_t^_Right, node_type^_First, node_type^_Last)
Definition: list:714
node_type hash_node(size_type _Idx)
Definition: xhash:163
template<typename _Traits_t>
key_compare cliext::impl::hash< _Traits_t >::key_comp ( )
inlinenew
201  { // return object for comparing keys
202  return (_Mybase_t::key_comp());
203  }
template<typename _Traits_t>
float cliext::impl::hash< _Traits_t >::load_factor ( )
inline
263  { // return average number of elements per bucket
264  return ((float)size() / (float)bucket_count());
265  }
size_type size()
Definition: xhash:247
int bucket_count()
Definition: xhash:257
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::lower_bound ( key_type  _Keyval)
inline
520  { // find leftmost node not less than _Keyval
521  return (make_iterator(lower_bound_node(_Keyval)));
522  }
iterator make_iterator(node_type^_Node)
Definition: xhash:216
node_type lower_bound_node(key_type _Keyval)
Definition: xhash:524
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::lower_bound_node ( key_type  _Keyval)
inline
525  { // find leftmost node not less than _Keyval
526  size_type _Bucket = _Hashval(_Keyval);
527  node_type^ _Where = hash_node(_Bucket);
528 
529  for (; _Where != hash_node(_Bucket + 1);
530  _Where = _Where->next_node())
531  if (this->comp(this->get_key(_Where->_Myval), _Keyval))
532  return (!this->comp(_Keyval,
533  this->get_key(_Where->_Myval)) ? head_node() : _Where);
534  return (head_node());
535  }
node_type head_node()
Definition: xhash:183
size_type _Hashval(key_type%_Keyval)
Definition: xhash:672
list_node< _Value_t > node_type
Definition: xhash:52
int size_type
Definition: xhash:70
node_type hash_node(size_type _Idx)
Definition: xhash:163
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::make_iterator ( node_type _Node)
inline
217  { // return iterator for node
218  return (_Mylist->make_iterator(_Node));
219  }
iterator make_iterator(node_type^_Node)
Definition: list:326
_Mylist_t _Mylist
Definition: xhash:727
template<typename _Traits_t>
float cliext::impl::hash< _Traits_t >::max_load_factor ( )
inline
268  { // return maximum number of elements per bucket
269  return (_Max_load_factor);
270  }
float _Max_load_factor
Definition: xhash:733
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::max_load_factor ( float  _Newmax)
inline
273  { // set maximum load factor
274  if (_Newmax != _Newmax // might detect a NaN
275  || _Newmax <= 0)
276  throw gcnew System::ArgumentException();
277 
278  _Max_load_factor = _Newmax;
279  }
float _Max_load_factor
Definition: xhash:733
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::operator _Mycont_it^ ( )
inline
126  { // convert to interface
127  return (this);
128  }
template<typename _Traits_t>
hash cliext::impl::hash< _Traits_t >::operator= ( hash< _Traits_t >%  _Right)
inline
114  { // assign
115  if ((Object^)this != %_Right)
116  { // worth doing, do it
117  clear();
119  _Right._Mylist->front_node(), _Right._Mylist->head_node());
120  _Reinsert();
121  }
122  return (*this);
123  }
void clear()
Definition: xhash:466
void _Reinsert()
Definition: xhash:694
_Mylist_t _Mylist
Definition: xhash:727
void insert_node(node_type^_Where, size_type _Count, value_type _Val)
Definition: list:578
node_type head_node()
Definition: list:264
const _Ty & _Right
Definition: algorithm:4087
template<typename _Traits_t>
reverse_iterator cliext::impl::hash< _Traits_t >::rbegin ( )
inline
232  { // return reverse iterator for beginning of mutable sequence
233  return (_Mylist->rbegin());
234  }
reverse_iterator rbegin()
Definition: list:341
_Mylist_t _Mylist
Definition: xhash:727
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::rehash ( int  _Buckets)
inline
283  { // try to grow table to at least _Buckets buckets
284  _Buckets = _True_buckets(_Buckets);
285 
286  if ((float)size() / (float)_Buckets <= max_load_factor())
287  _Rebuild_table(_Buckets);
288  }
size_type size()
Definition: xhash:247
int _True_buckets(int _Buckets)
Definition: xhash:714
void _Rebuild_table(int _Buckets)
Definition: xhash:704
float max_load_factor()
Definition: xhash:267
template<typename _Traits_t>
reverse_iterator cliext::impl::hash< _Traits_t >::rend ( )
inline
237  { // return reverse iterator for end of mutable sequence
238  return (_Mylist->rend());
239  }
_Mylist_t _Mylist
Definition: xhash:727
reverse_iterator rend()
Definition: list:346
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::set_hash_node ( size_type  _Idx,
node_type _Node 
)
inline
169  { // set node from hash table
170  _Myvector[_Idx] = _Node;
171  }
_Myvector
Definition: xhash:608
template<typename _Traits_t>
size_type cliext::impl::hash< _Traits_t >::size ( )
inline
248  { // return length of sequence
249  return (_Mylist->size());
250  }
_Mylist_t _Mylist
Definition: xhash:727
size_type size()
Definition: list:372
template<typename _Traits_t>
void cliext::impl::hash< _Traits_t >::swap ( _Mytype_t _Right)
inline
474  { // exchange contents with _Right
475  if ((Object^)this != %_Right)
476  { // worth doing, swap
477  _Mylist_t^ _Tlist = _Mylist;
478  _Myvector_t^ _Tvector = _Myvector;
479  int _Tmask = _Mask;
480  int _Tmaxidx = _Maxidx;
481  float _Tmax_load_factor = _Max_load_factor;
482 
483  _Mylist = _Right._Mylist;
484  _Right._Mylist = _Tlist;
485 
486  _Myvector = _Right._Myvector;
487  _Right._Myvector = _Tvector;
488 
489  _Mask = _Right._Mask;
490  _Right._Mask = _Tmask;
491 
492  _Maxidx = _Right._Maxidx;
493  _Right._Maxidx = _Tmaxidx;
494 
495  _Max_load_factor = _Right._Max_load_factor;
496  _Right._Max_load_factor = _Tmax_load_factor;
497  ++_Mygen;
498  ++_Right._Mygen;
499  }
500  }
cli::array< node_type^> _Myvector_t
Definition: xhash:53
float _Max_load_factor
Definition: xhash:733
int _Maxidx
Definition: xhash:732
_Mylist_t _Mylist
Definition: xhash:727
int _Mask
Definition: xhash:731
unsigned long _Mygen
Definition: xhash:729
_Myvector
Definition: xhash:608
list< _Value_t > _Mylist_t
Definition: xhash:51
const _Ty & _Right
Definition: algorithm:4087
template<typename _Traits_t>
_Myarray_t cliext::impl::hash< _Traits_t >::to_array ( )
inline
196  { // convert to array
197  return (_Mylist->to_array());
198  }
_Myarray_t to_array()
Definition: list:312
_Mylist_t _Mylist
Definition: xhash:727
template<typename _Traits_t>
iterator cliext::impl::hash< _Traits_t >::upper_bound ( key_type  _Keyval)
inline
538  { // find leftmost node greater than _Keyval
539  return (make_iterator(upper_bound_node(_Keyval)));
540  }
node_type upper_bound_node(key_type _Keyval)
Definition: xhash:542
iterator make_iterator(node_type^_Node)
Definition: xhash:216
template<typename _Traits_t>
node_type cliext::impl::hash< _Traits_t >::upper_bound_node ( key_type  _Keyval)
inline
543  { // find leftmost node greater than _Keyval
544  size_type _Bucket = _Hashval(_Keyval);
545  node_type^ _Where = hash_node(_Bucket + 1);
546 
547  for (; _Where != hash_node(_Bucket); )
548  { // scan down to first that matches key, then back up one
549  _Where = _Where->prev_node();
550  if (this->comp(_Keyval, this->get_key(_Where->_Myval)))
551  return (!this->comp(this->get_key(_Where->_Myval),
552  _Keyval) ? head_node() : _Where->next_node());
553  }
554  return (head_node());
555  }
node_type head_node()
Definition: xhash:183
size_type _Hashval(key_type%_Keyval)
Definition: xhash:672
_Mytype_t next_node()
Definition: list:37
list_node< _Value_t > node_type
Definition: xhash:52
int size_type
Definition: xhash:70
node_type hash_node(size_type _Idx)
Definition: xhash:163
template<typename _Traits_t>
value_compare cliext::impl::hash< _Traits_t >::value_comp ( )
inlinenew
206  { // return object for comparing keys
207  return (_Mybase_t::value_comp());
208  }

Member Data Documentation

template<typename _Traits_t>
_STLCLR_FIELD_ACCESS cliext::impl::hash< _Traits_t >::__pad0__
template<typename _Traits_t>
const int cliext::impl::hash< _Traits_t >::_Default_buckets = 16
static
template<typename _Traits_t>
const int cliext::impl::hash< _Traits_t >::_Default_load = 4
static
template<typename _Traits_t>
int cliext::impl::hash< _Traits_t >::_Mask
template<typename _Traits_t>
float cliext::impl::hash< _Traits_t >::_Max_load_factor
template<typename _Traits_t>
int cliext::impl::hash< _Traits_t >::_Maxidx
template<typename _Traits_t>
const int cliext::impl::hash< _Traits_t >::_Maxsize = MAX_CONTAINER_SIZE
static
template<typename _Traits_t>
unsigned long cliext::impl::hash< _Traits_t >::_Mygen
template<typename _Traits_t>
_Mylist_t cliext::impl::hash< _Traits_t >::_Mylist
template<typename _Traits_t>
cliext::impl::hash< _Traits_t >::_Myvector = _Newvector
template<typename _Traits_t>
_Myvector_t cliext::impl::hash< _Traits_t >::_Myvector
template<typename _Traits_t>
_Myvector_t cliext::impl::hash< _Traits_t >::_Newvector = gcnew _Myvector_t(_Newsize)
template<typename _Traits_t>
size_type cliext::impl::hash< _Traits_t >::_Oldsize = _Myvector == nullptr ? 0 : _Myvector->Length
template<typename _Traits_t>
_STLCLR_FIELD_ACCESS node_type cliext::impl::hash< _Traits_t >::_Pad
Initial value:
{
size_type _Idx = 0
template<typename _Traits_t>
property size_type cliext::impl::hash< _Traits_t >::Count
private
Initial value:
{
virtual size_type get() sealed
{
return (size());
}
}
template<typename _Traits_t>
property bool cliext::impl::hash< _Traits_t >::IsSynchronized
private
Initial value:
{
virtual bool get() sealed
{
return (false);
}
}
template<typename _Traits_t>
property System::Object cliext::impl::hash< _Traits_t >::SyncRoot
private
Initial value:
{
virtual System::Object^ get() sealed
{
return (this);
}
}

The documentation for this class was generated from the following file: