Skip to content

Commit

Permalink
Pack, unpack algorithms work for fixed size container of multiprecisi…
Browse files Browse the repository at this point in the history
…on numbers. #3
  • Loading branch information
nkaskov committed Nov 9, 2021
1 parent 549e668 commit ee257d5
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 42 deletions.
12 changes: 6 additions & 6 deletions include/nil/crypto3/marshalling/types/integral.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ namespace nil {
multiprecision::expression_template_option ExpressionTemplates,
typename... TOptions>
class integral<TTypeBase, multiprecision::number<Backend, ExpressionTemplates>, TOptions...>
: private ::nil::marshalling::types::detail::adapt_basic_field_type<
: public ::nil::marshalling::types::detail::adapt_basic_field_type<
crypto3::marshalling::types::detail::basic_integral<TTypeBase, Backend, ExpressionTemplates>,
TOptions...> {

Expand Down Expand Up @@ -153,11 +153,11 @@ namespace nil {
return base_impl_type::value();
}

/// @brief Get length required to serialise the current field value.
/// @return Number of bytes it will take to serialise the field value.
std::size_t length() {
return base_impl_type::length();
}
// /// @brief Get length required to serialise the current field value.
// /// @return Number of bytes it will take to serialise the field value.
// std::size_t length() {
// return base_impl_type::length();
// }

/// @brief Get length required to serialise the current field value.
/// @return Number of bytes it will take to serialise the field value.
Expand Down
14 changes: 6 additions & 8 deletions test/integral.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ void test_round_trip_fixed_precision_big_endian(T val) {
using integral_type = types::integral<nil::marshalling::field_type<nil::marshalling::option::big_endian>, T>;
std::size_t unitblob_size =
integral_type::bit_length() / units_bits + ((integral_type::bit_length() % units_bits) ? 1 : 0);
integral_type test_val;

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

nil::marshalling::status_type status;
T test_val1 = nil::marshalling::pack<nil::marshalling::option::big_endian, T>(cv, status);
T test_val = nil::marshalling::pack<nil::marshalling::option::big_endian, T>(cv, status);

BOOST_CHECK(val == test_val1);
BOOST_CHECK(val == test_val);
BOOST_CHECK(status == nil::marshalling::status_type::success);

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

std::vector<unit_type> cv;

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

nil::marshalling::status_type status;
T test_val1 = nil::marshalling::pack<nil::marshalling::option::little_endian, T>(cv, status);
T test_val = nil::marshalling::pack<nil::marshalling::option::little_endian, T>(cv, status);

BOOST_CHECK(val == test_val1);
BOOST_CHECK(val == test_val);
BOOST_CHECK(status == nil::marshalling::status_type::success);

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

nil::marshalling::status_type status;
T test_val1 = nil::marshalling::pack<TEndianness, T>(cv, status);
T test_val = nil::marshalling::pack<TEndianness, T>(cv, status);

BOOST_CHECK(val == test_val1);
BOOST_CHECK(val == test_val);
BOOST_CHECK(status == nil::marshalling::status_type::success);

std::vector<unit_type> test_cv = nil::marshalling::unpack<TEndianness, unit_type>(val, status);
Expand Down
52 changes: 24 additions & 28 deletions test/integral_fixed_size_container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
#include <nil/crypto3/multiprecision/cpp_int.hpp>
#include <nil/crypto3/multiprecision/number.hpp>

#include <nil/marshalling/algorithms/pack.hpp>
#include <nil/marshalling/algorithms/unpack.hpp>
#include <nil/crypto3/marshalling/types/integral.hpp>

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

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

auto read_iter = cv.begin();
nil::marshalling::status_type status = test_val_container.read(read_iter, cv.size());
BOOST_CHECK(status == nil::marshalling::status_type::success);
nil::marshalling::status_type status;
std::array<T, TSize> test_val =
nil::marshalling::pack<nil::marshalling::option::big_endian,
std::array<T, TSize>>(cv, status);

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

std::vector<unit_type> test_val_byteblob;
test_val_byteblob.resize(cv.size());
auto write_iter = test_val_byteblob.begin();
std::vector<unit_type> test_cv =
nil::marshalling::unpack<nil::marshalling::option::big_endian, unit_type>(val_container, status);

status = test_val_container.write(write_iter, test_val_byteblob.size() * units_bits);
BOOST_CHECK(std::equal(test_cv.begin(), test_cv.end(), cv.begin()));
BOOST_CHECK(status == nil::marshalling::status_type::success);

BOOST_CHECK(cv == test_val_byteblob);
}

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

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

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

std::vector<unit_type> test_val_byteblob;
test_val_byteblob.resize(cv.size());
auto write_iter = test_val_byteblob.begin();
std::vector<unit_type> test_cv =
nil::marshalling::unpack<nil::marshalling::option::little_endian, unit_type>(val_container, status);

status = test_val_container.write(write_iter, test_val_byteblob.size() * units_bits);
BOOST_CHECK(std::equal(test_cv.begin(), test_cv.end(), cv.begin()));
BOOST_CHECK(status == nil::marshalling::status_type::success);

BOOST_CHECK(cv == test_val_byteblob);
}

template<class T, std::size_t TSize>
void test_round_trip_fixed_size_container_fixed_precision() {
std::cout << std::hex;
std::cerr << std::hex;
for (unsigned i = 0; i < 1000; ++i) {
nil::marshalling::container::static_vector<T, TSize> val_container;
std::array<T, TSize> val_container;
for (std::size_t i = 0; i < TSize; i++) {
val_container.push_back(generate_random<T>());
val_container[i] = generate_random<T>();
}
test_round_trip_fixed_size_container_fixed_precision_big_endian<T, TSize>(val_container);
test_round_trip_fixed_size_container_fixed_precision_little_endian<T, TSize>(val_container);
Expand Down
2 changes: 2 additions & 0 deletions test/integral_non_fixed_size_container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
#include <nil/crypto3/multiprecision/cpp_int.hpp>
#include <nil/crypto3/multiprecision/number.hpp>

#include <nil/marshalling/algorithms/pack.hpp>
#include <nil/marshalling/algorithms/unpack.hpp>
#include <nil/crypto3/marshalling/types/integral.hpp>

template<class T>
Expand Down

0 comments on commit ee257d5

Please sign in to comment.