CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
tuple.h
1#pragma once
2#include <tuple>
3#include <system/object.h>
4#include <system/object_ext.h>
5#include <system/runtime/compiler_services/ituple.h>
6
7namespace System {
8
9template<typename ...Args>
10class Tuple;
11
12namespace Details {
13
16template <typename T>
17struct IsTuple { static constexpr bool value = false; };
18
21template <typename T>
22struct IsTuple<SharedPtr<Tuple<T>>> { static constexpr bool value = true; };
23
25static constexpr int32_t MaxTupleIndex = 7;
26
30template<std::size_t Index = 0, typename... Args>
31typename std::enable_if<Index == MaxTupleIndex, void>::type
32 CheckRest()
33{
34 if(!IsTuple<typename std::tuple_element<Index, std::tuple<Args...>>::type>::value)
35 {
36 throw ArgumentException(u"The last element of an 8-tuple must be of type Tuple");
37 }
38}
39
41template<std::size_t Index = 0, typename... Args>
42typename std::enable_if<Index != MaxTupleIndex, void>::type
43 CheckRest()
44{
45 static_assert(Index <= MaxTupleIndex, "The Tuple class can store only 8 items");
46}
47
49struct ReturnValueHolder
50{
54 template<typename T>
55 typename std::enable_if<!IsSmartPtr<T>::value, void>::type Hold(T& returnValue)
56 {
57 value = ObjectExt::Box(returnValue);
58 }
59
64 template<typename T>
65 typename std::enable_if<IsSmartPtr<T>::value, void>::type Hold(T& returnValue)
66 {
67 value = returnValue;
68 }
69
71 SharedPtr<Object> value;
72};
73
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&)
80{ }
81
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)
89{
90 if (index == 0)
91 {
92 holder.Hold(std::get<Index>(tuple));
93 }
94 else
95 {
96 FindItem<Index + 1, RetHolder, Args...>(index - 1, tuple, holder);
97 }
98}
99
100} // namespace Details
101
128template<typename ... Args>
130{
131private:
133 RTTI_INFO_TEMPLATE_CLASS(System::Tuple<Args...>, System::BaseTypesInfo<Runtime::CompilerServices::ITuple>);
134
136 using tuple_t = std::tuple<Args...>;
137
138public:
141 Tuple(Args... args)
142 : m_tuple(std::forward<Args>(args)...)
143 {
144 Details::CheckRest<std::tuple_size<tuple_t>::value - 1, Args...>();
145 }
146
149 template<int32_t Index>
150 typename std::tuple_element<Index, tuple_t>::type get_Item() const
151 {
152 return std::get<Index>(m_tuple);
153 }
154
158 bool Equals(SharedPtr<Object> obj) override
159 {
160 if (obj.get() == this)
161 {
162 return true;
163 }
164
165 auto tuple = System::AsCast<Tuple<Args...>>(obj);
166 if (tuple == nullptr)
167 {
168 return false;
169 }
170
171 return Equals<0, Args...>(m_tuple, tuple->m_tuple);
172 }
173
174protected: // System::Runtime::CompilerServices::ITuple
175
179 SharedPtr<Object> idx_get(int index) const override
180 {
181 if (index >= get_Length())
182 {
183 throw IndexOutOfRangeException(u"Tuple");
184 }
185
186 Details::ReturnValueHolder return_value_holder;
187 Details::FindItem(index, m_tuple, return_value_holder);
188
189 return return_value_holder.value;
190 }
191
193 int32_t get_Length() const override
194 {
195 return static_cast<int32_t>(std::tuple_size<tuple_t>{});
196 }
197
198private:
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)
203 {
204 return true;
205 }
206
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)
213 {
214 if (!ObjectExt::Equals(std::get<Index>(a), std::get<Index>(b)))
215 {
216 return false;
217 }
218
219 return Equals<Index + 1, Types...>(a, b);
220 }
221
222private:
224 tuple_t m_tuple;
225};
226
252{
253public:
255 template<typename ... Args>
256 static SharedPtr<Tuple<Args...>> Create(Args... args)
257 {
258 return MakeObject<Tuple<Args...>>(std::forward<Args>(args)...);
259 }
260
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)
264 {
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));
266 }
267};
268
269} // namespace System
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