@@ -36,6 +36,102 @@ inline array::array(typename raw_array::size_type size)
3636{
3737}
3838
39+ template <
40+ template <typename , size_t > typename arr_t ,
41+ typename value_t ,
42+ size_t array_size,
43+ std::enable_if_t <
44+ _utils::is_fixed_array<arr_t <value_t , array_size>> && !std::is_same_v<std::decay_t <arr_t <value_t , array_size>>, array>
45+ && !_utils::has_to_json_in_member<arr_t <value_t , array_size>>::value
46+ && !_utils::has_to_json_in_templ_spec<arr_t <value_t , array_size>>::value,
47+ bool >>
48+ inline array::array (const arr_t <value_t , array_size>& arr)
49+ {
50+ _array_data.reserve (array_size);
51+ for (size_t i = 0 ; i < array_size; i++) {
52+ _array_data.emplace_back (arr.at (i));
53+ }
54+ }
55+
56+ template <
57+ template <typename , size_t > typename arr_t ,
58+ typename value_t ,
59+ size_t array_size,
60+ std::enable_if_t <
61+ _utils::is_fixed_array<arr_t <value_t , array_size>> && !std::is_same_v<std::decay_t <arr_t <value_t , array_size>>, array>
62+ && !_utils::has_to_json_in_member<arr_t <value_t , array_size>>::value
63+ && !_utils::has_to_json_in_templ_spec<arr_t <value_t , array_size>>::value,
64+ bool >>
65+ inline array::array (arr_t <value_t , array_size>&& arr)
66+ {
67+ _array_data.reserve (array_size);
68+ for (size_t i = 0 ; i < array_size; i++) {
69+ _array_data.emplace_back (std::move (arr.at (i)));
70+ }
71+ }
72+
73+ template <
74+ typename collection_t ,
75+ std::enable_if_t <
76+ _utils::is_collection<collection_t > && !std::is_same_v<std::decay_t <collection_t >, array>
77+ && !_utils::has_to_json_in_member<collection_t >::value && !_utils::has_to_json_in_templ_spec<collection_t >::value,
78+ bool >>
79+ inline array::array (const collection_t & coll)
80+ {
81+ if constexpr (_utils::has_size<collection_t >::value) {
82+ _array_data.reserve (coll.size ());
83+ }
84+ for (const auto & val : coll) {
85+ _array_data.emplace_back (val);
86+ }
87+ }
88+
89+ template <
90+ typename collection_t ,
91+ std::enable_if_t <
92+ _utils::is_collection<collection_t > && !std::is_same_v<std::decay_t <collection_t >, array>
93+ && !_utils::has_to_json_in_member<collection_t >::value && !_utils::has_to_json_in_templ_spec<collection_t >::value,
94+ bool >>
95+ inline array::array (collection_t && coll)
96+ {
97+ if constexpr (_utils::has_size<collection_t >::value) {
98+ _array_data.reserve (coll.size ());
99+ }
100+ for (auto & val : coll) {
101+ _array_data.emplace_back (std::move (val));
102+ }
103+ }
104+
105+ template <
106+ template <typename ...> typename tuple_t ,
107+ typename ... args_t ,
108+ std::enable_if_t <
109+ _utils::is_tuple_like<tuple_t <args_t ...>> && !std::is_same_v<std::decay_t <tuple_t <args_t ...>>, array>
110+ && !_utils::has_to_json_in_member<tuple_t <args_t ...>>::value
111+ && !_utils::has_to_json_in_templ_spec<tuple_t <args_t ...>>::value,
112+ bool >>
113+ inline array::array (const tuple_t <args_t ...>& tpl)
114+ {
115+ constexpr size_t tuple_size = std::tuple_size_v<tuple_t <args_t ...>>;
116+ _array_data.reserve (tuple_size);
117+ construct_from_tuple_helper (tpl, std::make_index_sequence<tuple_size>());
118+ }
119+
120+ template <
121+ template <typename ...> typename tuple_t ,
122+ typename ... args_t ,
123+ std::enable_if_t <
124+ _utils::is_tuple_like<tuple_t <args_t ...>> && !std::is_same_v<std::decay_t <tuple_t <args_t ...>>, array>
125+ && !_utils::has_to_json_in_member<tuple_t <args_t ...>>::value
126+ && !_utils::has_to_json_in_templ_spec<tuple_t <args_t ...>>::value,
127+ bool >>
128+ inline array::array (tuple_t <args_t ...>&& tpl)
129+ {
130+ constexpr size_t tuple_size = std::tuple_size_v<tuple_t <args_t ...>>;
131+ _array_data.reserve (tuple_size);
132+ construct_from_tuple_move_helper (std::move (tpl), std::make_index_sequence<tuple_size>());
133+ }
134+
39135inline bool array::empty () const noexcept
40136{
41137 return _array_data.empty ();
@@ -413,7 +509,7 @@ inline T array::as() &&
413509 if (_array_data.size () != tuple_size) {
414510 throw exception (" Array size mismatch for tuple conversion: expected=" + std::to_string (tuple_size) + " , actual=" + std::to_string (_array_data.size ()));
415511 }
416-
512+
417513 T result;
418514 move_as_tuple_helper (result, std::make_index_sequence<tuple_size>());
419515 _array_data.clear ();
@@ -424,6 +520,20 @@ inline T array::as() &&
424520 }
425521}
426522
523+ template <typename tuple_t , size_t ... Is>
524+ inline void array::construct_from_tuple_helper (const tuple_t & tpl, std::index_sequence<Is...>)
525+ {
526+ using std::get;
527+ (_array_data.emplace_back (get<Is>(tpl)), ...);
528+ }
529+
530+ template <typename tuple_t , size_t ... Is>
531+ inline void array::construct_from_tuple_move_helper (tuple_t && tpl, std::index_sequence<Is...>)
532+ {
533+ using std::get;
534+ (_array_data.emplace_back (std::move (get<Is>(tpl))), ...);
535+ }
536+
427537template <typename tuple_t , size_t ... Is>
428538inline void array::as_tuple_helper (tuple_t & result, std::index_sequence<Is...>) const
429539{
0 commit comments