xtd 0.2.0
reference_wrapper_object.hpp
Go to the documentation of this file.
1
4#pragma once
6#include "hash_code.hpp"
7#include "icomparable.hpp"
8#include "iequatable.hpp"
9#include "null_ptr.hpp"
10#include "object.hpp"
11#include <optional>
12#include <functional>
13
15namespace xtd {
17 namespace linq {
18 class enumerable;
19 }
21
23
37 template<class type_t>
38 class reference_wrapper_object : public xtd::object, public xtd::icomparable<reference_wrapper_object<type_t>>, public xtd::iequatable<reference_wrapper_object<type_t >> {
39 public:
41
44 using base_type = std::reference_wrapper<type_t>;
46 using type = typename base_type::type;
48 using reference_type = typename base_type::type;
50
52
55 static const reference_wrapper_object empty;
57
59
62 reference_wrapper_object() noexcept = default;
65 reference_wrapper_object(xtd::null_ptr null) noexcept {} // Can't be explicit by design.
68 template<class value_t>
69 reference_wrapper_object(value_t&& value) noexcept : ref_ {value} {} // Can't be explicit by design.
72 reference_wrapper_object(reference_wrapper_object& value) noexcept : ref_ {value.ref_} {}
75 reference_wrapper_object(const reference_wrapper_object& value) noexcept : ref_ {value.ref_} {}
78 reference_wrapper_object(reference_wrapper_object&& value) noexcept : ref_ {std::move(value.ref_)} {}
81 template<class value_t>
82 reference_wrapper_object(reference_wrapper_object<value_t>& value) noexcept : ref_ {value.ref_} {}
85 template<class value_t>
86 reference_wrapper_object(const reference_wrapper_object<value_t>& value) noexcept : ref_ {value.ref_} {}
89 template<class value_t>
90 reference_wrapper_object(reference_wrapper_object<value_t>&& value) noexcept : ref_ {std::move(value.ref_)} {}
93 reference_wrapper_object(base_type& value) noexcept : ref_ {value} {}
96 reference_wrapper_object(const base_type& value) noexcept : ref_ {value} {}
99 reference_wrapper_object(base_type&& value) noexcept : ref_ {std::move(value)} {}
102 template<class value_t>
103 reference_wrapper_object(std::reference_wrapper<value_t>& value) noexcept : ref_ {value} {}
106 template<class value_t>
107 reference_wrapper_object(const std::reference_wrapper<value_t>& value) noexcept : ref_ {value} {}
110 template<class value_t>
111 reference_wrapper_object(std::reference_wrapper<value_t>&& value) noexcept : ref_ {std::move(value)} {}
113
115
128 bool is_empty() const noexcept {return !ref_.has_value();}
129
132 const base_type& reference() const {
134 return ref_.value();
135 }
136
140 return ref_.value();
141 }
142
143
145
157 int32 compare_to(const reference_wrapper_object& obj) const noexcept override {
158 if (!ref_.has_value() && !obj.ref_.has_value()) return 0;
159 if (ref_.has_value() && !obj.ref_.has_value()) return 1;
160 if (!ref_.has_value() && obj.ref_.has_value()) return -1;
161 return &ref_.value().get() < &obj.ref_.value().get() ? -1 : &ref_.value().get() > &obj.ref_.value().get() ? 1 : 0;
162 }
163
167 bool equals(const xtd::object& value) const noexcept override {return dynamic_cast<const reference_wrapper_object*>(&value) && equals(static_cast<const reference_wrapper_object&>(value));}
171 bool equals(const reference_wrapper_object& value) const noexcept override {
172 if (!ref_.has_value() && !value.ref_.has_value()) return true;
173 if (ref_.has_value() && !value.ref_.has_value()) return false;
174 if (!ref_.has_value() && value.ref_.has_value()) return false;
175 return &ref_.value().get() == &value.ref_.value().get();
176 }
177
190 type& get() const {
192 return ref_.value();
193 }
194
197 xtd::size get_hash_code() const noexcept override {return (ref_.has_value() ? xtd::hash_code::combine(&reference()) : 0);}
198
201 void reset() noexcept {ref_.reset();}
205 template<class value_t>
206 void reset(value_t&& value) noexcept {ref_ = value;}
209 void reset(xtd::null_ptr null) noexcept {ref_.reset();}
210
211
214 void swap(reference_wrapper_object& value) noexcept {std::swap(ref_, value.ref_);}
215
228 type_t& to_object() const {return get();}
229
233 template<typename target_t>
234 target_t to_object() const;
235
238 type& to_reference() const {return get();}
239
243 template<typename target_t>
244 target_t to_reference() const;
245
248 xtd::string to_string() const noexcept override;
250
252
256 reference_wrapper_object& operator =(const reference_wrapper_object& value) noexcept {
257 ref_ = value.ref_;
258 return *this;
259 }
260
262 reference_wrapper_object& operator =(reference_wrapper_object& value) noexcept {
263 ref_ = value.ref_;
264 return *this;
265 }
266
268 reference_wrapper_object& operator =(reference_wrapper_object&& value) noexcept {
269 ref_ = std::move(value.ref_);
270 return *this;
271 }
272
274 template<class value_t>
275 reference_wrapper_object& operator =(const reference_wrapper_object<value_t>& value) noexcept {
276 ref_ = value.ref_;
277 return *this;
278 }
279
281 template<class value_t>
282 reference_wrapper_object& operator =(reference_wrapper_object<value_t>& value) noexcept {
283 ref_ = value.ref_;
284 return *this;
285 }
286
288 template<class value_t>
289 reference_wrapper_object& operator =(reference_wrapper_object<value_t>&& value) noexcept {
290 ref_ = std::move(value.ref_);
291 return *this;
292 }
293
295 template<class value_t>
296 reference_wrapper_object& operator =(const std::reference_wrapper<value_t>& value) noexcept {
297 ref_ = value;
298 return *this;
299 }
300
302 template<class value_t>
303 reference_wrapper_object& operator =(std::reference_wrapper<value_t>& value) noexcept {
304 ref_ = value;
305 return *this;
306 }
307
309 reference_wrapper_object& operator =(const base_type& value) noexcept {
310 ref_ = value;
311 return *this;
312 }
313
315 reference_wrapper_object& operator =(base_type& value) noexcept {
316 ref_ = value;
317 return *this;
318 }
319
321 template<class value_t>
322 reference_wrapper_object& operator =(value_t&& value) noexcept {
323 ref_ = value;
324 return *this;
325 }
326
339 operator type& () const {return get();}
340
343 explicit operator bool() const noexcept {return ref_.has_value();}
344
349 friend bool operator ==(const reference_wrapper_object& lhs, const type_t& rhs) noexcept {return lhs.equals(rhs);}
354 friend bool operator !=(const reference_wrapper_object& lhs, const type_t& rhs) noexcept {return !lhs.equals(rhs);}
355
363 friend std::strong_ordering operator <=>(const reference_wrapper_object& lhs, const type_t& rhs) noexcept {
364 auto rhs_ptr = &rhs;
365 if (dynamic_cast<const type_t*>(rhs_ptr) && lhs.compare_to(static_cast<const type_t&>(rhs)) < 0) return std::strong_ordering::less;
366 if (dynamic_cast<const type_t*>(rhs_ptr) && lhs.compare_to(static_cast<const type_t&>(rhs)) > 0) return std::strong_ordering::greater;
367 if (dynamic_cast<const type_t*>(rhs_ptr) && lhs.compare_to(static_cast<const type_t&>(rhs)) == 0) return std::strong_ordering::equivalent;
368 return std::strong_ordering::less;
369 }
370
371
372 private:
373 template<class other_t>
374 friend class reference_wrapper_object;
375 std::optional<base_type> ref_;
376 };
377
378 template<class type_t>
379 inline const reference_wrapper_object<type_t> reference_wrapper_object<type_t>::empty;
381
383 // C++17 deduction guides for xtd::reference_wrapper_object
384 // {
385 template<class type_t>
386 reference_wrapper_object(type_t&) -> reference_wrapper_object<type_t>;
387 // }
389}
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
Provides a set of static methods for querying objects that implement ienumerable <type_t>.
Definition enumerable.hpp:58
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.hpp:44
The xtd::reference_wrapper_object is a reference wrapper as std::reference_wrapper.
Definition reference_wrapper_object.hpp:38
reference_wrapper_object() noexcept=default
Initializes a new instance of the xtd::reference_wrapper_object class.
bool equals(const xtd::object &value) const noexcept override
Determines whether the specified object is equal to the current object.
Definition reference_wrapper_object.hpp:167
friend bool operator==(const reference_wrapper_object &lhs, const type_t &rhs) noexcept
Equal to operator with specidied lhs ans rhs values.
Definition reference_wrapper_object.hpp:349
reference_wrapper_object(std::reference_wrapper< value_t > &&value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object::base_type class with specified refer...
Definition reference_wrapper_object.hpp:111
friend bool operator!=(const reference_wrapper_object &lhs, const type_t &rhs) noexcept
Not equal to operator with specidied lhs ans rhs values.
Definition reference_wrapper_object.hpp:354
reference_wrapper_object(reference_wrapper_object &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object class with specified reference object...
Definition reference_wrapper_object.hpp:72
reference_wrapper_object(value_t &&value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object class with specified reference.
Definition reference_wrapper_object.hpp:69
reference_wrapper_object & operator=(const reference_wrapper_object &value) noexcept
Assignment operator with specified xtd::reference_wrapper_object value.
Definition reference_wrapper_object.hpp:256
reference_wrapper_object(reference_wrapper_object< value_t > &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object class with specified reference object...
Definition reference_wrapper_object.hpp:82
void swap(reference_wrapper_object &value) noexcept
Swaps this current instance with specified reference object.
Definition reference_wrapper_object.hpp:214
static const reference_wrapper_object empty
Represents the empty xtd::reference_wrapper_object. This field is constant.
Definition reference_wrapper_object.hpp:55
friend std::strong_ordering operator<=>(const reference_wrapper_object &lhs, const type_t &rhs) noexcept
Three-way comparison operator with specidied lhs ans rhs values.
Definition reference_wrapper_object.hpp:363
std::reference_wrapper< type_t > base_type
Represents the base type (std::reference_wrapper<type_t>)
Definition reference_wrapper_object.hpp:44
reference_wrapper_object(base_type &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object::base_type class with specified refer...
Definition reference_wrapper_object.hpp:93
bool equals(const reference_wrapper_object &value) const noexcept override
Indicates whether the current object is equal to another object of the same type.
Definition reference_wrapper_object.hpp:171
base_type & reference()
Returns the underlying base type reference.
Definition reference_wrapper_object.hpp:138
target_t to_object() const
Gets the stored object with specified target_t type.
target_t to_reference() const
Gets the stored reference with specified target_t type.
type_t & to_object() const
Gets the stored object.
Definition reference_wrapper_object.hpp:228
reference_wrapper_object(const reference_wrapper_object &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object class with specified reference object...
Definition reference_wrapper_object.hpp:75
reference_wrapper_object(reference_wrapper_object< value_t > &&value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object class with specified reference object...
Definition reference_wrapper_object.hpp:90
type & to_reference() const
Gets the stored reference.
Definition reference_wrapper_object.hpp:238
void reset() noexcept
Resets the current object. Set the current object to null.
Definition reference_wrapper_object.hpp:201
const base_type & reference() const
Returns the underlying base type reference.
Definition reference_wrapper_object.hpp:132
reference_wrapper_object(const reference_wrapper_object< value_t > &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object class with specified reference object...
Definition reference_wrapper_object.hpp:86
reference_wrapper_object(const base_type &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object::base_type class with specified refer...
Definition reference_wrapper_object.hpp:96
reference_wrapper_object(const std::reference_wrapper< value_t > &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object::base_type class with specified refer...
Definition reference_wrapper_object.hpp:107
reference_wrapper_object(base_type &&value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object::base_type class with specified refer...
Definition reference_wrapper_object.hpp:99
typename base_type::type reference_type
Represent the referenced type.
Definition reference_wrapper_object.hpp:48
int32 compare_to(const reference_wrapper_object &obj) const noexcept override
Compares the current instance with another object of the same type.
Definition reference_wrapper_object.hpp:157
xtd::string to_string() const noexcept override
Returns a xtd::string that represents the current object.
type & get() const
Gets the stored reference.
Definition reference_wrapper_object.hpp:190
reference_wrapper_object(std::reference_wrapper< value_t > &value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object::base_type class with specified refer...
Definition reference_wrapper_object.hpp:103
typename base_type::type type
Represent the referenced type.
Definition reference_wrapper_object.hpp:46
reference_wrapper_object(reference_wrapper_object &&value) noexcept
Initializes a new instance of the xtd::reference_wrapper_object class with specified reference object...
Definition reference_wrapper_object.hpp:78
void reset(xtd::null_ptr null) noexcept
Resets the current object. Set the current object with specified null value.
Definition reference_wrapper_object.hpp:209
void reset(value_t &&value) noexcept
Resets the current object. Set the current object with specified reference.
Definition reference_wrapper_object.hpp:206
xtd::size get_hash_code() const noexcept override
Serves as a hash function for a particular type.
Definition reference_wrapper_object.hpp:197
bool is_empty() const noexcept
Checks if the stored reference is empty.
Definition reference_wrapper_object.hpp:128
@ null_pointer
The pointer is null.
Definition exception_case.hpp:77
xtd::basic_string< char > string
Represents text as a sequence of UTF-8 code units.
Definition __string_definitions.hpp:43
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23
null_ptr null
Represents a null pointer value.
std::nullptr_t null_ptr
Represents the null_opt alias on std::nullptr_t.
Definition null_ptr.hpp:19
int32_t int32
Represents a 32-bit signed integer.
Definition int32.hpp:23
Contains xtd::hash_code class.
Contains xtd::icomparable interface.
Contains xtd::iequatable interface.
Provides classes and interfaces that support queries that use Language-Integrated Query (LINQ).
Definition enumerable.hpp:41
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
Contains xtd::null_ptr alias.
Contains xtd::object class.
Contains xtd::helpers::exception_case enum class.