@@ -68,42 +68,22 @@ namespace nil {
68
68
this ->status = &status;
69
69
}
70
70
71
- template <typename SimilarStdArray >
72
- SimilarStdArray similar_std_array_marshalling () {
73
- SimilarStdArray result;
74
- typename SimilarStdArray ::iterator buffer_begin = result.begin ();
71
+ template <typename Array, typename = typename std::enable_if<!std::is_constructible<Array, typename std::vector< typename Array::value_type>::iterator, typename std::vector< typename Array::value_type>::iterator>::value>::type >
72
+ inline operator Array () {
73
+ Array result;
74
+ typename Array ::iterator buffer_begin = result.begin ();
75
75
*status = input.write (buffer_begin, result.size ());
76
76
77
77
return result;
78
78
}
79
79
80
- // TODO: output type from marshalling?
81
- // template<typename T, size_t ArraySize,
82
- // typename = typename std::enable_if<std::is_same<T, bool>::value
83
- // || std::is_same<T, std::uint8_t>::value>::type>
84
- template <typename T, size_t ArraySize>
85
- inline operator std::array<T, ArraySize>() {
86
-
87
- return similar_std_array_marshalling<std::array<T, ArraySize>>();
88
- }
89
-
90
- // TODO: output type from marshalling?
91
- // template<typename T, size_t ArraySize,
92
- // typename = typename std::enable_if<std::is_same<T, bool>::value
93
- // || std::is_same<T, std::uint8_t>::value>::type>
94
- template <typename T, size_t ArraySize>
95
- inline operator boost::array<T, ArraySize>() {
96
-
97
- return similar_std_array_marshalling<boost::array<T, ArraySize>>();
98
- }
99
-
100
80
// TODO: output type from marshalling?
101
81
// template<typename OutputRange, typename = typename std::enable_if<std::is_same<typename
102
82
// OutputRange::value_type, bool>::value
103
83
// || std::is_same<typename
104
84
// OutputRange::value_type,
105
85
// std::uint8_t>::value>::type>
106
- template <typename OutputRange>
86
+ template <typename OutputRange, typename = typename std::enable_if<std::is_constructible<OutputRange, typename std::vector< typename OutputRange::value_type>::iterator, typename std::vector< typename OutputRange::value_type>::iterator>::value>::type >
107
87
inline operator OutputRange () const {
108
88
using T = typename OutputRange::value_type;
109
89
std::vector<T> result (get_length<T>(input));
@@ -144,8 +124,9 @@ namespace nil {
144
124
145
125
template <typename OutputRange,
146
126
typename = typename std::enable_if<
147
- std::is_same<typename OutputRange::value_type, bool >::value
148
- || std::is_same<typename OutputRange::value_type, std::uint8_t >::value>::type>
127
+ std::is_constructible<OutputRange, typename std::vector<typename OutputRange::value_type>::iterator, typename std::vector<typename OutputRange::value_type>::iterator>::value &&
128
+ (std::is_same<typename OutputRange::value_type, bool >::value
129
+ || std::is_same<typename OutputRange::value_type, std::uint8_t >::value)>::type>
149
130
inline operator OutputRange () {
150
131
using Toutput = typename OutputRange::value_type;
151
132
using marshalling_type = typename marshalling::is_compatible<std::vector<value_type>>::template type<TEndian>;
@@ -166,9 +147,12 @@ namespace nil {
166
147
return OutputRange (result.begin (), result.end ());
167
148
}
168
149
169
- template <typename SimilarStdArray, size_t ArraySize>
170
- SimilarStdArray similar_std_array_marshalling () {
171
- using marshalling_type = typename marshalling::is_compatible<std::array<value_type, ArraySize>>::template type<TEndian>;
150
+ template <typename Array,
151
+ typename = typename std::enable_if<!std::is_constructible<Array, typename std::vector<typename Array::value_type>::iterator, typename std::vector<typename Array::value_type>::iterator>::value>::type,
152
+ typename = typename std::enable_if<(std::is_same<typename Array::value_type, bool >::value
153
+ || std::is_same<typename Array::value_type, std::uint8_t >::value)>::type>
154
+ inline operator Array () {
155
+ using marshalling_type = typename marshalling::is_compatible<Array>::template type<TEndian>;
172
156
using marshalling_internal_type = typename marshalling_type::element_type;
173
157
174
158
nil::marshalling::container::static_vector<marshalling_internal_type, marshalling_type::max_length ()>
@@ -178,26 +162,12 @@ namespace nil {
178
162
values.emplace_back (*k);
179
163
}
180
164
marshalling_type m_val = marshalling_type (values);
181
- SimilarStdArray result;
182
- typename SimilarStdArray ::iterator buffer_begin = result.begin ();
165
+ Array result;
166
+ typename Array ::iterator buffer_begin = result.begin ();
183
167
*status = m_val.write (buffer_begin, result.size ());
184
168
185
169
return result;
186
170
}
187
-
188
- template <typename T, size_t ArraySize,
189
- typename = typename std::enable_if<std::is_same<T, bool >::value
190
- || std::is_same<T, std::uint8_t >::value>::type>
191
- inline operator std::array<T, ArraySize>() {
192
- return similar_std_array_marshalling<std::array<T, ArraySize>, ArraySize>();
193
- }
194
-
195
- template <typename T, size_t ArraySize,
196
- typename = typename std::enable_if<std::is_same<T, bool >::value
197
- || std::is_same<T, std::uint8_t >::value>::type>
198
- inline operator boost::array<T, ArraySize>() {
199
- return similar_std_array_marshalling<boost::array<T, ArraySize>, ArraySize>();
200
- }
201
171
};
202
172
203
173
template <typename TEndian, typename Iter, typename OutputIterator>
0 commit comments