xtd 0.2.0
basic_string_comparer.hpp
Go to the documentation of this file.
1
4#pragma once
8#include "as.hpp"
9#include "is.hpp"
11#include "string_comparison.hpp"
12#include "basic_string.hpp"
13
15namespace xtd {
31 template<class char_t>
32 class basic_string_comparer : public xtd::object, public xtd::collections::generic::icomparer<xtd::basic_string<char_t>>, public xtd::collections::generic::iequality_comparer<xtd::basic_string<char_t>> {
33 public:
35
54 //return create(culture_info::current_culture);
55 }
56
76 //return create(culture_info::current_culture, true);
77 }
78
82 //return create(culture_info::invariant_culture);
83 }
84
88 //return create(culture_info::invariant_culture, true);
89 }
90
96 static auto result = from_comparison(string_comparison::ordinal);
97 return result;
98 }
99
106 return result;
107 }
109
111
124 template <class object_t>
125 int32 compare(const object_t& x, const object_t& y) const {
127 if (is<icomparable<object_t>>(x) && is<icomparable<object_t>>(y)) return as<icomparable<object_t>>(x).compare_to(y);
128 if (is<object>(x) && is<object>(y) && as<object>(x) == as<object>(y)) return 0;
130 }
132 int32 compare(const char_t* x, const char_t* y) const {
133 if (x == y) return 0;
134 return compare(basic_string<char_t> {x}, basic_string<char_t> {y});
135 }
136 int32 compare(const basic_string<char_t>& x, const char_t* y) const {return compare(x, basic_string<char_t> {y});}
137 int32 compare(const char_t* x, const basic_string<char_t>& y) const {return compare(basic_string<char_t> {x}, y);}
149 int32 compare(const xtd::basic_string<char_t>& x, const xtd::basic_string<char_t>& y) const noexcept override {
151 switch (comparison_) {
154 case string_comparison::ordinal: return x.compare_to(y);
157 case string_comparison::ordinal_ignore_case: return x.to_lower().compare_to(y.to_lower());
158 default: return x.compare_to(y);
159 }
160 }
161
168 bool equals(const object& obj) const noexcept override {
169 return is<basic_string_comparer>(obj) && reinterpret_cast<const basic_string_comparer&>(obj).comparison_ == comparison_;
170 }
171
177 template <class object_t>
178 bool equals(const object_t& x, const object_t& y) const {
179 if (&x == &y) return true;
181 if (is<iequatable<object_t>>(x) && is<iequatable<object_t>>(y)) return as<iequatable<object_t>>(x).equals(y);
182 if (is<object>(x) && is<object>(y) && as<object>(x) == as<object>(y)) return 0;
184 }
186 bool equals(const char_t* x, const char_t* y) const {
187 if (x == y) return true;
188 return equals(basic_string<char_t> {x}, basic_string<char_t> {y});}
189 bool equals(const basic_string<char_t>& x, const char_t* y) const {return equals(x, basic_string<char_t> {y});}
190 bool equals(const char_t* x, const basic_string<char_t>& y) const {return equals(basic_string<char_t> {x}, y);}
197 bool equals(const xtd::basic_string<char_t>& x, const xtd::basic_string<char_t>& y) const noexcept override {
198 if (&x == &y) return true;
200 switch (comparison_) {
203 case string_comparison::ordinal: return x.equals(y);
206 case string_comparison::ordinal_ignore_case: return x.to_lower().equals(y.to_lower());
207 default : return x.equals(y);
208 }
209 }
210
216 template <class object_t>
217 xtd::size get_hash_code(const object_t& obj) const {
219 if (is<object>(obj)) return as<object>(obj).get_hash_code();
220 return xtd::hash_code::combine(obj);
221 }
223 xtd::size get_hash_code(const char_t* obj) const {return get_hash_code(basic_string<char_t> {obj});}
229 xtd::size get_hash_code(const xtd::basic_string<char_t>& obj) const noexcept override {
231 switch (comparison_) {
234 case string_comparison::ordinal: return obj.get_hash_code();
237 case string_comparison::ordinal_ignore_case: return obj.to_lower().get_hash_code();
238 default: return obj.get_hash_code();
239 }
240 }
242
244
252 }
253
255 /*
262 bool is_well_known_culture_aware_comparer(const xtd::collections::generic::iequality_comparer<xtd::basic_string<char_t>>& comparer, xtd::globalization::compare_info& compare_info, xtd::globalization::compare_options& compare_options) {
263 if (xtd::is<>(comparer)) {
264 compare_info = get_compare_info();
265 compare_options = get_compare_options();
266 return true;
267 }
268
269 compare_info = xtd::globalization::compare_info {};
270 compare_options = xtd::globalization::compare_options::none;
271 return false;
272 } */
273
281 ignore_case = xtd::is<xtd::basic_string_comparer<char_t>>(comparer) && xtd::as<xtd::basic_string_comparer<char_t>>(comparer).comparison_ == xtd::string_comparison::ordinal_ignore_case;
282 return true;
283 }
284
285 ignore_case = false;
286 return false;
287 }
289
290 protected:
292
295 /*
300 basic_string_comparer create(const xtd::globalization::culture_info& culture, bool ignore_case) {
301 return create {culture, ignore_case ? compare_options::ignore_case : compare_options::none};
302 } */
303
305 /*
310 basic_string_comparer create(const xtd::globalization::culture_info& culture, xtd::globalization::compare_options options) {
311 return basic_string_comparer {culture, options};
312 } */
313
317
318
319 private:
326
328 }
330 /*
331 basic_string_comparer(const xtd::globalization::culture_info& culture, xtd::globalization::compare_options options) : culture_ {culture}, options_ {options} {
332 }
333 xtd::globalization::culture_info culture_ = xtd::globalization::culture_info::empty;
334 xtd::globalization::compare_options options_ = xtd::globalization::compare_options::none;
335 */
337 };
338}
Contains xtd::argument_exception exception.
Contains xtd::as method.
Contains xtd::basic_string class.
Represents a string comparison operation that uses specific case and culture-based or ordinal compari...
Definition basic_string_comparer.hpp:32
static basic_string_comparer current_culture_ignore_case()
Gets a xtd::basic_string_comparer object that performs case-insensitive string comparisons using the ...
Definition basic_string_comparer.hpp:73
static basic_string_comparer from_comparison(xtd::string_comparison comparison)
Converts the specified xtd::string_comparison instance to a StringComparer instance.
Definition basic_string_comparer.hpp:250
int32 compare(const xtd::basic_string< char_t > &x, const xtd::basic_string< char_t > &y) const noexcept override
When overridden in a derived class, compares two strings and returns an indication of their relative ...
Definition basic_string_comparer.hpp:149
static basic_string_comparer invariant_culture()
Definition basic_string_comparer.hpp:79
xtd::size get_hash_code(const object_t &obj) const
When overridden in a derived class, gets the hash code for the specified object.
Definition basic_string_comparer.hpp:217
static const basic_string_comparer & ordinal_ignore_case()
Gets a xtd::basic_string_comparer object that performs a case-insensitive ordinal string comparison.
Definition basic_string_comparer.hpp:104
static const basic_string_comparer & ordinal()
Gets a xtd::basic_string_comparer object that performs a case-sensitive ordinal string comparison.
Definition basic_string_comparer.hpp:95
bool equals(const xtd::basic_string< char_t > &x, const xtd::basic_string< char_t > &y) const noexcept override
When overridden in a derived class, indicates whether two strings are equal.
Definition basic_string_comparer.hpp:197
bool equals(const object_t &x, const object_t &y) const
When overridden in a derived class, indicates whether two objects are equal.
Definition basic_string_comparer.hpp:178
static bool is_well_known_ordinal_comparer(const xtd::collections::generic::iequality_comparer< xtd::basic_string< char_t > > &comparer, bool &ignore_case)
Determines whether the specified xtd::collections::generic::iequality_comparer <type_t> is a well-kno...
Definition basic_string_comparer.hpp:279
int32 compare(const object_t &x, const object_t &y) const
When overridden in a derived class, compares two objects and returns an indication of their relative ...
Definition basic_string_comparer.hpp:125
bool equals(const object &obj) const noexcept override
Determines whether the specified object is equal to the current object.
Definition basic_string_comparer.hpp:168
static basic_string_comparer invariant_culture_ignore_case()
Definition basic_string_comparer.hpp:85
basic_string_comparer()=default
Initializes a new instance of the xtd::basic_string_comparer class.
static basic_string_comparer current_culture()
Gets a xtd::basic_string_comparer object that performs a case-sensitive string comparison using the w...
Definition basic_string_comparer.hpp:52
xtd::size get_hash_code(const xtd::basic_string< char_t > &obj) const noexcept override
When overridden in a derived class, gets the hash code for the specified string.
Definition basic_string_comparer.hpp:229
Represents text as a sequence of character units.
Definition basic_string.hpp:71
Exposes a method that compares two objects.
Definition icomparer.hpp:30
Defines methods to support the comparison of objects for equality.
Definition iequality_comparer.hpp:34
static xtd::size combine(args_t... values) noexcept
Combines values into a hash code.
Definition hash_code.hpp:70
static void throws(xtd::helpers::exception_case exception_case, const source_location &location=source_location::current())
Throws an exption with specified exception case.
Defines a generalized comparison method that a value type or class implements to create a type-specif...
Definition icomparable.hpp:21
Defines a generalized method that a value type or class implements to create a type-specific method f...
Definition iequatable.hpp:22
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.hpp:44
virtual xtd::size get_hash_code() const noexcept
Serves as a hash function for a particular type.
Contains xtd::collections::generic::icomparer <type_t> interface.
Contains xtd::collections::generic::iequality_comparer <type_t> interface.
xtd::delegate< int32(type_t x, type_t y)> comparison
Represents the method that compares two objects of the same type.
Definition comparison.hpp:33
@ argument
The argument is not valid.
@ not_implemented
The method or operation is not implemented.
int32_t int32
Represents a 32-bit signed integer.
Definition int32.hpp:23
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23
string_comparison
Specifies the culture, case, and sort rules to be used by certain overloads of the xtd::string::compa...
Definition string_comparison.hpp:14
bool is(std::any value)
Checks if the result of an expression is compatible with a given type.
Definition is.hpp:365
type_t as(any_object &o)
Casts a type into another type.
Definition __as_any_object.hpp:59
@ ordinal
Compare strings using ordinal (binary) sort rules.
@ invariant_culture
Compare strings using culture-sensitive sort rules and the invariant culture.
@ invariant_culture_ignore_case
Compare strings using culture-sensitive sort rules, the invariant culture, and ignoring the case of t...
@ ordinal_ignore_case
Compare strings using ordinal (binary) sort rules and ignoring the case of the strings being compared...
@ current_culture_ignore_case
Compare strings using culture-sensitive sort rules, the current culture, and ignoring the case of the...
@ current_culture
Compare strings using culture-sensitive sort rules and the current culture.
@ y
The Y key.
@ x
The X key.
Contains xtd::is method.
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition xtd_about_box.hpp:10
Contains xtd::not_implemented_exception exception.
Contains xtd::string_comparison enum class.
Provides the base class for enumerations.
Definition enum_object.hpp:48