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#include <system/string.h>
8
9namespace System { namespace Collections { namespace Generic {
10
16template<typename T>
17class ABSTRACT IEqualityComparer: virtual public Object
18{
19public:
22public:
27 virtual bool Equals(T x, T y) const = 0;
31 virtual int GetHashCode(T obj) const = 0;
32};
33
37template<class T>
38struct ASPOSECPP_SHARED_CLASS EqualityComparerAdapter
39{
42 {}
46 : m_comparator(comparator)
47 {}
48
52 {
53 m_comparator = comparator;
54 }
55
60 bool operator()(const T &x, const T &y) const
61 {
62 if( m_comparator )
63 return m_comparator->Equals(x, y);
64
65 return System::Details::AreEqual(x, y);
66 }
67
68private:
71};
72
76template <typename T, class Enable = void>
77struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector
78{
80 using type = std::hash<T>;
81};
82
84template <>
85struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector<System::String>
86{
88 struct type
89 {
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 == nullptr ? 0 : obj.GetHashCode());
100 }
101 };
102};
103
106template <typename T>
107struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector<T, typename std::enable_if<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 std::size_t operator ()(argument_type obj) const
120 {
121 return static_cast<std::size_t>(obj.GetHashCode());
122 }
123 };
124};
125
128template <typename T>
129struct 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>
130{
132 struct type
133 {
135 using argument_type = const T&;
137 using result_type = std::size_t;
141 template<typename K>
142 std::size_t operator ()(const System::SharedPtr<K>& obj) const
143 {
144 if (obj)
145 {
146 return obj->GetHashCode();
147 }
148 return 0;
149 }
150 };
151};
152
153
156template <typename T>
157struct ASPOSECPP_SHARED_CLASS DictionaryHashSelector<T, typename std::enable_if<std::is_enum<T>::value>::type>
158{
160 struct type
161 {
163 using argument_type = const T&;
165 using result_type = std::size_t;
169 std::size_t operator ()(argument_type enum_) const
170 {
171 return static_cast<std::size_t>(enum_);
172 }
173 };
174};
175
179template<typename T>
180struct ASPOSECPP_SHARED_CLASS EqualityComparerHashAdapter
181{
184 {}
188 : m_comparator(comparator)
189 {}
193 {
194 m_comparator = comparator;
195 }
199 std::size_t operator ()(const T &x) const
200 {
201 if (m_comparator)
202 return static_cast<std::size_t>(m_comparator->GetHashCode(x));
203
204 typename DictionaryHashSelector<T>::type hash_selector;
205
206 return hash_selector(x);
207 }
208
209private:
211 SharedPtr<IEqualityComparer<T>> m_comparator;
212};
213
214}
215
216class ABSTRACT IEqualityComparer : virtual public Object
217{
218public:
221
222public:
227 virtual bool Equals(const SharedPtr<Object>& x, const SharedPtr<Object>& y) const = 0;
231 virtual int GetHashCode(const SharedPtr<Object>& obj) const = 0;
232};
233
234}}
235
236#endif // _IEnumerator_h_
Interface providing means to compare two objects for equality. Objects of this class should only be a...
Definition: iequality_comparer.h:18
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:217
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:51
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
String class used across the library. Is a substitute for C# System.String when translating code....
Definition: string.h:125
int GetHashCode() const
Hashes contained string. Implemented in ICU, doesn't match hashes in C#.
Definition: db_command.h:9
std::size_t result_type
Result type.
Definition: iequality_comparer.h:93
Hash function selector for Dictionary class. This implementation uses STL hashing given no alternativ...
Definition: iequality_comparer.h:78
std::hash< T > type
Hasher type to use.
Definition: iequality_comparer.h:80
Adapter making it possible using IEqualityComparer with STL-styled collections and algorithms....
Definition: iequality_comparer.h:39
EqualityComparerAdapter()
Creates adapter not using any comparator.
Definition: iequality_comparer.h:41
bool operator()(const T &x, const T &y) const
Compares two objects.
Definition: iequality_comparer.h:60
void set_EqualityComparator(const SharedPtr< IEqualityComparer< T > > &comparator)
Sets comparator.
Definition: iequality_comparer.h:51
EqualityComparerAdapter(const SharedPtr< IEqualityComparer< T > > &comparator)
Creates adapter with given comparator.
Definition: iequality_comparer.h:45
Adapter to use IEqualityComparer for hashing. Uses comparator object, if set; otherwise,...
Definition: iequality_comparer.h:181
EqualityComparerHashAdapter()
Creates adapter with no comparator to use.
Definition: iequality_comparer.h:183
EqualityComparerHashAdapter(const SharedPtr< IEqualityComparer< T > > &comparator)
Creates adapter with given comparator to use.
Definition: iequality_comparer.h:187
void set_EqualityComparator(const SharedPtr< IEqualityComparer< T > > &comparator)
Sets comparator to use.
Definition: iequality_comparer.h:192