Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit 70a0273

Browse files
authored
Merge pull request #25 from NilFoundation/18-arbitrary-byte-container-io
Check if output constructible from 2 iterator
2 parents dcc98fd + accf42e commit 70a0273

File tree

1 file changed

+16
-46
lines changed

1 file changed

+16
-46
lines changed

include/nil/detail/unpack_value.hpp

+16-46
Original file line numberDiff line numberDiff line change
@@ -68,42 +68,22 @@ namespace nil {
6868
this->status = &status;
6969
}
7070

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();
7575
*status = input.write(buffer_begin, result.size());
7676

7777
return result;
7878
}
7979

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-
10080
// TODO: output type from marshalling?
10181
// template<typename OutputRange, typename = typename std::enable_if<std::is_same<typename
10282
// OutputRange::value_type, bool>::value
10383
// || std::is_same<typename
10484
// OutputRange::value_type,
10585
// 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>
10787
inline operator OutputRange() const {
10888
using T = typename OutputRange::value_type;
10989
std::vector<T> result(get_length<T>(input));
@@ -144,8 +124,9 @@ namespace nil {
144124

145125
template<typename OutputRange,
146126
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>
149130
inline operator OutputRange() {
150131
using Toutput = typename OutputRange::value_type;
151132
using marshalling_type = typename marshalling::is_compatible<std::vector<value_type>>::template type<TEndian>;
@@ -166,9 +147,12 @@ namespace nil {
166147
return OutputRange(result.begin(), result.end());
167148
}
168149

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>;
172156
using marshalling_internal_type = typename marshalling_type::element_type;
173157

174158
nil::marshalling::container::static_vector<marshalling_internal_type, marshalling_type::max_length()>
@@ -178,26 +162,12 @@ namespace nil {
178162
values.emplace_back(*k);
179163
}
180164
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();
183167
*status = m_val.write(buffer_begin, result.size());
184168

185169
return result;
186170
}
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-
}
201171
};
202172

203173
template<typename TEndian, typename Iter, typename OutputIterator>

0 commit comments

Comments
 (0)