CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
object_ext.h
1
2#pragma once
3
4#include "defines.h"
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>
11
12namespace System { namespace Collections { class IList; } }
13
14namespace System
15{
16
20class ObjectExt : public ObjectType
21{
22public:
27 template <typename T>
28 static int GetHashCode(const T& obj)
29 {
30 return System::GetHashCode<T>(obj);
31 }
32
33 template<typename T, typename T2>
34 static typename std::enable_if<IsExceptionWrapper<T>::value, bool>::type Equals(const T& obj, const T2& another)
35 {
36 if (obj.IsNull())
37 System::Detail::SmartPtrCounter::ThrowNullReferenceException();
38 return obj.Equals(another);
39 }
40
48 template<typename T, typename T2>
49 static typename std::enable_if<IsSmartPtr<T>::value, bool>::type Equals(const T& obj, const T2& another)
50 {
51 return obj->Equals(another);
52 }
53
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)
63 {
64 return obj.Equals(another);
65 }
66
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)
76 {
77 return (obj == another);
78 }
79
86 template<size_t N>
87 static bool Equals(const char_t (&obj)[N], String another)
88 {
89 return another == obj;
90 }
91
92
96 static inline String ToString(const char_t * obj)
97 {
98 return String(obj);
99 }
100
105 template<typename T>
106 static inline String ToString(const Nullable<T> & obj)
107 {
108 return (obj.IsNull() ? u"" : ToString(obj.get_Value()));
109 }
110
115 template<typename T>
116 static typename std::enable_if<std::is_enum<T>::value, String>::type ToString(const T& obj)
117 {
118 String str = Enum<T>::GetName(obj);
119 return !str.IsNullOrEmpty() ? str : System::Convert::ToString(static_cast<typename std::underlying_type<T>::type>(obj));
120 }
121
126 template<typename T>
127 static typename std::enable_if<IsSmartPtr<T>::value, String>::type ToString(const T& obj)
128 {
129 return obj->ToString();
130 }
131
136 template<typename T>
137 static typename std::enable_if<IsSmartPtr<T>::value || std::is_pointer<T>::value || IsExceptionWrapper<T>::value, String>::type ToString(T& obj)
138 {
139 return obj->ToString();
140 }
141
146 template<typename T>
147 static typename std::enable_if<!IsSmartPtr<T>::value && std::is_scalar<T>::value && !std::is_enum<T>::value, String>::type ToString(T& obj)
148 {
149 return System::Convert::ToString(obj);
150 }
151
156 template<typename T>
157 static typename std::enable_if<!IsSmartPtr<T>::value && std::is_scalar<T>::value && !std::is_enum<T>::value, String>::type ToString(T&& obj)
158 {
159 return System::Convert::ToString(obj);
160 }
161
166 template<typename T>
167 static typename std::enable_if<!IsExceptionWrapper<T>::value && !IsSmartPtr<T>::value && !std::is_scalar<T>::value && !IsNullable<T>::value, String>::type ToString(T& obj)
168 {
169 return obj.ToString();
170 }
171
176 template <typename T>
177 static typename std::enable_if<!IsSmartPtr<T>::value && !std::is_scalar<T>::value && !IsNullable<T>::value, String>::type ToString(const T& obj)
178 {
179 return obj.ToString();
180 }
181
186 template<typename T>
187 static typename std::enable_if<!IsSmartPtr<T>::value && !std::is_scalar<T>::value && !IsNullable<T>::value && !std::is_reference<T>::value, String>::type ToString(T&& obj)
188 {
189 return obj.ToString();
190 }
191
197 template<typename T>
198 static typename std::enable_if<std::is_enum<T>::value, System::SmartPtr<System::Object>>::type Box(const T& value)
199 {
200 return System::MakeObject<BoxedEnum<T>>(value);
201 }
202
208 template<typename T>
209 static typename std::enable_if<!std::is_enum<T>::value && !IsNullable<T>::value, System::SmartPtr<System::Object>>::type Box(const T& value)
210 {
211 return System::MakeObject<BoxedValue<T>>(value);
212 }
213
218 template<typename T>
219 static typename std::enable_if <IsNullable<T>::value, System::SmartPtr<System::Object>>::type Box(const T& value)
220 {
221 if (value == nullptr)
222 return nullptr;
223
224 return System::MakeObject<BoxedValue<typename T::ValueType>>(value.get_Value());
225 }
226
232 template<typename T>
233 static typename std::enable_if<std::is_enum<T>::value, T>::type Unbox(const SmartPtr<Object>& obj)
234 {
235 using UT = typename std::underlying_type<T>::type;
236
237 if (obj && obj->Is(BoxedEnum<T>::Type()))
238 {
239 auto boxed = obj.template Cast<BoxedEnum<T>>();
240 return static_cast<T>(boxed->unbox());
241 }
242 using UT = typename std::underlying_type<T>::type;
243 if (obj && obj->Is(ObjectExt::GetType<UT>()))
244 {
245 auto boxed = obj.Cast<BoxedValue<UT>>();
246 return static_cast<T>(boxed->unbox());
247 }
248
249
250 throw InvalidCastException();
251 }
252
258 template<class T>
259 static typename std::enable_if<!std::is_enum<T>::value && detail::has_operator_equal<T>::value, T>::type Unbox(const SmartPtr<Object>& obj)
260 {
261 if (obj)
262 {
263 if (obj->Is(ObjectExt::GetType<T>()))
264 {
265 auto boxed = obj.template Cast<BoxedValue<T>>();
266 return boxed->unbox();
267 }
268
269 throw InvalidCastException();
270 }
271 throw NullReferenceException();
272 }
273
279 template<class T>
280 static typename std::enable_if<!std::is_enum<T>::value && !detail::has_operator_equal<T>::value, T>::type Unbox(const SmartPtr<Object>& obj)
281 {
282
283 if (obj && obj->Is(BoxedValue<T>::Type()))
284 {
285 auto boxed = obj.template Cast<BoxedValue<T>>();
286 return boxed->unbox();
287 }
288
289 throw InvalidCastException();
290 }
291
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)
299 {
300 return static_cast<T>(e);
301 }
302
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)
310 {
311 return static_cast<T>(e);
312 }
313
318 static ASPOSECPP_SHARED_API String UnboxStringSafe(const SmartPtr<Object>& obj);
319
325 template<class T>
326 static Nullable<T> UnboxToNullable(const SmartPtr<Object>& obj, bool safe = true)
327 {
328 if (obj)
329 {
330 if (obj->Is(ObjectExt::GetType<T>()))
331 {
332 auto boxed = obj.template Cast<BoxedValue<T>>();
333 return Nullable<T>(boxed->unbox());
334 }
335 }
336
337 if (!obj || safe)
338 return Nullable<T>(nullptr);
339
340 throw InvalidCastException();
341 }
342
349 template<class T, class U>
350 static typename std::enable_if<std::is_convertible<T, Object>::value && std::is_final<T>::value &&
352 bool>::type Is(const U& obj)
353 {
354 if (obj == nullptr)
355 return false;
356
357 return typeid(*obj.get()) == typeid(T);
358 }
359
366 template<class T, class U>
367 static typename std::enable_if<std::is_convertible<T, Object>::value&& !std::is_final<T>::value &&
369 bool>::type Is(const U& obj)
370 {
371 if (!obj)
372 return false;
373
374 return dynamic_cast<T*>(obj.get()) != nullptr;
375 }
376
382 template<class T>
383 static typename std::enable_if<std::is_convertible<T, Object>::value,
384 bool>::type Is(const Object& obj)
385 {
386 return obj.Is(T::Type());
387 }
388
394 template<class T>
395 static typename std::enable_if<!std::is_convertible<T, Object>::value,
396 bool>::type Is(const Object& obj)
397 {
398 return false;
399 }
400
406 template<class T, class U>
407 static typename std::enable_if<IsSmartPtr<T>::value, bool>::type Is(const SmartPtr<U>& obj)
408 {
409 if (!obj)
410 return false;
411
412 return dynamic_cast<typename T::Pointee_*>(obj.get()) != nullptr;
413 }
414
420 template<class T, class U>
421 static typename std::enable_if<IsExceptionWrapper<T>::value, bool>::type Is(const ExceptionWrapper<U>& obj)
422 {
423 if (obj == nullptr)
424 return false;
425
426 return Is<SmartPtr<typename T::ExceptionType>>(obj.Get());
427 }
428
434 template<class T>
435 static typename std::enable_if<IsNullable<T>::value, bool>::type Is(const SmartPtr<Object>& obj)
436 {
437 if (!obj)
438 return false;
439
440 if (obj->Is(System::ObjectExt::GetType<typename T::ValueType>()))
441 return true;
442
443 return false;
444 }
445
451 template<class T>
452 static typename std::enable_if<
454 bool
455 >::type Is(const SmartPtr<Object>& obj)
456 {
457 if (!obj)
458 return false;
459
460 if (obj->Is(System::ObjectExt::GetType<T>()))
461 {
462 return true;
463 }
464
465 if (obj->Is(Nullable<T>::Type()))
466 {
467 auto boxed = obj.Cast<BoxedValue<Nullable<T>>>();
468 return !boxed->unbox().IsNull();
469 }
470
471 return false;
472 }
473
479 template<class T>
480 static typename std::enable_if<
482 bool
483 >::type Is(const SmartPtr<Object>& obj)
484 {
485 if (!obj)
486 return false;
487
488 if (obj->Is(TypeInfo::BoxedValueType<T>()))
489 {
490 return true;
491 }
492
493 return false;
494 }
495
502 template<class T, class U>
503 static typename std::enable_if<std::is_enum<T>::value, bool>::type Is(const SmartPtr<U>& obj)
504 {
505 if (!obj)
506 return false;
507
508 if (obj->Is(TypeInfo::BoxedValueType<T>()))
509 return Enum<T>::IsDefined(Unbox<T>(obj));
510
511 return false;
512 }
513
520 template<class T, class U>
521 static typename std::enable_if<std::is_enum<T>::value, bool>::type Is(const WeakPtr<U>& obj)
522 {
523 if (!obj)
524 return false;
525
526 if (obj->Is(TypeInfo::BoxedValueType<T>()))
527 return Enum<T>::IsDefined(Unbox<T>(obj));
528
529 return false;
530 }
531
532private:
537 template<class T, class U>
538 static bool IsImpl()
539 {
540 TypeInfo typeU = ObjectExt::GetType<U>();
541 TypeInfo typeT = ObjectExt::GetType<T>();
542 return typeU == typeT || typeU.IsSubclassOf(typeT);
543 }
544
545public:
551 template<class T, class U>
552 static bool Is(const Nullable<U>& value)
553 {
554 if (value == nullptr)
555 return false;
556
557 return IsImpl<T, U>();
558 }
559
565 template<class T>
566 static bool Is(const char16_t* str)
567 {
568 if (str == nullptr)
569 return false;
570
571 return IsImpl<T, System::String>();
572 }
573
579 template<class T>
580 static bool Is(int32_t value)
581 {
582 ASPOSE_UNUSED(value);
583
584 return IsImpl<T, System::Int32>();
585 }
586
590 static ASPOSECPP_SHARED_API bool IsBoxedValue(const SmartPtr<Object>& obj);
591
596 template<typename T>
597 static typename std::enable_if<IsSmartPtr<T>::value, System::SmartPtr<Object> >::type UnknownToObject(T obj)
598 {
599 return obj.template Cast<Object>();
600 }
601
606 template<typename T>
607 static typename std::enable_if<!IsSmartPtr<T>::value, System::SmartPtr<Object> >::type UnknownToObject(const T& obj)
608 {
609 return Box<T>(obj);
610 }
611
616 template<typename T>
617 static typename std::enable_if<IsSmartPtr<T>::value, T>::type ObjectToUnknown(SmartPtr<Object> obj)
618 {
619 return obj.template Cast<typename T::Pointee_>();
620 }
621
626 template<typename T>
627 static typename std::enable_if<!IsSmartPtr<T>::value, T>::type ObjectToUnknown(SmartPtr<Object> obj)
628 {
629 return System::ObjectExt::Unbox<T>(obj);
630 }
631
637 template<typename T>
638 static typename std::enable_if<!std::is_scalar<T>::value, bool>::type UnknownIsNull(T obj)
639 {
640 return obj == nullptr;
641 }
642
648 template<typename T>
649 static typename std::enable_if<std::is_scalar<T>::value, bool>::type UnknownIsNull(T obj)
650 {
651 return false;
652 }
653
661 template<typename RT1, typename RT2, typename F>
662 static typename std::conditional<std::is_convertible<RT2, RT1>::value, RT1, RT2>::type CoalesceInternal(RT1 value, F func)
663 {
664 return value != nullptr ? value : func();
665 }
666
667
674 template<typename T0, typename T1>
675 static auto Coalesce(T0 value, T1 func)
676 {
677 using retval_t = System::Details::ResultOf<T1>;
678 return CoalesceInternal<T0, retval_t, typename std::function<retval_t()>>(value, func);
679 }
680
687 template<typename T0, typename T1>
688 static T0 Coalesce(System::Nullable<T0> value, T1 func)
689 {
690 return !value.IsNull() ? value.get_Value() : func();
691 }
692
697 template<typename T>
699 {
701 }
702
708 template<typename To, typename ...From>
709 static typename std::enable_if<(std::is_fundamental<To>::value), std::array<To, sizeof...(From)>>::type ArrayInitializerCast(From ...args)
710 {
711 return std::array<To, sizeof...(From)>({ static_cast<To>(args)... });
712 }
713
715
716 template<typename T>
717 static typename std::enable_if<System::IsBoxable<T>::value, System::SharedPtr<System::Object>>::type ExplicitCastToObject(const T& value)
718 {
719 return ObjectExt::Box(value);
720 }
721
722 template<typename T>
723 static typename std::enable_if<System::IsSmartPtr<T>::value, System::SharedPtr<System::Object>>::type ExplicitCastToObject(const T& value)
724 {
725 return value;
726 }
727};
728
734template<>
735inline bool ObjectExt::Equals<float, float>(const float& obj, const float& another)
736{
737 return (std::isnan(obj) && std::isnan(another)) ? true : obj == another;
738}
739
745template<>
746inline bool ObjectExt::Equals<double, double>(const double& obj, const double& another)
747{
748 return (std::isnan(obj) && std::isnan(another)) ? true : obj == another;
749}
750
754template<>
755inline SmartPtr<Object> ObjectExt::Box<String>(const String& value)
756{
757 return value.IsNull() ? nullptr : MakeObject<BoxedValue<String>>(value);
758}
759
763template<>
764inline String ObjectExt::Unbox<String>(const SmartPtr<Object>& obj)
765{
766 if (obj == nullptr)
767 return String();
768
769 if (obj && obj->Is(String::Type()))
770 {
771 auto boxed = obj.Cast<BoxedValue<String>>();
772 return boxed->unbox();
773 }
774
775 throw InvalidCastException();
776}
777
778namespace Details {
779
781template<typename T>
782struct IsObjectArray : std::false_type {};
783template <typename O>
784struct IsObjectArray<System::Array<SmartPtr<O>>> : std::is_base_of<System::Object, O> {};
785template <>
786struct IsObjectArray<System::Array<String>> : std::true_type {};
787template <typename A>
788struct IsObjectArray<SmartPtr<A>> : IsObjectArray<A> {};
789
790
794template <typename Source, typename Result>
795struct CastType
796{
798 static constexpr bool None = std::is_same<Source, Result>::value;
799
801 static constexpr bool StaticArithmetic =
802 (std::is_enum<Source>::value || std::is_arithmetic<Source>::value) &&
803 (std::is_enum<Result>::value || std::is_arithmetic<Result>::value);
805 static constexpr bool StaticIntPtr =
806 (std::is_same<Source, IntPtr>::value && (std::is_arithmetic<Result>::value || std::is_pointer<Result>::value)) ||
807 (std::is_same<Result, IntPtr>::value && (std::is_arithmetic<Source>::value || std::is_pointer<Source>::value));
809 static constexpr bool StaticString = std::is_same<Result, String>::value && std::is_constructible<String, Source>::value;
811 static constexpr bool Static = !None && (StaticArithmetic || StaticIntPtr || StaticString);
812
814 static constexpr bool Exception = !None &&
815 IsExceptionWrapper<Source>::value && IsExceptionWrapper<Result>::value &&
816 (std::is_convertible<Result, Source>::value || std::is_base_of<Result, Source>::value);
818 static constexpr bool ObjectToException = !None &&
819 std::is_same<SharedPtr<System::Object>, Source>::value && IsExceptionWrapper<Result>::value;
820
822 static constexpr bool Array = !None && IsObjectArray<Result>::value && IsObjectArray<Source>::value;
823
825 static constexpr bool ToSmartPointer = std::is_base_of<System::Object, Result>::value &&
826 !IsExceptionWrapper<Result>::value && !IsBoxable<Result>::value;
828 static constexpr bool RawPointer = ToSmartPointer && std::is_pointer<Source>::value &&
829 std::is_base_of<Object, std::remove_pointer_t<Source>>::value;
831 static constexpr bool Pointer = !None && !Array && ToSmartPointer && IsSmartPtr<Source>::value;
833 static constexpr bool PointerToPointer = !None && !Array && IsSmartPtr<Source>::value && IsSmartPtr<Result>::value;
834
836 static constexpr bool UnboxingToNullable =
837 (std::is_same<Source, SmartPtr<Object>>::value || std::is_same<Source, std::nullptr_t>::value) &&
838 IsNullable<Result>::value;
839
841 static constexpr bool NullableBoxing = !UnboxingToNullable && (std::is_same<Result, Nullable<Source>>::value ||
842 (IsNullable<Result>::value && std::is_same<Source, std::nullptr_t>::value));
844 static constexpr bool NullableUnboxing = std::is_same<Source, Nullable<Result>>::value;
845
847 static constexpr bool BoxingCommon = std::is_base_of<Object, Result>::value || IsSmartPtr<Result>::value;
849 static constexpr bool EnumBoxing = BoxingCommon && std::is_enum<Source>::value;
851 static constexpr bool Boxing = BoxingCommon && !EnumBoxing && IsBoxable<Source>::value;
853 static constexpr bool StringBoxing = BoxingCommon && !Boxing && !Pointer && !std::is_same<Source, std::nullptr_t>::value &&
854 std::is_constructible<String, Source>::value;
855
857 static constexpr bool Unboxing = !UnboxingToNullable && IsSmartPtr<Source>::value && IsBoxable<Result>::value;
858
860 static constexpr bool UnboxingToString = std::is_same<Result, String>::value && std::is_same<Source, SmartPtr<Object>>::value;
861
863 static constexpr bool Null = !Static && !UnboxingToNullable && !NullableBoxing &&
864 std::is_same<Source, std::nullptr_t>::value;
865
867 static constexpr bool InvalidUnboxing = Unboxing && !std::is_same<Source, SmartPtr<Object>>::value;
868};
869
870} // namespace Details
871
878template <typename Result, typename Source>
879std::enable_if_t<Details::CastType<Source, Result>::None, Result> ExplicitCast(const Source& value)
880{
881 return value;
882}
883
890template <typename Result, typename Source>
891std::enable_if_t<Details::CastType<Source, Result>::Static, Result> ExplicitCast(const Source& value)
892{
893 return Result(value);
894}
895
903template <typename Result, typename Source>
904std::enable_if_t<Details::CastType<Source, Result>::Exception, Result> ExplicitCast(const Source& value)
905{
906 return value.Get().template Cast<typename Result::ExceptionType, std::true_type>() ? Result(value.Get())
907 : Result(nullptr);
908}
909
917template <typename Result, typename Source>
918std::enable_if_t<Details::CastType<Source, Result>::ObjectToException, Result> ExplicitCast(const Source& value)
919{
920 auto exception_ptr = value.template Cast<typename Result::ExceptionType, std::true_type>();
921 return exception_ptr ? Result(exception_ptr.template Cast<System::Details_Exception, std::true_type>())
922 : Result(nullptr);
923}
924
932template <typename Result, typename Source>
933std::enable_if_t<Details::CastType<Source, Result>::Pointer, typename CastResult<Result>::type>
934 ExplicitCast(const Source& value)
935{
936 return value.template Cast<Result, std::true_type>();
937}
938
946template <typename Result, typename Source>
947std::enable_if_t<Details::CastType<Source, Result>::RawPointer, typename CastResult<std::remove_pointer_t<Result>>::type>
948 ExplicitCast(Source value)
949{
950 return ExplicitCast<Result>(SmartPtr<std::remove_pointer_t<Source>>(value));
951}
952
960template <typename Result, typename Source>
961std::enable_if_t<Details::CastType<Source, Result>::PointerToPointer, Result>
962 ExplicitCast(const Source& value)
963{
964 return ExplicitCast<typename Result::Pointee_>(value);
965}
966
974template <typename Result, typename Source>
975std::enable_if_t<Details::CastType<Source, Result>::UnboxingToNullable, Result>
976 ExplicitCast(const Source& value)
977{
978 return ObjectExt::UnboxToNullable<typename Result::ValueType>(value, false);
979}
980
987template <typename Result, typename Source>
988std::enable_if_t<Details::CastType<Source, Result>::NullableBoxing, Result> ExplicitCast(const Source& value)
989{
990 return Result(value);
991}
992
1000template <typename Result, typename Source>
1001std::enable_if_t<Details::CastType<Source, Result>::NullableUnboxing, Result> ExplicitCast(const Source& value)
1002{
1003 if (value == nullptr)
1004 throw NullReferenceException(u"Can not unbox null value");
1005
1006 return static_cast<Result>(value);
1007}
1008
1015template <typename Result, typename Source>
1016std::enable_if_t<Details::CastType<Source, Result>::EnumBoxing, SmartPtr<BoxedValueBase>>
1017 ExplicitCast(const Source& value)
1018{
1019 return ObjectExt::BoxEnum(value);
1020}
1021
1028template <typename Result, typename Source>
1029std::enable_if_t<Details::CastType<Source, Result>::Boxing, typename CastResult<Result>::type>
1030 ExplicitCast(const Source& value)
1031{
1032 return ObjectExt::Box(value);
1033}
1034
1041template <typename Result, typename Source>
1042std::enable_if_t<Details::CastType<Source, Result>::StringBoxing, typename CastResult<Result>::type>
1043 ExplicitCast(const Source& value)
1044{
1045 return ObjectExt::Box<String>(value);
1046}
1047
1054template <typename Result, typename Source>
1055std::enable_if_t<Details::CastType<Source, Result>::Unboxing, Result> ExplicitCast(const Source& value)
1056{
1057 return ObjectExt::Unbox<Result>(value);
1058}
1059
1066template <typename Result, typename Source>
1067std::enable_if_t<Details::CastType<Source, Result>::Null, typename CastResult<Result>::type> ExplicitCast(const Source& value)
1068{
1069 return typename CastResult<Result>::type(nullptr);
1070}
1071
1079template <typename Result, typename Source>
1080std::enable_if_t<Details::CastType<Source, Result>::Array, typename CastResult<Result>::type> ExplicitCast(const Source& value)
1081{
1082 if (!value)
1083 return nullptr;
1084
1085 auto result = MakeArray<typename Result::ValueType>(value->data().size());
1086 std::transform(value->data().begin(), value->data().end(), result->data().begin(),
1087 [](const auto& value) {return ExplicitCast<typename Result::ValueType>(value);});
1088
1089 return result;
1090}
1091
1098template <typename Result, typename Source>
1099std::enable_if_t<Details::CastType<Source, Result>::Static, Result> AsCast(const Source& value)
1100{
1101 return Result(value);
1102}
1103
1110template <typename Result, typename Source>
1111std::enable_if_t<Details::CastType<Source, Result>::None, Result> AsCast(const Source& value)
1112{
1113 return value;
1114}
1115
1122template <typename Result, typename Source>
1123std::enable_if_t<Details::CastType<Source, Result>::Exception, Result> AsCast(const Source& value)
1124{
1125 return value.Get().template Cast<typename Result::ExceptionType, std::false_type>() ? Result(value.Get())
1126 : Result(nullptr);
1127}
1128
1135template <typename Result, typename Source>
1136std::enable_if_t<Details::CastType<Source, Result>::ObjectToException, Result> AsCast(const Source& value)
1137{
1138 auto exception_ptr = value.template Cast<typename Result::ExceptionType, std::false_type>();
1139 return exception_ptr ? Result(exception_ptr.template Cast<System::Details_Exception, std::false_type>())
1140 : Result(nullptr);
1141}
1142
1149template <typename Result, typename Source>
1150std::enable_if_t<Details::CastType<Source, Result>::Pointer, typename CastResult<Result>::type>
1151 AsCast(const Source& value)
1152{
1153 return value.template Cast<Result, std::false_type>();
1154}
1155
1162template <typename Result, typename Source>
1163std::enable_if_t<Details::CastType<Source, Result>::PointerToPointer, Result>
1164 AsCast(const Source& value)
1165{
1166 return AsCast<typename Result::Pointee_>(value);
1167}
1168
1175template <typename Result, typename Source>
1176std::enable_if_t<Details::CastType<Source, Result>::UnboxingToNullable, Result>
1177 AsCast(const Source& value)
1178{
1179 return ObjectExt::UnboxToNullable<typename Result::ValueType>(value, true);
1180}
1181
1187template <typename Result, typename Source>
1188std::enable_if_t<Details::CastType<Source, Result>::InvalidUnboxing, Result> AsCast(const Source& value)
1189{
1190 return Default<Result>();
1191}
1192
1199template <typename Result, typename Source>
1200std::enable_if_t<Details::CastType<Source, Result>::NullableBoxing, Result> AsCast(const Source& value)
1201{
1202 return Result(value);
1203}
1204
1211template <typename Result, typename Source>
1212std::enable_if_t<Details::CastType<Source, Result>::Boxing, typename CastResult<Result>::type>
1213 AsCast(const Source& value)
1214{
1215 return ObjectExt::Box(value).template Cast<typename Result::Pointee_, std::false_type>();
1216}
1217
1224template <typename Result, typename Source>
1225std::enable_if_t<Details::CastType<Source, Result>::UnboxingToString, Result> AsCast(const Source& value)
1226{
1227 return ObjectExt::UnboxStringSafe(value);
1228}
1229
1236template <typename Result, typename Source>
1237std::enable_if_t<Details::CastType<Source, Result>::Null, typename CastResult<Result>::type> AsCast(const Source& value)
1238{
1239 return typename CastResult<Result>::type(nullptr);
1240}
1241
1248template <typename Result, typename Source>
1249std::enable_if_t<Details::CastType<Source, Result>::Array, typename CastResult<Result>::type> AsCast(const Source& value)
1250{
1251 if (!value)
1252 return nullptr;
1253
1254 auto result = MakeArray<typename Result::ValueType>(value->data().size());
1255 auto d_it = result->data().begin();
1256 auto s_it = value->data().begin();
1257 while (s_it != value->data().end())
1258 {
1259 auto& source_element = *(s_it++);
1260 auto& result_element = *(d_it++);
1261
1262 result_element = AsCast<typename Result::ValueType>(source_element);
1263
1264 // Fail entire cast if any element fails
1265 if (source_element != nullptr && result_element == nullptr)
1266 return nullptr;
1267 }
1268
1269 return result;
1270}
1271
1278template <typename T0, typename T1>
1279static auto SafeInvoke(T0 expr, T1 func)
1280{
1281 // The type which 'func' actually returns
1282 using retval_t = System::Details::ResultOf<T1, T0>;
1283
1284 // The type which function SafeInvoke will return. Non-nullable types will be wrapped by 'Nullable<>' class template.
1285 using result_t = typename std::conditional<
1286 std::is_base_of<Details::BoxableObjectBase, retval_t>::value || std::is_arithmetic<retval_t>::value || std::is_enum<retval_t>::value,
1288 retval_t>::type;
1289
1290 return expr != nullptr ? result_t(func(expr)) : result_t(nullptr);
1291}
1292
1300template <class PatternT, class ExpressionT, class ResultT>
1301bool IsDeclaration(const ExpressionT& left, ResultT& result)
1302{
1303 if (ObjectExt::Is<PatternT>(left))
1304 {
1305 result = ExplicitCast<PatternT>(left);
1306 return true;
1307 }
1308 else
1309 {
1310 return false;
1311 }
1312}
1313
1320template <class ExpressionT, class ConstantT>
1321bool IsConstant(const ExpressionT& left, const ConstantT& constant)
1322{
1323 if (ObjectExt::Is<ConstantT>(left))
1324 {
1325 return Equals(constant, ExplicitCast<ConstantT>(left));
1326 }
1327 else
1328 {
1329 return false;
1330 }
1331}
1332
1333} // namespace System
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:74
T get_Value() const
Returns a copy of the value represented by the current object.
Definition: nullable.h:143
bool IsNull() const
Determines if the current object represents a null-value.
Definition: nullable.h:171
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:580
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:455
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:709
static T0 Coalesce(System::Nullable< T0 > value, T1 func)
Implementation of '??' operator translation for nullable types.
Definition: object_ext.h:688
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:407
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:396
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:698
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:503
static bool Is(const Nullable< U > &value)
Implements 'is' operator translation. Specialization for Nullable type.
Definition: object_ext.h:552
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:352
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:369
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:627
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:675
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:638
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:649
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:521
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:607
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:566
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 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:421
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:483
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:662
static std::enable_if< System::IsBoxable< T >::value, System::SharedPtr< System::Object > >::type ExplicitCastToObject(const T &value)
Definition: object_ext.h:717
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:597
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:435
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:617
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:384
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:723
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:847
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:280
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
bool IsDeclaration(const ExpressionT &left, ResultT &result)
Implements 'is' declaration pattern translation.
Definition: object_ext.h:1301
bool Equals(const TA &a, const TB &b)
Determines the equality of two values applying operator==() to them.
Definition: primitive_types.h:77
static auto SafeInvoke(T0 expr, T1 func)
Implementation of '?.' operator translation.
Definition: object_ext.h:1279
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:1099
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:879
class ASPOSECPP_SHARED_CLASS Array
Definition: smart_ptr.h:22
bool IsConstant(const ExpressionT &left, const ConstantT &constant)
Implements 'is' constant pattern translation.
Definition: object_ext.h:1321
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