|
|
|
| 1 |
|
// xhash stl/clr header |
| 2 |
|
#ifndef _CLI_XHASH_ |
| 3 |
|
#define _CLI_XHASH_ |
| 4 |
|
#include <cliext/functional> // for Binary/UnaryDelegate |
| 5 |
|
#include <cliext/list> // for the sequence container |
| 6 |
|
|
| 7 |
|
namespace cliext { |
| 8 |
|
// |
| 9 |
|
// TEMPLATE FUNCTION _Hash_key_compare |
| 10 |
|
// |
| 11 |
|
template<typename _Key_t> inline |
| 12 |
|
bool _Hash_key_compare(_Key_t _Left, _Key_t _Right) |
| 13 |
|
{ // test if _Left <= _Right |
| 14 |
|
return (!(_Right < _Left)); |
| 15 |
|
} |
| 16 |
|
|
| 17 |
|
inline bool _Hash_key_compare(System::String^ _Left, System::String^ _Right) |
| 18 |
|
{ // test if _Left <= _Right for String |
| 19 |
|
return (!(_Right->CompareTo(_Left) < 0)); |
| 20 |
|
} |
| 21 |
|
|
| 22 |
|
// |
| 23 |
|
// FUNCTION hash_value |
| 24 |
|
// |
| 25 |
|
inline int hash_value(System::Object^ _Key) |
| 26 |
|
{ // get hash code from object |
| 27 |
|
return (_Key->GetHashCode()); |
| 28 |
|
} |
| 29 |
|
|
| 30 |
|
namespace impl { |
| 31 |
|
// |
| 32 |
|
// TEMPLATE CLASS hash |
| 33 |
|
// |
| 34 |
|
template<typename _Traits_t> |
| 35 |
|
ref class hash |
| 36 |
|
: public _Traits_t, |
| 37 |
|
_STLCLR IHash< |
| 38 |
|
typename _Traits_t::key_type, |
| 39 |
|
typename _Traits_t::value_type> |
| 40 |
|
{ // hash table of elements |
| 41 |
|
public: |
| 42 |
|
// types |
| 43 |
|
typedef hash<_Traits_t> _Mytype_t; |
| 44 |
|
typedef _Traits_t _Mybase_t; |
| 45 |
|
typedef typename _Traits_t::key_type _Key_t; |
| 46 |
|
typedef typename _Traits_t::value_type _Value_t; |
| 47 |
|
typedef _STLCLR IHash<_Key_t, _Value_t> _Mycont_it; |
| 48 |
|
typedef System::Collections::Generic::IEnumerable<_Value_t> _Myenum_it; |
| 49 |
|
typedef cli::array<_Value_t> _Myarray_t; |
| 50 |
|
|
| 51 |
|
typedef list<_Value_t> _Mylist_t; // the controlled sequence |
| 52 |
|
typedef list_node<_Value_t> node_type; |
| 53 |
|
typedef cli::array<node_type^> _Myvector_t; // the hash table |
| 979 |
|
{ // find an element that matches _Keyval, return iterator |
| 980 |
|
return (find(_Keyval)); |
| 981 |
|
} |
| 982 |
|
|
| 983 |
|
virtual size_type count_virtual(key_type _Keyval) sealed |
| 984 |
|
= _Mycont_it::count |
| 985 |
|
{ // count all elements that match _Keyval |
| 986 |
|
return (count(_Keyval)); |
| 987 |
|
} |
| 988 |
|
|
| 989 |
|
virtual generic_iterator lower_bound_virtual(key_type _Keyval) sealed |
| 990 |
|
= _Mycont_it::lower_bound |
| 991 |
|
{ // find leftmost node not less than _Keyval |
| 992 |
|
return (lower_bound(_Keyval)); |
| 993 |
|
} |
| 994 |
|
|
| 995 |
|
virtual generic_iterator upper_bound_virtual(key_type _Keyval) sealed |
| 996 |
|
= _Mycont_it::upper_bound |
| 997 |
|
{ // find leftmost node greater than _Keyval |
| 998 |
|
return (upper_bound(_Keyval)); |
| 999 |
|
} |
| 1000 |
|
|
| 1001 |
|
virtual generic_pair_iter_iter equal_range_virtual( |
| 1002 |
|
key_type _Keyval) sealed |
| 1003 |
|
= _Mycont_it::equal_range |
| 1004 |
|
{ // find range equivalent to _Keyval |
| 1005 |
|
_Pairnn _Ans = equal_range_node(_Keyval); |
| 1006 |
|
return (generic_pair_iter_iter(gcnew generic_iterator(_Ans.first), |
| 1007 |
|
gcnew generic_iterator(_Ans.second))); |
| 1008 |
|
} |
| 1009 |
|
}; |
| 1010 |
|
} // namespace cliext::impl |
| 1011 |
|
// |
| 1012 |
|
// TEMPLATE FUNCTION swap |
| 1013 |
|
// |
| 1014 |
|
template<typename _Traits_t> inline |
| 1015 |
|
void swap(cliext::impl::hash<_Traits_t>% _Left, |
| 1016 |
|
cliext::impl::hash<_Traits_t>% _Right) |
| 1017 |
|
{ // swap two hash objects |
| 1018 |
|
_Left.swap(_Right); |
| 1019 |
|
} |
| 1020 |
|
} // namespace cliext |
| 1021 |
|
#endif // _CLI_XHASH_ |
| 1022 |
|
|
| 1023 |
|
/* |
| 1024 |
|
* Copyright (c) 2004-2007 by Dinkumware, Ltd. ALL RIGHTS RESERVED. |
| 1025 |
|
* Consult your license regarding permissions and restrictions. |
| 1026 |
|
V5.03:0009 */ |
| 1027 |
|
|
|
|
|