5#include <system/object_type.h>
6#include <system/enum.h>
7#include <system/boxed_enum.h>
8#include <system/text/string_builder.h>
9#include <system/details/pointer_collection_helpers.h>
10#include <system/get_hash_code.h>
12namespace System {
namespace Collections {
class IList; } }
30 return System::GetHashCode<T>(obj);
33 template<
typename T,
typename T2>
34 static typename std::enable_if<IsExceptionWrapper<T>::value,
bool>::type
Equals(
const T& obj,
const T2& another)
37 System::Detail::SmartPtrCounter::ThrowNullReferenceException();
38 return obj.Equals(another);
48 template<
typename T,
typename T2>
49 static typename std::enable_if<IsSmartPtr<T>::value,
bool>::type
Equals(
const T& obj,
const T2& another)
51 return obj->Equals(another);
61 template<
typename T,
typename T2>
62 static typename std::enable_if<!IsExceptionWrapper<T>::value && !
IsSmartPtr<T>::value && !std::is_scalar<T>::value,
bool>::type
Equals(T obj,
const T2& another)
64 return obj.Equals(another);
74 template<
typename T,
typename T2>
75 static typename std::enable_if<!IsSmartPtr<T>::value && std::is_scalar<T>::value,
bool>::type
Equals(
const T& obj,
const T2& another)
77 return (obj == another);
89 return another == obj;
116 static typename std::enable_if<std::is_enum<T>::value,
String>::type
ToString(
const T& obj)
127 static typename std::enable_if<IsSmartPtr<T>::value,
String>::type
ToString(
const T& obj)
129 return obj->ToString();
139 return obj->ToString();
147 static typename std::enable_if<!IsSmartPtr<T>::value && std::is_scalar<T>::value && !std::is_enum<T>::value,
String>::type
ToString(T& obj)
157 static typename std::enable_if<!IsSmartPtr<T>::value && std::is_scalar<T>::value && !std::is_enum<T>::value,
String>::type
ToString(T&& obj)
169 return obj.ToString();
176 template <
typename T>
179 return obj.ToString();
189 return obj.ToString();
200 return System::MakeObject<BoxedEnum<T>>(value);
211 return System::MakeObject<BoxedValue<T>>(value);
221 if (value ==
nullptr)
224 return System::MakeObject<BoxedValue<typename T::ValueType>>(value.get_Value());
235 using UT =
typename std::underlying_type<T>::type;
239 auto boxed = obj.template Cast<BoxedEnum<T>>();
240 return static_cast<T
>(boxed->unbox());
242 using UT =
typename std::underlying_type<T>::type;
243 if (obj && obj->
Is(ObjectExt::GetType<UT>()))
246 return static_cast<T
>(boxed->unbox());
250 throw InvalidCastException();
263 if (obj->
Is(ObjectExt::GetType<T>()))
265 auto boxed = obj.template Cast<BoxedValue<T>>();
266 return boxed->unbox();
269 throw InvalidCastException();
271 throw NullReferenceException();
285 auto boxed = obj.template Cast<BoxedValue<T>>();
286 return boxed->unbox();
289 throw InvalidCastException();
297 template<
class T,
class E>
298 static typename std::enable_if<std::is_enum<E>::value && std::numeric_limits<T>::is_integer, T>::type
Unbox(E e)
300 return static_cast<T
>(e);
308 template<
class T,
class E>
309 static typename std::enable_if<std::is_enum<E>::value && std::is_enum<T>::value, T>::type
Unbox(E e)
311 return static_cast<T
>(e);
330 if (obj->
Is(ObjectExt::GetType<T>()))
332 auto boxed = obj.template Cast<BoxedValue<T>>();
340 throw InvalidCastException();
349 static typename std::enable_if<System::IsBoxable<T>::value,
bool>::type
Is(
const T& obj)
360 template<
class T,
class U>
361 static typename std::enable_if<std::is_convertible<T, Object>::value && std::is_final<T>::value &&
363 bool>::type
Is(
const U& obj)
368 return typeid(*obj.get()) ==
typeid(T);
377 template<
class T,
class U>
378 static typename std::enable_if<std::is_convertible<T, Object>::value&& !std::is_final<T>::value &&
380 bool>::type
Is(
const U& obj)
385 return dynamic_cast<T*
>(obj.get()) !=
nullptr;
394 static typename std::enable_if<std::is_convertible<T, Object>::value,
397 return obj.
Is(T::Type());
406 static typename std::enable_if<!std::is_convertible<T, Object>::value,
417 template<
class T,
class U>
418 static typename std::enable_if<IsSmartPtr<T>::value,
bool>::type
Is(
const SmartPtr<U>& obj)
423 return dynamic_cast<typename T::Pointee_*
>(obj.
get()) !=
nullptr;
431 template<
class T,
class U>
437 return Is<SmartPtr<typename T::ExceptionType>>(obj.Get());
451 if (obj->
Is(System::ObjectExt::GetType<typename T::ValueType>()))
463 static typename std::enable_if<
471 if (obj->
Is(System::ObjectExt::GetType<T>()))
479 return !boxed->
unbox().IsNull();
491 static typename std::enable_if<
499 if (obj->
Is(TypeInfo::BoxedValueType<T>()))
513 template <
class T,
class V>
514 static typename std::enable_if<
518 return dynamic_cast<T*
>(obj.
get()) !=
nullptr;
527 template<
class T,
class U>
528 static typename std::enable_if<std::is_enum<T>::value,
bool>::type
Is(
const SmartPtr<U>& obj)
533 if (obj->
Is(TypeInfo::BoxedValueType<T>()))
545 template<
class T,
class U>
546 static typename std::enable_if<std::is_enum<T>::value,
bool>::type
Is(
const WeakPtr<U>& obj)
551 if (obj->
Is(TypeInfo::BoxedValueType<T>()))
562 template<
class T,
class U>
565 TypeInfo typeU = ObjectExt::GetType<U>();
566 TypeInfo typeT = ObjectExt::GetType<T>();
576 template<
class T,
class U>
579 if (value ==
nullptr)
582 return IsImpl<T, U>();
591 static bool Is(
const char16_t* str)
596 return IsImpl<T, System::String>();
605 static bool Is(int32_t value)
607 ASPOSE_UNUSED(value);
609 return IsImpl<T, System::Int32>();
624 return obj.template Cast<Object>();
644 return obj.template Cast<typename T::Pointee_>();
654 return System::ObjectExt::Unbox<T>(obj);
663 static typename std::enable_if<!std::is_scalar<T>::value,
bool>::type
UnknownIsNull(T obj)
665 return obj ==
nullptr;
674 static typename std::enable_if<std::is_scalar<T>::value,
bool>::type
UnknownIsNull(T obj)
686 template<
typename RT1,
typename RT2,
typename F>
687 static typename std::conditional<std::is_convertible<RT2, RT1>::value, RT1, RT2>::type
CoalesceInternal(RT1 value, F func)
689 return value !=
nullptr ? value : func();
699 template<
typename T0,
typename T1>
702 using retval_t = System::Details::ResultOf<T1>;
703 return CoalesceInternal<T0, retval_t,
typename std::function<retval_t()>>(value, func);
712 template<
typename T0,
typename T1>
733 template<
typename To,
typename ...From>
734 static typename std::enable_if<(std::is_fundamental<To>::value), std::array<To,
sizeof...(From)>>::type
ArrayInitializerCast(From ...args)
736 return std::array<To,
sizeof...(From)>({
static_cast<To
>(args)... });
760inline bool ObjectExt::Equals<float, float>(
const float& obj,
const float& another)
762 return (std::isnan(obj) && std::isnan(another)) ? true : obj == another;
771inline bool ObjectExt::Equals<double, double>(
const double& obj,
const double& another)
773 return (std::isnan(obj) && std::isnan(another)) ? true : obj == another;
782 return value.
IsNull() ? nullptr : MakeObject<BoxedValue<String>>(value);
794 if (obj && obj->
Is(String::Type()))
797 return boxed->
unbox();
800 throw InvalidCastException();
807struct IsObjectArray : std::false_type {};
809struct IsObjectArray<
System::
Array<SmartPtr<O>>> : std::is_base_of<System::Object, O> {};
811struct IsObjectArray<
System::
Array<String>> : std::true_type {};
813struct IsObjectArray<SmartPtr<
A>> : IsObjectArray<A> {};
819template <
typename Source,
typename Result>
823 static constexpr bool None = std::is_same<Source, Result>::value;
826 static constexpr bool StaticArithmetic =
827 (std::is_enum<Source>::value || std::is_arithmetic<Source>::value) &&
828 (std::is_enum<Result>::value || std::is_arithmetic<Result>::value);
830 static constexpr bool StaticIntPtr =
831 (std::is_same<Source, IntPtr>::value && (std::is_arithmetic<Result>::value || std::is_pointer<Result>::value)) ||
832 (std::is_same<Result, IntPtr>::value && (std::is_arithmetic<Source>::value || std::is_pointer<Source>::value));
834 static constexpr bool StaticString = std::is_same<Result, String>::value && std::is_constructible<String, Source>::value;
836 static constexpr bool Static = !
None && (StaticArithmetic || StaticIntPtr || StaticString);
840 IsExceptionWrapper<Source>::value && IsExceptionWrapper<Result>::value &&
841 (std::is_convertible<Result, Source>::value || std::is_base_of<Result, Source>::value);
843 static constexpr bool ObjectToException = !
None &&
844 std::is_same<SharedPtr<System::Object>, Source>::value && IsExceptionWrapper<Result>::value;
847 static constexpr bool Array = !
None && IsObjectArray<Result>::value && IsObjectArray<Source>::value;
850 static constexpr bool ToSmartPointer = std::is_base_of<System::Object, Result>::value &&
851 !IsExceptionWrapper<Result>::value && !IsBoxable<Result>::value;
853 static constexpr bool RawPointer = ToSmartPointer && std::is_pointer<Source>::value &&
854 std::is_base_of<Object, std::remove_pointer_t<Source>>::value;
856 static constexpr bool Pointer = !
None && !
Array && ToSmartPointer && IsSmartPtr<Source>::value;
858 static constexpr bool PointerToPointer = !
None && !
Array && IsSmartPtr<Source>::value && IsSmartPtr<Result>::value;
861 static constexpr bool UnboxingToNullable =
862 (std::is_same<Source, SmartPtr<Object>>::value || std::is_same<Source, std::nullptr_t>::value) &&
863 IsNullable<Result>::value;
866 static constexpr bool InterfaceUnboxingToNullable =
867 !std::is_same<Source, SmartPtr<Object>>::value && IsSmartPtr<Source>::value && IsNullable<Result>::value;
870 static constexpr bool InterfaceUnboxing = !std::is_same<Source, SmartPtr<Object>>::value &&
871 IsSmartPtr<Source>::value && !IsNullable<Result>::value &&
872 std::is_base_of<Details::BoxableObjectBase, Result>::value;
875 static constexpr bool NullableBoxing = !UnboxingToNullable && (std::is_same<Result, Nullable<Source>>::value ||
876 (IsNullable<Result>::value && std::is_same<Source, std::nullptr_t>::value));
878 static constexpr bool NullableUnboxing = std::is_same<Source, Nullable<Result>>::value;
881 static constexpr bool BoxingCommon = !
None && (std::is_base_of<Object, Result>::value || IsSmartPtr<Result>::value);
883 static constexpr bool EnumBoxing = BoxingCommon && std::is_enum<Source>::value;
885 static constexpr bool HeapifyBoxing = std::is_same<Result, SharedPtr<Source>>::value;
887 static constexpr bool InterfaceBoxing = BoxingCommon && !HeapifyBoxing && !std::is_same<Result, Object>::value &&
888 std::is_base_of<Details::BoxableObjectBase, Source>::value;
890 static constexpr bool Boxing = BoxingCommon && !EnumBoxing && !HeapifyBoxing && !InterfaceBoxing && IsBoxable<Source>::value;
892 static constexpr bool StringBoxing = BoxingCommon && !Boxing && !Pointer && !std::is_same<Source, std::nullptr_t>::value &&
893 std::is_constructible<String, Source>::value;
896 static constexpr bool Unboxing =
897 !UnboxingToNullable && !InterfaceUnboxing && IsSmartPtr<Source>::value && IsBoxable<Result>::value;
900 static constexpr bool UnboxingToString = std::is_same<Result, String>::value && std::is_same<Source, SmartPtr<Object>>::value;
903 static constexpr bool Null = !
Static && !UnboxingToNullable && !NullableBoxing &&
904 std::is_same<Source, std::nullptr_t>::value;
907 static constexpr bool InvalidUnboxing = Unboxing && !InterfaceUnboxingToNullable && !InterfaceUnboxing && !std::is_same<Source, SmartPtr<Object>>::value;
918template <
typename Result,
typename Source>
919std::enable_if_t<Details::CastType<Source, Result>::None, Result>
ExplicitCast(
const Source& value)
930template <
typename Result,
typename Source>
931std::enable_if_t<Details::CastType<Source, Result>::Static, Result>
ExplicitCast(
const Source& value)
933 return Result(value);
943template <
typename Result,
typename Source>
944std::enable_if_t<Details::CastType<Source, Result>::Exception, Result>
ExplicitCast(
const Source& value)
946 return value.Get().template Cast<typename Result::ExceptionType, std::true_type>() ? Result(value.Get())
957template <
typename Result,
typename Source>
958std::enable_if_t<Details::CastType<Source, Result>::ObjectToException, Result>
ExplicitCast(
const Source& value)
960 auto exception_ptr = value.template Cast<typename Result::ExceptionType, std::true_type>();
961 return exception_ptr ? Result(exception_ptr.template Cast<System::Details_Exception, std::true_type>())
972template <
typename Result,
typename Source>
976 return value.template Cast<Result, std::true_type>();
986template <
typename Result,
typename Source>
987std::enable_if_t<Details::CastType<Source, Result>::RawPointer,
typename CastResult<std::remove_pointer_t<Result>>::type>
990 return ExplicitCast<Result>(
SmartPtr<std::remove_pointer_t<Source>>(value));
1000template <
typename Result,
typename Source>
1001std::enable_if_t<Details::CastType<Source, Result>::PointerToPointer, Result>
1004 return ExplicitCast<typename Result::Pointee_>(value);
1014template <
typename Result,
typename Source>
1015std::enable_if_t<Details::CastType<Source, Result>::UnboxingToNullable, Result>
1018 return ObjectExt::UnboxToNullable<typename Result::ValueType>(value,
false);
1027template <
typename Result,
typename Source>
1028std::enable_if_t<Details::CastType<Source, Result>::NullableBoxing, Result>
ExplicitCast(
const Source& value)
1030 return Result(value);
1040template <
typename Result,
typename Source>
1041std::enable_if_t<Details::CastType<Source, Result>::NullableUnboxing, Result>
ExplicitCast(
const Source& value)
1043 if (value ==
nullptr)
1044 throw NullReferenceException(u
"Can not unbox null value");
1046 return static_cast<Result
>(value);
1055template <
typename Result,
typename Source>
1056std::enable_if_t<Details::CastType<Source, Result>::EnumBoxing, SmartPtr<BoxedValueBase>>
1069template <
typename Result,
typename Source>
1073 return MakeObject<Source>(value).template Cast<typename Result::Pointee_, std::true_type>();
1082template <
typename Result,
typename Source>
1086 return MakeObject<Source>(value).template Cast<Result, std::true_type>();
1095template <
typename Result,
typename Source>
1108template <
typename Result,
typename Source>
1112 return ObjectExt::Box<String>(value);
1121template <
typename Result,
typename Source>
1122std::enable_if_t<Details::CastType<Source, Result>::InterfaceUnboxing, Result>
ExplicitCast(
const Source& value)
1124 return *(value.template Cast<Result, std::true_type>());
1133template <
typename Result,
typename Source>
1134std::enable_if_t<Details::CastType<Source, Result>::Unboxing, Result>
ExplicitCast(
const Source& value)
1136 return ObjectExt::Unbox<Result>(value);
1145template <
typename Result,
typename Source>
1158template <
typename Result,
typename Source>
1164 auto result = MakeArray<typename Result::ValueType>(value->data().size());
1165 std::transform(value->data().begin(), value->data().end(), result->data().begin(),
1166 [](
const auto& value) {return ExplicitCast<typename Result::ValueType>(value);});
1177template <
typename Result,
typename Source>
1178std::enable_if_t<Details::CastType<Source, Result>::Static, Result>
AsCast(
const Source& value)
1180 return Result(value);
1189template <
typename Result,
typename Source>
1190std::enable_if_t<Details::CastType<Source, Result>::None, Result>
AsCast(
const Source& value)
1201template <
typename Result,
typename Source>
1202std::enable_if_t<Details::CastType<Source, Result>::Exception, Result>
AsCast(
const Source& value)
1204 return value.Get().template Cast<typename Result::ExceptionType, std::false_type>() ? Result(value.Get())
1214template <
typename Result,
typename Source>
1215std::enable_if_t<Details::CastType<Source, Result>::ObjectToException, Result>
AsCast(
const Source& value)
1217 auto exception_ptr = value.template Cast<typename Result::ExceptionType, std::false_type>();
1218 return exception_ptr ? Result(exception_ptr.template Cast<System::Details_Exception, std::false_type>())
1228template <
typename Result,
typename Source>
1232 return value.template Cast<Result, std::false_type>();
1241template <
typename Result,
typename Source>
1242std::enable_if_t<Details::CastType<Source, Result>::PointerToPointer, Result>
1245 return AsCast<typename Result::Pointee_>(value);
1254template <
typename Result,
typename Source>
1255std::enable_if_t<Details::CastType<Source, Result>::UnboxingToNullable, Result>
1258 return ObjectExt::UnboxToNullable<typename Result::ValueType>(value,
true);
1267template <
typename Result,
typename Source>
1268std::enable_if_t<Details::CastType<Source, Result>::InterfaceUnboxingToNullable, Result>
AsCast(
const Source& value)
1271 if (ObjectExt::Is<typename Result::ValueType>(value))
1273 result = *(value.template Cast<typename Result::ValueType, std::false_type>());
1283template <
typename Result,
typename Source>
1284std::enable_if_t<Details::CastType<Source, Result>::InvalidUnboxing, Result>
AsCast(
const Source& value)
1286 return Default<Result>();
1295template <
typename Result,
typename Source>
1296std::enable_if_t<Details::CastType<Source, Result>::NullableBoxing, Result>
AsCast(
const Source& value)
1298 return Result(value);
1307template <
typename Result,
typename Source>
1311 if (!ObjectExt::Is<Result>(value))
1316 return MakeObject<Source>(value).template Cast<Result, std::false_type>();
1325template <
typename Result,
typename Source>
1329 return ObjectExt::Box(value).template Cast<typename Result::Pointee_, std::false_type>();
1338template <
typename Result,
typename Source>
1339std::enable_if_t<Details::CastType<Source, Result>::UnboxingToString, Result>
AsCast(
const Source& value)
1350template <
typename Result,
typename Source>
1362template <
typename Result,
typename Source>
1368 auto result = MakeArray<typename Result::ValueType>(value->data().size());
1369 auto d_it = result->data().begin();
1370 auto s_it = value->data().begin();
1371 while (s_it != value->data().end())
1373 auto& source_element = *(s_it++);
1374 auto& result_element = *(d_it++);
1376 result_element = AsCast<typename Result::ValueType>(source_element);
1379 if (source_element !=
nullptr && result_element ==
nullptr)
1392template <
typename T0,
typename T1>
1396 using retval_t = System::Details::ResultOf<T1, T0>;
1399 using result_t =
typename std::conditional<
1400 std::is_base_of<Details::BoxableObjectBase, retval_t>::value || std::is_arithmetic<retval_t>::value || std::is_enum<retval_t>::value,
1404 return expr !=
nullptr ? result_t(func(expr)) : result_t(
nullptr);
Represents boxed enumeration value. Objects of this class should only be allocated using System::Make...
Definition: boxed_enum.h:27
Represents a boxed value. Objects of this class should only be allocated using System::MakeObject() f...
Definition: boxed_value.h:172
const T & unbox() const
Unboxes the value represented by the current object.
Definition: boxed_value.h:202
Template that represents wrapper of exceptions that are derived from Exception class.
Definition: exception.h:113
Forward declaration.
Definition: nullable.h:75
T get_Value() const
Returns a copy of the value represented by the current object.
Definition: nullable.h:144
bool IsNull() const
Determines if the current object represents a null-value.
Definition: nullable.h:172
Provides static methods that emulate C# Object methods called for non-Object C++ types (strings,...
Definition: object_ext.h:21
static bool Is(int32_t value)
Implements 'is' operator translation. Specialization for integer literal.
Definition: object_ext.h:605
static String ToString(const char_t *obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:96
static std::enable_if< System::IsBoxable< T >::value &&!IsNullable< T >::value &&!std::is_enum< T >::value &&detail::has_operator_equal< T >::value, bool >::type Is(const SmartPtr< Object > &obj)
Implements 'is' operator translation. Specialization for boxable types with == operator defined.
Definition: object_ext.h:466
static std::enable_if<(std::is_fundamental< To >::value), std::array< To, sizeof...(From)> >::type ArrayInitializerCast(From ...args)
Converts array fundamental values (which C# does implicitly but C++ apparently does not).
Definition: object_ext.h:734
static T0 Coalesce(System::Nullable< T0 > value, T1 func)
Implementation of '??' operator translation for nullable types.
Definition: object_ext.h:713
static std::enable_if<!std::is_enum< T >::value &&!IsNullable< T >::value, System::SmartPtr< System::Object > >::type Box(const T &value)
Boxes value types for converting to Object. Implementation for non-enum types.
Definition: object_ext.h:209
static std::enable_if< IsSmartPtr< T >::value, bool >::type Is(const SmartPtr< U > &obj)
Implements 'is' operator translation. Specialization for pointer types.
Definition: object_ext.h:418
static std::enable_if< IsSmartPtr< T >::value, String >::type ToString(const T &obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:127
static std::enable_if<!IsSmartPtr< T >::value &&!std::is_scalar< T >::value &&!IsNullable< T >::value &&!std::is_reference< T >::value, String >::type ToString(T &&obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:187
static std::enable_if<!std::is_convertible< T, Object >::value, bool >::type Is(const Object &obj)
Implements 'is' operator translation. Specialization for unconvertible types.
Definition: object_ext.h:407
static std::enable_if< std::is_enum< E >::value &&std::is_enum< T >::value, T >::type Unbox(E e)
Converts enum types.
Definition: object_ext.h:309
static bool Equals(const char_t(&obj)[N], String another)
Substitution for C# Object.Equals calls working for any type in C++. Overload for string literal with...
Definition: object_ext.h:87
static SmartPtr< System::BoxedValueBase > BoxEnum(T enumValue)
Boxes enum types for being propagated as Object.
Definition: object_ext.h:723
static SmartPtr< System::Collections::IList > CastToIList(const SmartPtr< Object > &obj)
static std::enable_if< std::is_enum< T >::value, bool >::type Is(const SmartPtr< U > &obj)
Implements 'is' operator translation. Specialization for enum types.
Definition: object_ext.h:528
static bool Is(const Nullable< U > &value)
Implements 'is' operator translation. Specialization for Nullable type.
Definition: object_ext.h:577
static std::enable_if<!IsSmartPtr< T >::value &&!std::is_scalar< T >::value &&!IsNullable< T >::value, String >::type ToString(const T &obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:177
static std::enable_if<!std::is_enum< T >::value &&!detail::has_operator_equal< T >::value, T >::type Unbox(const SmartPtr< Object > &obj)
Unboxes value types after converting to Object. Implementation for non-enum & non-nullable types.
Definition: object_ext.h:280
static std::enable_if< std::is_convertible< T, Object >::value &&std::is_final< T >::value &&!System::IsBoxable< T >::value &&System::IsSmartPtr< U >::value, bool >::type Is(const U &obj)
Implements 'is' operator translation. Specialization for pointer types optimized for 'final' classes.
Definition: object_ext.h:363
static std::enable_if< std::is_enum< T >::value, T >::type Unbox(const SmartPtr< Object > &obj)
Unboxes value types after converting to Object. Implementation for enum types.
Definition: object_ext.h:233
static std::enable_if< std::is_convertible< T, Object >::value &&!std::is_final< T >::value &&!System::IsBoxable< T >::value &&System::IsSmartPtr< U >::value, bool >::type Is(const U &obj)
Implements 'is' operator translation. Specialization for pointer types.
Definition: object_ext.h:380
static std::enable_if<!IsSmartPtr< T >::value, T >::type ObjectToUnknown(SmartPtr< Object > obj)
Converts Object to unknown type, handling both smart pointer type and boxed value situations.
Definition: object_ext.h:652
static std::enable_if<!IsSmartPtr< T >::value &&std::is_scalar< T >::value &&!std::is_enum< T >::value, String >::type ToString(T &obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:147
static auto Coalesce(T0 value, T1 func)
Implementation of '??' operator translation for non-nullable types.
Definition: object_ext.h:700
static std::enable_if< std::is_enum< E >::value &&std::numeric_limits< T >::is_integer, T >::type Unbox(E e)
Unboxes enum types to integer.
Definition: object_ext.h:298
static std::enable_if<!std::is_scalar< T >::value, bool >::type UnknownIsNull(T obj)
Checks whether unknown type object is nullptr. Overload for non-scalar types.
Definition: object_ext.h:663
static std::enable_if< std::is_scalar< T >::value, bool >::type UnknownIsNull(T obj)
Checks whether unknown type object is nullptr. Overload for scalar types.
Definition: object_ext.h:674
static std::enable_if< std::is_enum< T >::value, bool >::type Is(const WeakPtr< U > &obj)
Implements 'is' operator translation. Specialization for enum types vs weak pointers.
Definition: object_ext.h:546
static std::enable_if<!IsSmartPtr< T >::value, System::SmartPtr< Object > >::type UnknownToObject(const T &obj)
Converts unknown type to Object, handling both smart pointer type and value type situations.
Definition: object_ext.h:632
static std::enable_if< std::is_enum< T >::value, String >::type ToString(const T &obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:116
static bool Is(const char16_t *str)
Implements 'is' operator translation. Specialization for string literal.
Definition: object_ext.h:591
static std::enable_if<!IsExceptionWrapper< T >::value &&!IsSmartPtr< T >::value &&!std::is_scalar< T >::value &&!IsNullable< T >::value, String >::type ToString(T &obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:167
static std::enable_if<!IsSmartPtr< T >::value &&std::is_scalar< T >::value, bool >::type Equals(const T &obj, const T2 &another)
Substitution for C# Object.Equals calls working for any type in C++. Overload for scalar types.
Definition: object_ext.h:75
static std::enable_if< System::IsBoxable< T >::value, bool >::type Is(const T &obj)
Implements 'is' operator translation. Specialization for boxable (value) types which exactly is that ...
Definition: object_ext.h:349
static int GetHashCode(const T &obj)
Implements GetHashCode() calls; works on both Object subclasses and unrelated types.
Definition: object_ext.h:28
static std::enable_if< IsExceptionWrapper< T >::value, bool >::type Is(const ExceptionWrapper< U > &obj)
Implements 'is' operator translation. Specialization for exception wrapper types.
Definition: object_ext.h:432
static std::enable_if< System::IsBoxable< T >::value &&!IsNullable< T >::value &&!std::is_enum< T >::value &&!std::is_same< V, Object >::value, bool >::type Is(const SmartPtr< V > &obj)
Implements 'is' operator translation. Specialization value types boxed to interfaces.
Definition: object_ext.h:516
static std::enable_if< System::IsBoxable< T >::value &&!IsNullable< T >::value &&!std::is_enum< T >::value &&!detail::has_operator_equal< T >::value, bool >::type Is(const SmartPtr< Object > &obj)
Implements 'is' operator translation. Specialization for boxable types without defined ==.
Definition: object_ext.h:494
static std::conditional< std::is_convertible< RT2, RT1 >::value, RT1, RT2 >::type CoalesceInternal(RT1 value, F func)
Implementation of '??' operator translation for non-nullable types. Overload for case if RT2 is conve...
Definition: object_ext.h:687
static std::enable_if< System::IsBoxable< T >::value, System::SharedPtr< System::Object > >::type ExplicitCastToObject(const T &value)
Definition: object_ext.h:742
static std::enable_if< IsExceptionWrapper< T >::value, bool >::type Equals(const T &obj, const T2 &another)
Definition: object_ext.h:34
static std::enable_if<!IsSmartPtr< T >::value &&std::is_scalar< T >::value &&!std::is_enum< T >::value, String >::type ToString(T &&obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:157
static Nullable< T > UnboxToNullable(const SmartPtr< Object > &obj, bool safe=true)
Unboxes object to nullable type.
Definition: object_ext.h:326
static std::enable_if< IsSmartPtr< T >::value, System::SmartPtr< Object > >::type UnknownToObject(T obj)
Converts unknown type to Object, handling both smart pointer type and value type situations.
Definition: object_ext.h:622
static std::enable_if< IsNullable< T >::value, bool >::type Is(const SmartPtr< Object > &obj)
Implements 'is' operator translation. Specialization for nullable types.
Definition: object_ext.h:446
static std::enable_if< IsSmartPtr< T >::value, bool >::type Equals(const T &obj, const T2 &another)
Substitution for C# Object.Equals calls working for any type in C++. Overload for smart pointer types...
Definition: object_ext.h:49
static bool IsBoxedValue(const SmartPtr< Object > &obj)
Checks if object is a boxed value.
static String ToString(const Nullable< T > &obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:106
static std::enable_if<!std::is_enum< T >::value &&detail::has_operator_equal< T >::value, T >::type Unbox(const SmartPtr< Object > &obj)
Unboxes value types after converting to Object. Implementation for non-enum & non-nullable types.
Definition: object_ext.h:259
static std::enable_if< IsSmartPtr< T >::value, T >::type ObjectToUnknown(SmartPtr< Object > obj)
Converts Object to unknown type, handling both smart pointer type and bpxed value situations.
Definition: object_ext.h:642
static std::enable_if<!IsExceptionWrapper< T >::value &&!IsSmartPtr< T >::value &&!std::is_scalar< T >::value, bool >::type Equals(T obj, const T2 &another)
Substitution for C# Object.Equals calls working for any type in C++. Overload for structure types.
Definition: object_ext.h:62
static std::enable_if< std::is_convertible< T, Object >::value, bool >::type Is(const Object &obj)
Implements 'is' operator translation. Specialization for value types.
Definition: object_ext.h:395
static String UnboxStringSafe(const SmartPtr< Object > &obj)
Unboxes string from boxed value.
static std::enable_if< System::IsSmartPtr< T >::value, System::SharedPtr< System::Object > >::type ExplicitCastToObject(const T &value)
Definition: object_ext.h:748
static std::enable_if< std::is_enum< T >::value, System::SmartPtr< System::Object > >::type Box(const T &value)
Boxes value types for converting to Object. Implementation for enum types.
Definition: object_ext.h:198
static std::enable_if< IsNullable< T >::value, System::SmartPtr< System::Object > >::type Box(const T &value)
Boxes Nullable types for converting to Object.
Definition: object_ext.h:219
static std::enable_if< IsSmartPtr< T >::value||std::is_pointer< T >::value||IsExceptionWrapper< T >::value, String >::type ToString(T &obj)
Substitution for C# ToString method to work on any C++ type.
Definition: object_ext.h:137
Base class that enables using methods available for System.Object class in C#. All non-trivial classe...
Definition: object.h:62
virtual bool Is(const TypeInfo &targetType) const
Check if object represents an instance of type described by targetType. Analog of C# 'is' operator.
Provides static methods that implement object type getters. This is a static type with no instance se...
Definition: object_type.h:26
Pointee_ * get() const
Gets pointed object.
Definition: smart_ptr.h:518
std::enable_if_t< std::is_same< Y, T >::value, SmartPtr< Y > > Cast() const
Casts pointer to its type itself.
Definition: smart_ptr.h:742
bool Is(const System::TypeInfo &target) const
Checks if pointed object is of specific type or its child type. Follows C# 'is' semantics.
Definition: object.h:875
String class used across the library. Is a substitute for C# System.String when translating code....
Definition: string.h:122
bool IsNullOrEmpty() const
Checks if string is empty or is considered null.
bool IsNull() const
Checks if string is considered null. String is null and only if it is constructed via String() constr...
Definition: string.h:285
Represents a particular type and provides information about it.
Definition: type_info.h:109
bool IsSubclassOf(const TypeInfo &type) const
Determines whether the type represented by the current object is a subclass of the specified class.
Subclass of System::SmartPtr which sets itself to weak mode at construction. Please note that this cl...
Definition: weak_ptr.h:18
@ Static
Look through static members.
@ Null
No encryption algorithm is used with a 'Null' cipher algorithm.
Definition: db_command.h:9
static auto SafeInvoke(T0 expr, T1 func)
Implementation of '?.' operator translation.
Definition: object_ext.h:1393
std::enable_if_t< Details::CastType< Source, Result >::Static, Result > AsCast(const Source &value)
Casts the source type to the result type using 'as' operator cast. Used when simple constructor-like ...
Definition: object_ext.h:1178
std::enable_if_t< Details::CastType< Source, Result >::None, Result > ExplicitCast(const Source &value)
Casts the source type to the result type using explicit cast. Used when the source and the result typ...
Definition: object_ext.h:919
class ASPOSECPP_SHARED_CLASS Array
Definition: smart_ptr.h:22
ExceptionWrapper< Details_Exception > Exception
Alias to be used instead of Details::Exception.
Definition: exception.h:369
SmartPtr< TTo > type
An alias for a pointer to an instance of TTo.
Definition: object.h:387
static String ToString(int8_t value)
Converts the specified value to its string representation.
static std::enable_if< std::is_same< T, E >::value||std::is_convertible< T, UnderlyingType >::value, String >::type GetName(T value)
Returns the name of the enumeration constant that has the specified value.
Definition: enum.h:213
static bool IsDefined(E value)
Determines whether the specified value is a member of enumeration type E.
Definition: enum.h:180
Template predicate that checks if boxing of the specified type is supported.
Definition: boxable_traits.h:16
A template predicate that determines if the specified type is a Exception class or its descendant.
Definition: object.h:405
A template predicate that determines if its template argument T in Nullable or its subclass.
Definition: nullable.h:23
Trait class to check if a type is a specialization of SmartPtr class.
Definition: smart_ptr.h:1499
Checks whether operator == exists in specified type. If so, inherits std::true_type,...
Definition: detail.h:122