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

Commit ee257d5

Browse files
committed
Pack, unpack algorithms work for fixed size container of multiprecision numbers. #3
1 parent 549e668 commit ee257d5

File tree

4 files changed

+38
-42
lines changed

4 files changed

+38
-42
lines changed

include/nil/crypto3/marshalling/types/integral.hpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ namespace nil {
101101
multiprecision::expression_template_option ExpressionTemplates,
102102
typename... TOptions>
103103
class integral<TTypeBase, multiprecision::number<Backend, ExpressionTemplates>, TOptions...>
104-
: private ::nil::marshalling::types::detail::adapt_basic_field_type<
104+
: public ::nil::marshalling::types::detail::adapt_basic_field_type<
105105
crypto3::marshalling::types::detail::basic_integral<TTypeBase, Backend, ExpressionTemplates>,
106106
TOptions...> {
107107

@@ -153,11 +153,11 @@ namespace nil {
153153
return base_impl_type::value();
154154
}
155155

156-
/// @brief Get length required to serialise the current field value.
157-
/// @return Number of bytes it will take to serialise the field value.
158-
std::size_t length() {
159-
return base_impl_type::length();
160-
}
156+
// /// @brief Get length required to serialise the current field value.
157+
// /// @return Number of bytes it will take to serialise the field value.
158+
// std::size_t length() {
159+
// return base_impl_type::length();
160+
// }
161161

162162
/// @brief Get length required to serialise the current field value.
163163
/// @return Number of bytes it will take to serialise the field value.

test/integral.cpp

+6-8
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ void test_round_trip_fixed_precision_big_endian(T val) {
9696
using integral_type = types::integral<nil::marshalling::field_type<nil::marshalling::option::big_endian>, T>;
9797
std::size_t unitblob_size =
9898
integral_type::bit_length() / units_bits + ((integral_type::bit_length() % units_bits) ? 1 : 0);
99-
integral_type test_val;
10099

101100
std::vector<unit_type> cv;
102101
cv.resize(unitblob_size, 0x00);
@@ -106,9 +105,9 @@ void test_round_trip_fixed_precision_big_endian(T val) {
106105
export_bits(val, cv.begin() + begin_index, units_bits, true);
107106

108107
nil::marshalling::status_type status;
109-
T test_val1 = nil::marshalling::pack<nil::marshalling::option::big_endian, T>(cv, status);
108+
T test_val = nil::marshalling::pack<nil::marshalling::option::big_endian, T>(cv, status);
110109

111-
BOOST_CHECK(val == test_val1);
110+
BOOST_CHECK(val == test_val);
112111
BOOST_CHECK(status == nil::marshalling::status_type::success);
113112

114113
std::vector<unit_type> test_cv = nil::marshalling::unpack<nil::marshalling::option::big_endian, unit_type>(val, status);
@@ -125,17 +124,16 @@ void test_round_trip_fixed_precision_little_endian(T val) {
125124
using integral_type = types::integral<nil::marshalling::field_type<nil::marshalling::option::little_endian>, T>;
126125
std::size_t unitblob_size =
127126
integral_type::bit_length() / units_bits + ((integral_type::bit_length() % units_bits) ? 1 : 0);
128-
integral_type test_val;
129127

130128
std::vector<unit_type> cv;
131129

132130
export_bits(val, std::back_inserter(cv), units_bits, false);
133131
cv.resize(unitblob_size, 0x00);
134132

135133
nil::marshalling::status_type status;
136-
T test_val1 = nil::marshalling::pack<nil::marshalling::option::little_endian, T>(cv, status);
134+
T test_val = nil::marshalling::pack<nil::marshalling::option::little_endian, T>(cv, status);
137135

138-
BOOST_CHECK(val == test_val1);
136+
BOOST_CHECK(val == test_val);
139137
BOOST_CHECK(status == nil::marshalling::status_type::success);
140138

141139
std::vector<unit_type> test_cv = nil::marshalling::unpack<nil::marshalling::option::little_endian, unit_type>(val, status);
@@ -170,9 +168,9 @@ void test_round_trip_non_fixed_precision(T val) {
170168
std::is_same<TEndianness, nil::marshalling::option::big_endian>::value?true:false);
171169

172170
nil::marshalling::status_type status;
173-
T test_val1 = nil::marshalling::pack<TEndianness, T>(cv, status);
171+
T test_val = nil::marshalling::pack<TEndianness, T>(cv, status);
174172

175-
BOOST_CHECK(val == test_val1);
173+
BOOST_CHECK(val == test_val);
176174
BOOST_CHECK(status == nil::marshalling::status_type::success);
177175

178176
std::vector<unit_type> test_cv = nil::marshalling::unpack<TEndianness, unit_type>(val, status);

test/integral_fixed_size_container.cpp

+24-28
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
#include <nil/crypto3/multiprecision/cpp_int.hpp>
4242
#include <nil/crypto3/multiprecision/number.hpp>
4343

44+
#include <nil/marshalling/algorithms/pack.hpp>
45+
#include <nil/marshalling/algorithms/unpack.hpp>
4446
#include <nil/crypto3/marshalling/types/integral.hpp>
4547

4648
template<class T>
@@ -89,7 +91,7 @@ void print_byteblob(TIter iter_begin, TIter iter_end) {
8991

9092
template<class T, std::size_t TSize>
9193
void test_round_trip_fixed_size_container_fixed_precision_big_endian(
92-
nil::marshalling::container::static_vector<T, TSize> val_container) {
94+
std::array<T, TSize> val_container) {
9395
using namespace nil::crypto3::marshalling;
9496
std::size_t units_bits = 8;
9597
using unit_type = unsigned char;
@@ -115,27 +117,24 @@ void test_round_trip_fixed_size_container_fixed_precision_big_endian(
115117
export_bits(val_container[i], cv.begin() + unitblob_size * i + begin_index, units_bits, true);
116118
}
117119

118-
auto read_iter = cv.begin();
119-
nil::marshalling::status_type status = test_val_container.read(read_iter, cv.size());
120-
BOOST_CHECK(status == nil::marshalling::status_type::success);
120+
nil::marshalling::status_type status;
121+
std::array<T, TSize> test_val =
122+
nil::marshalling::pack<nil::marshalling::option::big_endian,
123+
std::array<T, TSize>>(cv, status);
121124

122-
for (std::size_t i = 0; i < val_container.size(); i++) {
123-
BOOST_CHECK(val_container[i] == test_val_container.value()[i].value());
124-
}
125+
BOOST_CHECK(std::equal(val_container.begin(), val_container.end(), test_val.begin()));
126+
BOOST_CHECK(status == nil::marshalling::status_type::success);
125127

126-
std::vector<unit_type> test_val_byteblob;
127-
test_val_byteblob.resize(cv.size());
128-
auto write_iter = test_val_byteblob.begin();
128+
std::vector<unit_type> test_cv =
129+
nil::marshalling::unpack<nil::marshalling::option::big_endian, unit_type>(val_container, status);
129130

130-
status = test_val_container.write(write_iter, test_val_byteblob.size() * units_bits);
131+
BOOST_CHECK(std::equal(test_cv.begin(), test_cv.end(), cv.begin()));
131132
BOOST_CHECK(status == nil::marshalling::status_type::success);
132-
133-
BOOST_CHECK(cv == test_val_byteblob);
134133
}
135134

136135
template<class T, std::size_t TSize>
137136
void test_round_trip_fixed_size_container_fixed_precision_little_endian(
138-
nil::marshalling::container::static_vector<T, TSize> val_container) {
137+
std::array<T, TSize> val_container) {
139138
using namespace nil::crypto3::marshalling;
140139
std::size_t units_bits = 8;
141140
using unit_type = unsigned char;
@@ -158,32 +157,29 @@ void test_round_trip_fixed_size_container_fixed_precision_little_endian(
158157
export_bits(val_container[i], cv.begin() + unitblob_size * i, units_bits, false);
159158
}
160159

161-
auto read_iter = cv.begin();
162-
nil::marshalling::status_type status = test_val_container.read(read_iter, cv.size());
163-
BOOST_CHECK(status == nil::marshalling::status_type::success);
160+
nil::marshalling::status_type status;
161+
std::array<T, TSize> test_val =
162+
nil::marshalling::pack<nil::marshalling::option::little_endian,
163+
std::array<T, TSize>>(cv, status);
164164

165-
for (std::size_t i = 0; i < val_container.size(); i++) {
166-
BOOST_CHECK(val_container[i] == test_val_container.value()[i].value());
167-
}
165+
BOOST_CHECK(std::equal(val_container.begin(), val_container.end(), test_val.begin()));
166+
BOOST_CHECK(status == nil::marshalling::status_type::success);
168167

169-
std::vector<unit_type> test_val_byteblob;
170-
test_val_byteblob.resize(cv.size());
171-
auto write_iter = test_val_byteblob.begin();
168+
std::vector<unit_type> test_cv =
169+
nil::marshalling::unpack<nil::marshalling::option::little_endian, unit_type>(val_container, status);
172170

173-
status = test_val_container.write(write_iter, test_val_byteblob.size() * units_bits);
171+
BOOST_CHECK(std::equal(test_cv.begin(), test_cv.end(), cv.begin()));
174172
BOOST_CHECK(status == nil::marshalling::status_type::success);
175-
176-
BOOST_CHECK(cv == test_val_byteblob);
177173
}
178174

179175
template<class T, std::size_t TSize>
180176
void test_round_trip_fixed_size_container_fixed_precision() {
181177
std::cout << std::hex;
182178
std::cerr << std::hex;
183179
for (unsigned i = 0; i < 1000; ++i) {
184-
nil::marshalling::container::static_vector<T, TSize> val_container;
180+
std::array<T, TSize> val_container;
185181
for (std::size_t i = 0; i < TSize; i++) {
186-
val_container.push_back(generate_random<T>());
182+
val_container[i] = generate_random<T>();
187183
}
188184
test_round_trip_fixed_size_container_fixed_precision_big_endian<T, TSize>(val_container);
189185
test_round_trip_fixed_size_container_fixed_precision_little_endian<T, TSize>(val_container);

test/integral_non_fixed_size_container.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
#include <nil/crypto3/multiprecision/cpp_int.hpp>
4343
#include <nil/crypto3/multiprecision/number.hpp>
4444

45+
#include <nil/marshalling/algorithms/pack.hpp>
46+
#include <nil/marshalling/algorithms/unpack.hpp>
4547
#include <nil/crypto3/marshalling/types/integral.hpp>
4648

4749
template<class T>

0 commit comments

Comments
 (0)