CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
iequality_comparer.h
1
2#ifndef _iequality_comparer_h_
3#define _iequality_comparer_h_
4
5#include "system/object.h"
6#include <system/details/equality_helper.h>
7
8namespace System { namespace Collections { namespace Generic {
9
15template<typename T>
16class ABSTRACT IEqualityComparer: virtual public Object
17{
18public:
21public:
26 virtual bool Equals(T x, T y) const = 0;
30 virtual int GetHashCode(T obj) const = 0;
31};
32
36template<class T>
37struct ASPOSECPP_SHARED_CLASS EqualityComparerAdapter
38{
41 {}
45 : m_comparator(comparator)
46 {}
47
51 {
52 m_comparator = comparator;
53 }
54
59 bool operator()(const T &x, const T &y) const
60 {
61 if( m_comparator )
62 return m_comparator->Equals(x, y);
63
64 return System::Details::AreEqual(x, y);
65 }
66
67private:
70};
71
75template <typename T, class Enable = void>
76struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector
77{
79 using type = std::hash<T>;
80};
81
84template <typename T>
85struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector<T, typename std::enable_if<System::detail::has_method_gethashcode<T>::value>::type>
86{
88 struct type
89 {
91 using argument_type = const T&;
93 using result_type = std::size_t;
97 std::size_t operator ()(argument_type obj) const
98 {
99 return static_cast<std::size_t>(obj.GetHashCode());
100 }
101 };
102};
103
106template <typename T>
107struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector<T, typename std::enable_if<System::detail::has_ref_method_gethashcode<T>::value && !System::detail::has_method_gethashcode<T>::value>::type>
108{
110 struct type
111 {
113 using argument_type = const T&;
115 using result_type = std::size_t;
119 template<typename K>
120 std::size_t operator ()(const System::SharedPtr<K>& obj) const
121 {
122 if (obj)
123 {
124 return obj->GetHashCode();
125 }
126 return 0;
127 }
128 };
129};
130
131
134template <typename T>
135struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector<T, typename std::enable_if<std::is_enum<T>::value>::type>
136{
138 struct type
139 {
141 using argument_type = const T&;
143 using result_type = std::size_t;
147 std::size_t operator ()(argument_type enum_) const
148 {
149 return static_cast<std::size_t>(enum_);
150 }
151 };
152};
153
157template<typename T>
158struct ASPOSECPP_SHARED_CLASS EqualityComparerHashAdapter
159{
162 {}
166 : m_comparator(comparator)
167 {}
171 {
172 m_comparator = comparator;
173 }
177 std::size_t operator ()(const T &x) const
178 {
179 if (m_comparator)
180 return static_cast<std::size_t>(m_comparator->GetHashCode(x));
181
182 typename DictionaryHashSelector<T>::type hash_selector;
183
184 return hash_selector(x);
185 }
186
187private:
189 SharedPtr<IEqualityComparer<T>> m_comparator;
190};
191
192}
193
194class ABSTRACT IEqualityComparer : virtual public Object
195{
196public:
199
200public:
205 virtual bool Equals(const SharedPtr<Object>& x, const SharedPtr<Object>& y) const = 0;
209 virtual int GetHashCode(const SharedPtr<Object>& obj) const = 0;
210};
211
212}}
213
214#endif // _IEnumerator_h_
Interface providing means to compare two objects for equality. Objects of this class should only be a...
Definition: iequality_comparer.h:17
virtual int GetHashCode(T obj) const =0
Gets hash code for some object.
RTTI_INFO_TEMPLATE_CLASS(System::Collections::Generic::IEqualityComparer< T >, System::BaseTypesInfo< System::Object >)
RTTI information.
virtual bool Equals(T x, T y) const =0
Checks if two objects are equal.
Definition: iequality_comparer.h:195
virtual bool Equals(const SharedPtr< Object > &x, const SharedPtr< Object > &y) const =0
Checks if two objects are equal.
RTTI_INFO_TEMPLATE_CLASS(System::Collections::IEqualityComparer, System::BaseTypesInfo< System::Object >)
RTTI information.
virtual int GetHashCode(const SharedPtr< Object > &obj) const =0
Gets hash code for some object.
Base class that enables using methods available for System.Object class in C#. All non-trivial classe...
Definition: object.h:62
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
int GetHashCode() const
Calls GetHashCode() on pointed object.
Definition: smart_ptr.h:877
Definition: db_command.h:9
Hash function selector for Dictionary class. This implementation uses STL hashing given no alternativ...
Definition: iequality_comparer.h:77
std::hash< T > type
Hasher type to use.
Definition: iequality_comparer.h:79
Adapter making it possible using IEqualityComparer with STL-styled collections and algorithms....
Definition: iequality_comparer.h:38
EqualityComparerAdapter()
Creates adapter not using any comparator.
Definition: iequality_comparer.h:40
bool operator()(const T &x, const T &y) const
Compares two objects.
Definition: iequality_comparer.h:59
void set_EqualityComparator(const SharedPtr< IEqualityComparer< T > > &comparator)
Sets comparator.
Definition: iequality_comparer.h:50
EqualityComparerAdapter(const SharedPtr< IEqualityComparer< T > > &comparator)
Creates adapter with given comparator.
Definition: iequality_comparer.h:44
Adapter to use IEqualityComparer for hashing. Uses comparator object, if set; otherwise,...
Definition: iequality_comparer.h:159
EqualityComparerHashAdapter()
Creates adapter with no comparator to use.
Definition: iequality_comparer.h:161
EqualityComparerHashAdapter(const SharedPtr< IEqualityComparer< T > > &comparator)
Creates adapter with given comparator to use.
Definition: iequality_comparer.h:165
void set_EqualityComparator(const SharedPtr< IEqualityComparer< T > > &comparator)
Sets comparator to use.
Definition: iequality_comparer.h:170