3#include <system/object.h>
4#include <system/object_ext.h>
5#include <system/runtime/compiler_services/ituple.h>
9template<
typename ...Args>
17struct IsTuple {
static constexpr bool value =
false; };
22struct IsTuple<
SharedPtr<Tuple<
T>>> {
static constexpr bool value =
true; };
25static constexpr int32_t MaxTupleIndex = 7;
30template<std::size_t Index = 0,
typename... Args>
31typename std::enable_if<Index == MaxTupleIndex, void>::type
34 if(!IsTuple<
typename std::tuple_element<Index, std::tuple<Args...>>::type>::value)
41template<std::size_t Index = 0,
typename... Args>
42typename std::enable_if<Index != MaxTupleIndex, void>::type
45 static_assert(Index <= MaxTupleIndex,
"The Tuple class can store only 8 items");
49struct ReturnValueHolder
55 typename std::enable_if<!IsSmartPtr<T>::value,
void>::type Hold(T& returnValue)
65 typename std::enable_if<IsSmartPtr<T>::value,
void>::type Hold(T& returnValue)
71 SharedPtr<Object> value;
75template<std::size_t
I = 0,
typename RetHolder,
typename... Tp>
76typename std::enable_if<
I ==
sizeof...(Tp),
void>::type
78 FindItem(
int,
const std::tuple<Tp...>& , RetHolder&)
86template<std::size_t Index = 0,
typename RetHolder,
typename... Args>
87typename std::enable_if< Index <
sizeof...(Args),
void>::type
88 FindItem(
int index,
const std::tuple<Args...>& tuple, RetHolder& holder)
92 holder.Hold(std::get<Index>(tuple));
96 FindItem<Index + 1, RetHolder, Args...>(index - 1, tuple, holder);
128template<
typename ... Args>
133 RTTI_INFO_TEMPLATE_CLASS(
System::Tuple<Args...>, System::BaseTypesInfo<Runtime::CompilerServices::ITuple>);
136 using tuple_t = std::tuple<Args...>;
142 : m_tuple(std::forward<Args>(args)...)
144 Details::CheckRest<std::tuple_size<tuple_t>::value - 1, Args...>();
149 template<
int32_t Index>
150 typename std::tuple_element<Index, tuple_t>::type
get_Item()
const
152 return std::get<Index>(m_tuple);
160 if (obj.
get() ==
this)
166 if (tuple ==
nullptr)
171 return Equals<0, Args...>(m_tuple, tuple->m_tuple);
183 throw IndexOutOfRangeException(u
"Tuple");
186 Details::ReturnValueHolder return_value_holder;
187 Details::FindItem(index, m_tuple, return_value_holder);
189 return return_value_holder.value;
195 return static_cast<int32_t
>(std::tuple_size<tuple_t>{});
200 template<std::size_t Index = 0,
typename... Types>
201 static typename std::enable_if<Index ==
sizeof...(Types),
bool>::type
202 Equals(
const std::tuple<Types...>& a,
const std::tuple<Types...>& b)
210 template<std::size_t Index = 0,
typename... Types>
211 static typename std::enable_if<Index <
sizeof...(Types),
bool>::type
212 Equals(
const std::tuple<Types...>& a,
const std::tuple<Types...>& b)
219 return Equals<Index + 1, Types...>(a, b);
255 template<
typename ... Args>
262 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
typename TRest>
263 static SharedPtr<Tuple<T1, T2, T3, T4, T5, T6, T7, SharedPtr<Tuple<TRest>>>>
Create(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest)
265 return MakeObject<Tuple<T1, T2, T3, T4, T5, T6, T7, SharedPtr<Tuple<TRest>>>>(item1, item2, item3, item4, item5, item6, item7, MakeObject<Tuple<TRest>>(rest));
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< 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
Defines a general-purpose Tuple implementation that allows access to Tuple instance members without k...
Definition: ituple.h:11
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
Pointee_ * get() const
Gets pointed object.
Definition: smart_ptr.h:518
Provides static methods for creating tuple objects.
Definition: tuple.h:252
static SharedPtr< Tuple< Args... > > Create(Args... args)
Creates a new tuple object.
Definition: tuple.h:256
static SharedPtr< Tuple< T1, T2, T3, T4, T5, T6, T7, SharedPtr< Tuple< TRest > > > > Create(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest)
Creates a new 8-tuple. The 8th element is stored inside Tuple.
Definition: tuple.h:263
Class that represents a tuple data structure. Maximum number of items is 8.
Definition: tuple.h:130
bool Equals(SharedPtr< Object > obj) override
Determines if the current and the specified objects are identical.
Definition: tuple.h:158
int32_t get_Length() const override
Returns the number of positions in this data structure.
Definition: tuple.h:193
std::tuple_element< Index, tuple_t >::type get_Item() const
Gets the value of the Tuple object's component.
Definition: tuple.h:150
Tuple(Args... args)
Constructs a tuple object.
Definition: tuple.h:141
SharedPtr< Object > idx_get(int index) const override
Returns the element at position index.
Definition: tuple.h:179
Definition: db_command.h:9
std::enable_if<!IsSmartPtr< T >::value, SmartPtr< T > >::type MakeObject(Args &&... args)
Creates object on heap and returns shared pointer to it.
Definition: smart_ptr.h:1506
SmartPtr< T > SharedPtr
Alias for smart pointer widely used in the library.
Definition: smart_ptr.h:1779
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