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>
724 template <
typename T0,
typename T1>
727 if (value ==
nullptr)
749 template<
typename To,
typename ...From>
750 static typename std::enable_if<(std::is_fundamental<To>::value), std::array<To,
sizeof...(From)>>::type
ArrayInitializerCast(From ...args)
752 return std::array<To,
sizeof...(From)>({
static_cast<To
>(args)... });
776inline bool ObjectExt::Equals<float, float>(
const float& obj,
const float& another)
778 return (std::isnan(obj) && std::isnan(another)) ? true : obj == another;
787inline bool ObjectExt::Equals<double, double>(
const double& obj,
const double& another)
789 return (std::isnan(obj) && std::isnan(another)) ? true : obj == another;
798 return value.
IsNull() ? nullptr : MakeObject<BoxedValue<String>>(value);
810 if (obj && obj->
Is(String::Type()))
813 return boxed->
unbox();
816 throw InvalidCastException();
823struct IsObjectArray : std::false_type {};
825struct IsObjectArray<
System::
Array<SmartPtr<O>>> : std::is_base_of<System::Object, O> {};
827struct IsObjectArray<
System::
Array<String>> : std::true_type {};
829struct IsObjectArray<SmartPtr<
A>> : IsObjectArray<A> {};
835template <
typename Source,
typename Result>
839 static constexpr bool None = std::is_same<Source, Result>::value;
842 static constexpr bool StaticArithmetic =
843 (std::is_enum<Source>::value || std::is_arithmetic<Source>::value) &&
844 (std::is_enum<Result>::value || std::is_arithmetic<Result>::value);
846 static constexpr bool StaticIntPtr =
847 (std::is_same<Source, IntPtr>::value && (std::is_arithmetic<Result>::value || std::is_pointer<Result>::value)) ||
848 (std::is_same<Result, IntPtr>::value && (std::is_arithmetic<Source>::value || std::is_pointer<Source>::value));
850 static constexpr bool StaticString = std::is_same<Result, String>::value && std::is_constructible<String, Source>::value;
852 static constexpr bool Static = !
None && (StaticArithmetic || StaticIntPtr || StaticString);
856 IsExceptionWrapper<Source>::value && IsExceptionWrapper<Result>::value &&
857 (std::is_convertible<Result, Source>::value || std::is_base_of<Result, Source>::value);
859 static constexpr bool ObjectToException = !
None &&
860 std::is_same<SharedPtr<System::Object>, Source>::value && IsExceptionWrapper<Result>::value;
863 static constexpr bool Array = !
None && IsObjectArray<Result>::value && IsObjectArray<Source>::value;
866 static constexpr bool ToSmartPointer = std::is_base_of<System::Object, Result>::value &&
867 !IsExceptionWrapper<Result>::value && !IsBoxable<Result>::value;
869 static constexpr bool RawPointer = ToSmartPointer && std::is_pointer<Source>::value &&
870 std::is_base_of<Object, std::remove_pointer_t<Source>>::value;
872 static constexpr bool Pointer = !
None && !
Array && ToSmartPointer && IsSmartPtr<Source>::value;
874 static constexpr bool PointerToPointer = !
None && !
Array && IsSmartPtr<Source>::value && IsSmartPtr<Result>::value;
877 static constexpr bool UnboxingToNullable =
878 (std::is_same<Source, SmartPtr<Object>>::value || std::is_same<Source, std::nullptr_t>::value) &&
879 IsNullable<Result>::value;
882 static constexpr bool InterfaceUnboxingToNullable =
883 !std::is_same<Source, SmartPtr<Object>>::value && IsSmartPtr<Source>::value && IsNullable<Result>::value;
886 static constexpr bool InterfaceUnboxing = !std::is_same<Source, SmartPtr<Object>>::value &&
887 IsSmartPtr<Source>::value && !IsNullable<Result>::value &&
888 std::is_base_of<Details::BoxableObjectBase, Result>::value;
891 static constexpr bool NullableBoxing = !UnboxingToNullable && (std::is_same<Result, Nullable<Source>>::value ||
892 (IsNullable<Result>::value && std::is_same<Source, std::nullptr_t>::value));
894 static constexpr bool NullableUnboxing = std::is_same<Source, Nullable<Result>>::value;
897 static constexpr bool BoxingCommon = !
None && (std::is_base_of<Object, Result>::value || IsSmartPtr<Result>::value);
899 static constexpr bool EnumBoxing = BoxingCommon && std::is_enum<Source>::value;
901 static constexpr bool HeapifyBoxing = std::is_same<Result, SharedPtr<Source>>::value;
903 static constexpr bool InterfaceBoxing = BoxingCommon && !HeapifyBoxing && !std::is_same<Result, Object>::value &&
904 std::is_base_of<Details::BoxableObjectBase, Source>::value;
906 static constexpr bool Boxing = BoxingCommon && !EnumBoxing && !HeapifyBoxing && !InterfaceBoxing && IsBoxable<Source>::value;
908 static constexpr bool StringBoxing = BoxingCommon && !Boxing && !Pointer && !std::is_same<Source, std::nullptr_t>::value &&
909 std::is_constructible<String, Source>::value;
912 static constexpr bool Unboxing =
913 !UnboxingToNullable && !InterfaceUnboxing && IsSmartPtr<Source>::value && IsBoxable<Result>::value;
916 static constexpr bool UnboxingToString = std::is_same<Result, String>::value && std::is_same<Source, SmartPtr<Object>>::value;
919 static constexpr bool Null = !
Static && !UnboxingToNullable && !NullableBoxing &&
920 std::is_same<Source, std::nullptr_t>::value;
923 static constexpr bool InvalidUnboxing = Unboxing && !InterfaceUnboxingToNullable && !InterfaceUnboxing && !std::is_same<Source, SmartPtr<Object>>::value;
934template <
typename Result,
typename Source>
935std::enable_if_t<Details::CastType<Source, Result>::None, Result>
ExplicitCast(
const Source& value)
946template <
typename Result,
typename Source>
947std::enable_if_t<Details::CastType<Source, Result>::Static, Result>
ExplicitCast(
const Source& value)
949 return Result(value);
959template <
typename Result,
typename Source>
960std::enable_if_t<Details::CastType<Source, Result>::Exception, Result>
ExplicitCast(
const Source& value)
962 return value.Get().template Cast<typename Result::ExceptionType, std::true_type>() ? Result(value.Get())
973template <
typename Result,
typename Source>
974std::enable_if_t<Details::CastType<Source, Result>::ObjectToException, Result>
ExplicitCast(
const Source& value)
976 auto exception_ptr = value.template Cast<typename Result::ExceptionType, std::true_type>();
977 return exception_ptr ? Result(exception_ptr.template Cast<System::Details_Exception, std::true_type>())
988template <
typename Result,
typename Source>
992 return value.template Cast<Result, std::true_type>();
1002template <
typename Result,
typename Source>
1003std::enable_if_t<Details::CastType<Source, Result>::RawPointer,
typename CastResult<std::remove_pointer_t<Result>>::type>
1006 return ExplicitCast<Result>(
SmartPtr<std::remove_pointer_t<Source>>(value));
1016template <
typename Result,
typename Source>
1017std::enable_if_t<Details::CastType<Source, Result>::PointerToPointer, Result>
1020 return ExplicitCast<typename Result::Pointee_>(value);
1030template <
typename Result,
typename Source>
1031std::enable_if_t<Details::CastType<Source, Result>::UnboxingToNullable, Result>
1034 return ObjectExt::UnboxToNullable<typename Result::ValueType>(value,
false);
1043template <
typename Result,
typename Source>
1044std::enable_if_t<Details::CastType<Source, Result>::NullableBoxing, Result>
ExplicitCast(
const Source& value)
1046 return Result(value);
1056template <
typename Result,
typename Source>
1057std::enable_if_t<Details::CastType<Source, Result>::NullableUnboxing, Result>
ExplicitCast(
const Source& value)
1059 if (value ==
nullptr)
1060 throw NullReferenceException(u
"Can not unbox null value");
1062 return static_cast<Result
>(value);
1071template <
typename Result,
typename Source>
1072std::enable_if_t<Details::CastType<Source, Result>::EnumBoxing, SmartPtr<BoxedValueBase>>
1085template <
typename Result,
typename Source>
1089 return MakeObject<Source>(value).template Cast<typename Result::Pointee_, std::true_type>();
1098template <
typename Result,
typename Source>
1102 return MakeObject<Source>(value).template Cast<Result, std::true_type>();
1111template <
typename Result,
typename Source>
1124template <
typename Result,
typename Source>
1128 return ObjectExt::Box<String>(value);
1137template <
typename Result,
typename Source>
1138std::enable_if_t<Details::CastType<Source, Result>::InterfaceUnboxing, Result>
ExplicitCast(
const Source& value)
1140 return *(value.template Cast<Result, std::true_type>());
1149template <
typename Result,
typename Source>
1150std::enable_if_t<Details::CastType<Source, Result>::Unboxing, Result>
ExplicitCast(
const Source& value)
1152 return ObjectExt::Unbox<Result>(value);
1161template <
typename Result,
typename Source>
1174template <
typename Result,
typename Source>
1180 auto result = MakeArray<typename Result::ValueType>(value->data().size());
1181 std::transform(value->data().begin(), value->data().end(), result->data().begin(),
1182 [](
const auto& value) {return ExplicitCast<typename Result::ValueType>(value);});
1193template <
typename Result,
typename Source>
1194std::enable_if_t<Details::CastType<Source, Result>::Static, Result>
AsCast(
const Source& value)
1196 return Result(value);
1205template <
typename Result,
typename Source>
1206std::enable_if_t<Details::CastType<Source, Result>::None, Result>
AsCast(
const Source& value)
1217template <
typename Result,
typename Source>
1218std::enable_if_t<Details::CastType<Source, Result>::Exception, Result>
AsCast(
const Source& value)
1220 return value.Get().template Cast<typename Result::ExceptionType, std::false_type>() ? Result(value.Get())
1230template <
typename Result,
typename Source>
1231std::enable_if_t<Details::CastType<Source, Result>::ObjectToException, Result>
AsCast(
const Source& value)
1233 auto exception_ptr = value.template Cast<typename Result::ExceptionType, std::false_type>();
1234 return exception_ptr ? Result(exception_ptr.template Cast<System::Details_Exception, std::false_type>())
1244template <
typename Result,
typename Source>
1248 return value.template Cast<Result, std::false_type>();
1257template <
typename Result,
typename Source>
1258std::enable_if_t<Details::CastType<Source, Result>::PointerToPointer, Result>
1261 return AsCast<typename Result::Pointee_>(value);
1270template <
typename Result,
typename Source>
1271std::enable_if_t<Details::CastType<Source, Result>::UnboxingToNullable, Result>
1274 return ObjectExt::UnboxToNullable<typename Result::ValueType>(value,
true);
1283template <
typename Result,
typename Source>
1284std::enable_if_t<Details::CastType<Source, Result>::InterfaceUnboxingToNullable, Result>
AsCast(
const Source& value)
1287 if (ObjectExt::Is<typename Result::ValueType>(value))
1289 result = *(value.template Cast<typename Result::ValueType, std::false_type>());
1299template <
typename Result,
typename Source>
1300std::enable_if_t<Details::CastType<Source, Result>::InvalidUnboxing, Result>
AsCast(
const Source& value)
1302 return Default<Result>();
1311template <
typename Result,
typename Source>
1312std::enable_if_t<Details::CastType<Source, Result>::NullableBoxing, Result>
AsCast(
const Source& value)
1314 return Result(value);
1323template <
typename Result,
typename Source>
1327 if (!ObjectExt::Is<Result>(value))
1332 return MakeObject<Source>(value).template Cast<Result, std::false_type>();
1341template <
typename Result,
typename Source>
1345 return ObjectExt::Box(value).template Cast<typename Result::Pointee_, std::false_type>();
1354template <
typename Result,
typename Source>
1355std::enable_if_t<Details::CastType<Source, Result>::UnboxingToString, Result>
AsCast(
const Source& value)
1366template <
typename Result,
typename Source>
1378template <
typename Result,
typename Source>
1384 auto result = MakeArray<typename Result::ValueType>(value->data().size());
1385 auto d_it = result->data().begin();
1386 auto s_it = value->data().begin();
1387 while (s_it != value->data().end())
1389 auto& source_element = *(s_it++);
1390 auto& result_element = *(d_it++);
1392 result_element = AsCast<typename Result::ValueType>(source_element);
1395 if (source_element !=
nullptr && result_element ==
nullptr)
1408template <
typename T0,
typename T1>
1412 using retval_t = System::Details::ResultOf<T1, T0>;
1415 using result_t =
typename std::conditional<
1416 std::is_base_of<Details::BoxableObjectBase, retval_t>::value || std::is_arithmetic<retval_t>::value || std::is_enum<retval_t>::value,
1420 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:180
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:750
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:739
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 auto CoalesceAssign(T0 &value, T1 func) -> T0 &
Implementation of '??=' operator translation.
Definition: object_ext.h:725
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:758
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:764
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:1409
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:1194
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:935
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