xtd 0.2.0
any_object.hpp
Go to the documentation of this file.
1
3#pragma once
5#include "boxing.hpp"
6#include "enum_object.hpp"
7#include "icomparable.hpp"
8#include "iequatable.hpp"
10#include "is.hpp"
11#include "object.hpp"
12
14namespace xtd {
29 class any_object : public object, public icomparable<any_object>, public iequatable<any_object> {
30 public:
32
35 any_object() noexcept = default;
38 template<class type_t> // Can't be explicit by design.
39 any_object(type_t&& value) noexcept : value_(boxing_ptr(value)) {}
42 template<class type_t> // Can't be explicit by design.
43 any_object(type_t& value) noexcept : value_(boxing_ptr(value)) {}
46 template<class type_t> // Can't be explicit by design.
47 any_object(const type_t& value) noexcept : value_(boxing_ptr(value)) {}
49
51 any_object(any_object&&) noexcept = default;
52 any_object(any_object&) noexcept = default;
53 any_object(const any_object&) noexcept = default;
55
57
62 bool has_value() const noexcept {return value_ != null;}
63
67 const object& value() const {
69 return *value_;
70 }
72
74
86 int32 compare_to(const any_object& other) const noexcept override {
87 if (!has_value() && other.has_value()) return -1;
88 if (has_value() && !other.has_value()) return 1;
90 }
94 bool equals(const object& other) const noexcept override {return dynamic_cast<const any_object*>(&other) && equals(static_cast<const any_object&>(other));}
98 bool equals(const any_object& other) const noexcept override {
99 if (!has_value() && !other.has_value()) return true;
100 if (has_value() != other.has_value()) return false;
101 return value_->equals(*other.value_);
102 }
103
106 xtd::size get_hash_code() const noexcept override {return has_value() ? value_->get_hash_code() : 0;}
107
110 string to_string() const noexcept override {return has_value() ? value_->to_string() : "(null)";}
111
114 void reset() noexcept {value_.reset();}
116
118
128 value_ = std::move(other.value_);
129 return *this;
130 };
132
133 private:
134 template<class type_t>
135 inline ptr<object> boxing_ptr(const type_t& value) noexcept {return new_ptr<typename __box_enum_or_object__<type_t, typename std::is_enum<type_t>::type>::type>(value);}
136 template<class type_t, class ...args_t>
137 inline ptr<object> boxing_ptr(args_t&& ...args) noexcept {return new box<type_t>(args...);}
138 //inline ptr<object> boxing_ptr(const object& value) noexcept {return new value;}
139 inline ptr<object> boxing_ptr(const char* value) noexcept {return new_ptr<string>(value);}
140#if defined(__xtd__cpp_lib_char8_t)
141 inline ptr<object> boxing_ptr(const char8* value) noexcept {return new_ptr<string>(value);}
142#endif
143 inline ptr<object> boxing_ptr(const char16* value) noexcept {return new_ptr<string>(value);}
144 inline ptr<object> boxing_ptr(const char32* value) noexcept {return new_ptr<string>(value);}
145 inline ptr<object> boxing_ptr(const wchar* value) noexcept {return new_ptr<string>(value);}
146 inline ptr<object> boxing_ptr(const char& value) noexcept {return new_ptr<char_object>(value);}
147#if defined(__xtd__cpp_lib_char8_t)
148 inline ptr<object> boxing_ptr(const char8& value) noexcept {return new_ptr<char8_object>(value);}
149#endif
150 inline ptr<object> boxing_ptr(const char16& value) noexcept {return new_ptr<char16_object>(value);}
151 inline ptr<object> boxing_ptr(const char32& value) noexcept {return new_ptr<char32_object>(value);}
152 inline ptr<object> boxing_ptr(const wchar& value) noexcept {return new_ptr<wchar_object>(value);}
153 inline ptr<object> boxing_ptr(char& value) noexcept {return new_ptr<char_object>(value);}
154#if defined(__xtd__cpp_lib_char8_t)
155 inline ptr<object> boxing_ptr(char8& value) noexcept {return new_ptr<char8_object>(value);}
156#endif
157 inline ptr<object> boxing_ptr(char16& value) noexcept {return new_ptr<char16_object>(value);}
158 inline ptr<object> boxing_ptr(char32& value) noexcept {return new_ptr<char32_object>(value);}
159 inline ptr<object> boxing_ptr(wchar& value) noexcept {return new_ptr<wchar_object>(value);}
160 inline ptr<object> boxing_ptr(const xtd::byte& value) noexcept {return new_ptr<byte_object>(value);}
161 inline ptr<object> boxing_ptr(const int16& value) noexcept {return new_ptr<int16_object>(value);}
162 inline ptr<object> boxing_ptr(const int32& value) noexcept {return new_ptr<int32_object>(value);}
163 inline ptr<object> boxing_ptr(const int64& value) noexcept {return new_ptr<int64_object>(value);}
164 inline ptr<object> boxing_ptr(const slong& value) noexcept {return new_ptr<slong_object>(value);}
165 inline ptr<object> boxing_ptr(const sbyte& value) noexcept {return new_ptr<sbyte_object>(value);}
166 inline ptr<object> boxing_ptr(const uint16& value) noexcept {return new_ptr<uint16_object>(value);}
167 inline ptr<object> boxing_ptr(const uint32& value) noexcept {return new_ptr<uint32_object>(value);}
168 inline ptr<object> boxing_ptr(const uint64& value) noexcept {return new_ptr<uint64_object>(value);}
169 inline ptr<object> boxing_ptr(const xtd::ulong& value) noexcept {return new_ptr<ulong_object>(value);}
170 inline ptr<object> boxing_ptr(xtd::byte& value) noexcept {return new_ptr<byte_object>(value);}
171 inline ptr<object> boxing_ptr(int16& value) noexcept {return new_ptr<int16_object>(value);}
172 inline ptr<object> boxing_ptr(int32& value) noexcept {return new_ptr<int32_object>(value);}
173 inline ptr<object> boxing_ptr(int64& value) noexcept {return new_ptr<int64_object>(value);}
174 inline ptr<object> boxing_ptr(slong& value) noexcept {return new_ptr<slong_object>(value);}
175 inline ptr<object> boxing_ptr(sbyte& value) noexcept {return new_ptr<sbyte_object>(value);}
176 inline ptr<object> boxing_ptr(uint16& value) noexcept {return new_ptr<uint16_object>(value);}
177 inline ptr<object> boxing_ptr(uint32& value) noexcept {return new_ptr<uint32_object>(value);}
178 inline ptr<object> boxing_ptr(uint64& value) noexcept {return new_ptr<uint64_object>(value);}
179 inline ptr<object> boxing_ptr(xtd::ulong& value) noexcept {return new_ptr<ulong_object>(value);}
180 inline ptr<object> boxing_ptr(const float& value) noexcept {return new_ptr<single_object>(value);}
181 inline ptr<object> boxing_ptr(const double& value) noexcept {return new_ptr<double_object>(value);}
182 inline ptr<object> boxing_ptr(const decimal& value) noexcept {return new_ptr<decimal_object>(value);}
183 inline ptr<object> boxing_ptr(float& value) noexcept {return new_ptr<single_object>(value);}
184 inline ptr<object> boxing_ptr(double& value) noexcept {return new_ptr<double_object>(value);}
185 inline ptr<object> boxing_ptr(decimal& value) noexcept {return new_ptr<decimal_object>(value);}
186 inline ptr<object> boxing_ptr(std::nullptr_t value) noexcept {return ptr<object> {};}
187
188 ptr<object> value_;
189 };
190
192 template<class type_t, class bool_t>
193 struct __is_enum_any_object__ {};
194
195 template<class type_t>
196 struct __is_enum_any_object__<type_t, std::true_type> {
197 bool operator()(const any_object& o) const {return is<enum_object<type_t>>(o.value());}
198 };
199
200 template<class type_t>
201 struct __is_enum_any_object__<type_t, std::false_type> {
202 bool operator()(const any_object& o) const {return false;}
203 };
204
205 template<class type_t, class bool_t>
206 struct __is_polymorphic_any_object__ {};
207
208 template<class type_t>
209 struct __is_polymorphic_any_object__<type_t, std::true_type> {
210 bool operator()(const any_object& o) const {return is<type_t>(o.value());}
211 };
212
213 template<class type_t>
214 struct __is_polymorphic_any_object__<type_t, std::false_type> {
215 bool operator()(const any_object& o) const {return __is_enum_any_object__<type_t, typename std::is_enum<type_t>::type> {}(o);}
216 };
217
218 template<class type_t>
219 bool is(any_object& o) {
220 if (is<box<type_t>>(o.value())) return true;
221 return __is_polymorphic_any_object__<type_t, typename std::is_polymorphic<type_t>::type> {}(o);
222 }
223
224 template<class type_t>
225 bool is(const any_object& o) {
226 if (is<box<type_t>>(o.value())) return true;
227 return __is_polymorphic_any_object__<type_t, typename std::is_polymorphic<type_t>::type> {}(o);
228 }
229
230 template<class type_t>
231 bool is(any_object* o) {
232 if (is<box<type_t>>(o->value())) return true;
233 return __is_polymorphic_any_object__<type_t, typename std::is_polymorphic<type_t>::type> {}(*o);
234 }
235
236 template<class type_t>
237 bool is(const any_object* o) {
238 if (is<box<type_t>>(o->value())) return true;
239 return __is_polymorphic_any_object__<type_t, typename std::is_polymorphic<type_t>::type> {}(*o);
240 }
242}
Contains xtd::boxing methods.
Represent a polymorphic wrapper capable of holding any type.
Definition any_object.hpp:29
any_object(const type_t &value) noexcept
Initializes a new instance of the xtd::any_object class with specified value.
Definition any_object.hpp:47
any_object(type_t &value) noexcept
Initializes a new instance of the xtd::any_object class with specified value.
Definition any_object.hpp:43
string to_string() const noexcept override
Returns a xtd::string that represents the current object.
Definition any_object.hpp:110
bool equals(const any_object &other) const noexcept override
Indicates whether the current object is equal to another object of the same type.
Definition any_object.hpp:98
bool equals(const object &other) const noexcept override
Determines whether the specified object is equal to the current object.
Definition any_object.hpp:94
void reset() noexcept
Reset the current object. Set the current object to null.
Definition any_object.hpp:114
bool has_value() const noexcept
Gets a value indicating whether the current xtd::any_object object has a valid value of its underlyin...
Definition any_object.hpp:62
any_object() noexcept=default
Initializes a new instance of the xtd::any_object class.
any_object & operator=(const any_object &other)=default
Copy assignment operator. Replaces the contents with a copy of the contents of other.
int32 compare_to(const any_object &other) const noexcept override
Compares the current instance with another object of the same type.
Definition any_object.hpp:86
xtd::size get_hash_code() const noexcept override
Serves as a hash function for a particular type.
Definition any_object.hpp:106
const object & value() const
Gets the value of the current xtd::any_object object if it has been assigned a valid underlying value...
Definition any_object.hpp:67
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:43
The xtd::shared_ptr_object is a shared pointer as std::shared_ptr.
Definition shared_ptr_object.hpp:30
Contains xtd::enum_object struct.
Contains xtd::collections::generic::helpers::comparer struct.
@ invalid_operation
The operation is not valid.
int16_t int16
Represents a 16-bit signed integer.
Definition int16.hpp:23
char8_t char8
Represents a 8-bit unicode character.
Definition char8.hpp:27
wchar_t wchar
Represents a wide character.
Definition wchar.hpp:24
int32_t int32
Represents a 32-bit signed integer.
Definition int32.hpp:23
long double decimal
Represents a decimal-precision floating-point number.
Definition decimal.hpp:23
int64_t int64
Represents a 64-bit signed integer.
Definition int64.hpp:23
null_ptr null
Represents a null pointer value.
__ulong__ ulong
Represents a 32-bit or 64-bit unsigned integer.
Definition ulong.hpp:27
int8_t sbyte
Represents a 8-bit signed integer.
Definition sbyte.hpp:23
char16_t char16
Represents a 16-bit unicode character.
Definition char16.hpp:26
uint32_t uint32
Represents a 32-bit unsigned integer.
Definition uint32.hpp:23
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23
char32_t char32
Represents a 32-bit unicode character.
Definition char32.hpp:26
uint64_t uint64
Represents a 64-bit unsigned integer.
Definition uint64.hpp:23
uint8_t byte
Represents a 8-bit unsigned integer.
Definition byte.hpp:23
uint16_t uint16
Represents a 16-bit unsigned integer.
Definition uint16.hpp:23
__slong__ slong
Represents a 32-bit or 64-bit signed integer.
Definition slong.hpp:27
std::type_info type
Stores information about a type.
Definition type.hpp:23
bool is(std::any value)
Checks if the result of an expression is compatible with a given type.
Definition is.hpp:365
@ other
The operating system is other.
@ o
The O key.
Contains xtd::icomparable interface.
Contains xtd::iequatable interface.
Contains xtd::invalid_operation_exception exception.
Contains xtd::is method.
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition xtd_about_box.hpp:10
Contains xtd::object class.
Implements a function object for compare data.
Definition comparer.hpp:31