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

Commit 1181f6a

Browse files
authored
Merge pull request #26 from NilFoundation/18-arbitrary-byte-container-io
Bug fixes unpack
2 parents 70a0273 + ca0e964 commit 1181f6a

File tree

3 files changed

+53
-72
lines changed

3 files changed

+53
-72
lines changed

include/nil/detail/unpack_value.hpp

+15-16
Original file line numberDiff line numberDiff line change
@@ -94,29 +94,26 @@ namespace nil {
9494
}
9595
};
9696

97-
template<typename TEndian, typename Iter>
97+
template<typename TEndian, typename Input>
9898
struct range_unpack_impl {
9999
marshalling::status_type *status;
100-
mutable Iter iterator;
100+
mutable typename std::conditional<nil::detail::is_iterator<Input>::value, Input, typename Input::const_iterator>::type iterator;
101101
size_t count_elements;
102-
using value_type = typename std::iterator_traits<Iter>::value_type;
102+
using value_type = typename Input::value_type;
103103

104-
template<typename SinglePassRange>
105-
range_unpack_impl(const SinglePassRange &range, marshalling::status_type &status) {
104+
range_unpack_impl(const Input &range, marshalling::status_type &status) {
106105
iterator = range.begin();
107106
count_elements = std::distance(range.begin(), range.end());
108107
this->status = &status;
109108
}
110109

111-
template<typename InputIterator>
112-
range_unpack_impl(InputIterator first, InputIterator last, marshalling::status_type &status) {
110+
range_unpack_impl(Input first, Input last, marshalling::status_type &status) {
113111
iterator = first;
114112
count_elements = std::distance(first, last);
115113
this->status = &status;
116114
}
117115

118-
template<typename SinglePassIterator>
119-
range_unpack_impl(const SinglePassIterator &iter, size_t len, marshalling::status_type &status) {
116+
range_unpack_impl(const Input &iter, size_t len, marshalling::status_type &status) {
120117
iterator = iter;
121118
count_elements = len;
122119
this->status = &status;
@@ -129,10 +126,11 @@ namespace nil {
129126
|| std::is_same<typename OutputRange::value_type, std::uint8_t>::value)>::type>
130127
inline operator OutputRange() {
131128
using Toutput = typename OutputRange::value_type;
132-
using marshalling_type = typename marshalling::is_compatible<std::vector<value_type>>::template type<TEndian>;
133-
using marshalling_internal_type = typename marshalling_type::element_type;
134129

135-
std::vector<marshalling_internal_type> values;
130+
using marshalling_type = typename marshalling::is_compatible<Input>::template type<TEndian>;
131+
using marshalling_internal_type = typename marshalling_type::element_type;
132+
using marshalling_vector = typename std::conditional<marshalling::is_compatible<Input>::fixed_size, nil::marshalling::container::static_vector<marshalling_internal_type, marshalling_type::max_length()>, std::vector<marshalling_internal_type>>::type;
133+
marshalling_vector values;
136134

137135
auto k = iterator;
138136
for (int i = 0; i < count_elements; ++i, ++k) {
@@ -149,14 +147,15 @@ namespace nil {
149147

150148
template<typename Array,
151149
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
150+
typename = typename std::enable_if<
151+
(std::is_same<typename Array::value_type, bool>::value
153152
|| std::is_same<typename Array::value_type, std::uint8_t>::value)>::type>
154153
inline operator Array() {
155-
using marshalling_type = typename marshalling::is_compatible<Array>::template type<TEndian>;
154+
using marshalling_type = typename marshalling::is_compatible<Input>::template type<TEndian>;
156155
using marshalling_internal_type = typename marshalling_type::element_type;
157156

158-
nil::marshalling::container::static_vector<marshalling_internal_type, marshalling_type::max_length()>
159-
values;
157+
using marshalling_vector = typename std::conditional<marshalling::is_compatible<Input>::fixed_size, nil::marshalling::container::static_vector<marshalling_internal_type, marshalling_type::max_length()>, std::vector<marshalling_internal_type>>::type;
158+
marshalling_vector values;
160159
auto k = iterator;
161160
for (int i = 0; i < count_elements; ++i, ++k) {
162161
values.emplace_back(*k);

include/nil/marshalling/algorithms/unpack.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ namespace nil {
136136
*/
137137
template<typename TEndian, typename SinglePassRange>
138138
typename std::enable_if<nil::detail::is_range<SinglePassRange>::value,
139-
nil::detail::range_unpack_impl<TEndian, typename SinglePassRange::const_iterator>>::type
139+
nil::detail::range_unpack_impl<TEndian, SinglePassRange>>::type
140140
unpack(const SinglePassRange &r, status_type &status) {
141141

142-
return nil::detail::range_unpack_impl<TEndian, typename SinglePassRange::const_iterator>(r, status);
142+
return nil::detail::range_unpack_impl<TEndian, SinglePassRange>(r, status);
143143
}
144144

145145
template<typename TEndian, typename InputIterator>

include/nil/marshalling/inference.hpp

+36-54
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
#ifndef MARSHALLING_INFERENCE_TYPE_TRAITS_HPP
2727
#define MARSHALLING_INFERENCE_TYPE_TRAITS_HPP
2828

29-
#include <type_traits>
30-
3129
#include <boost/type_traits.hpp>
3230
#include <boost/type_traits/is_same.hpp>
3331

@@ -38,88 +36,72 @@
3836

3937
namespace nil {
4038
namespace marshalling {
41-
template<typename T, typename Enabled = void>
42-
struct is_compatible {
43-
static const bool value = false;
44-
};
4539

4640
template<typename T, typename Enabled = void>
47-
struct is_fixed_size {
48-
static const bool value = false;
49-
};
50-
51-
template<typename T>
52-
struct is_fixed_size<
53-
T, typename std::enable_if<std::is_integral<T>::value || std::is_floating_point<T>::value>::type> {
54-
static const bool value = true;
55-
};
56-
57-
template<typename T>
58-
struct is_fixed_size<std::vector<T>,
59-
typename std::enable_if<is_compatible<T>::value && is_fixed_size<T>::value>::type> {
60-
static const bool value = false;
61-
};
62-
63-
template<typename T, std::size_t TSize>
64-
struct is_fixed_size<std::array<T, TSize>,
65-
typename std::enable_if<is_compatible<T>::value && is_fixed_size<T>::value>::type> {
66-
static const bool value = true;
67-
};
41+
class is_compatible;
6842

6943
template<typename T>
70-
struct is_compatible<T, typename std::enable_if<std::is_integral<T>::value>::type> {
44+
class is_compatible <T, typename std::enable_if<std::is_integral<T>::value>::type> {
7145
using default_endianness = option::big_endian;
72-
73-
template<typename TEndian = default_endianness>
46+
public:
47+
template <typename TEndian = default_endianness>
7448
using type = typename types::integral<field_type<TEndian>, T>;
7549
static const bool value = true;
50+
static const bool fixed_size = true;
7651
};
7752

7853
template<typename T>
79-
struct is_compatible<T, typename std::enable_if<std::is_floating_point<T>::value>::type> {
54+
class is_compatible <T, typename std::enable_if<std::is_floating_point<T>::value>::type> {
8055
using default_endianness = option::big_endian;
81-
82-
template<typename TEndian = default_endianness>
56+
public:
57+
template <typename TEndian = default_endianness>
8358
using type = typename types::float_value<field_type<TEndian>, T>;
8459
static const bool value = true;
60+
static const bool fixed_size = true;
8561
};
8662

8763
template<typename T>
88-
struct is_compatible<std::vector<T>,
89-
typename std::enable_if<is_compatible<T>::value && is_fixed_size<T>::value>::type> {
64+
class is_compatible <std::vector<T>, typename std::enable_if<is_compatible<T>::value
65+
&& is_compatible<T>::fixed_size>::type> {
9066
using default_endianness = option::big_endian;
91-
92-
template<typename TEndian = default_endianness>
93-
using type =
94-
typename types::array_list<field_type<TEndian>, typename is_compatible<T>::template type<TEndian>>;
67+
public:
68+
template <typename TEndian = default_endianness>
69+
using type = typename types::array_list<
70+
field_type<TEndian>,
71+
typename is_compatible<T>::template type<TEndian>>;
9572
static const bool value = true;
73+
static const bool fixed_size = false;
9674
};
9775

9876
template<typename T, std::size_t TSize>
99-
struct is_compatible<std::array<T, TSize>,
100-
typename std::enable_if<is_compatible<T>::value && is_fixed_size<T>::value>::type> {
77+
class is_compatible <std::array<T, TSize>, typename std::enable_if<is_compatible<T>::value
78+
&& is_compatible<T>::fixed_size>::type> {
10179
using default_endianness = option::big_endian;
102-
103-
template<typename TEndian = default_endianness>
104-
using type =
105-
typename types::array_list<field_type<TEndian>, typename is_compatible<T>::template type<TEndian>,
106-
option::fixed_size_storage<TSize>>;
80+
public:
81+
template <typename TEndian = default_endianness>
82+
using type = typename types::array_list<
83+
field_type<TEndian>,
84+
typename is_compatible<T>::template type<TEndian>,
85+
option::fixed_size_storage<TSize>>;
10786
static const bool value = true;
87+
static const bool fixed_size = true;
10888
};
10989

11090
template<typename T, std::size_t TSize>
111-
struct is_compatible<boost::array<T, TSize>,
112-
typename std::enable_if<is_compatible<T>::value && is_fixed_size<T>::value>::type> {
91+
class is_compatible <boost::array<T, TSize>, typename std::enable_if<is_compatible<T>::value
92+
&& is_compatible<T>::fixed_size>::type> {
11393
using default_endianness = option::big_endian;
114-
115-
template<typename TEndian = default_endianness>
116-
using type =
117-
typename types::array_list<field_type<TEndian>, typename is_compatible<T>::template type<TEndian>,
118-
option::fixed_size_storage<TSize>>;
94+
public:
95+
template <typename TEndian = default_endianness>
96+
using type = typename types::array_list<
97+
field_type<TEndian>,
98+
typename is_compatible<T>::template type<TEndian>,
99+
option::fixed_size_storage<TSize>>;
119100
static const bool value = true;
101+
static const bool fixed_size = true;
120102
};
121103

122-
} // namespace marshalling
104+
} // namespace marshalling
123105
} // namespace nil
124106

125107
#endif // MARSHALLING_INFERENCE_TYPE_TRAITS_HPP

0 commit comments

Comments
 (0)