#include "uint252.h" template pb_variable_array from_bits(std::vector bits, pb_variable& ZERO) { pb_variable_array acc; BOOST_FOREACH(bool bit, bits) { acc.emplace_back(bit ? ONE : ZERO); } return acc; } std::vector trailing252(std::vector input) { if (input.size() != 256) { throw std::length_error("trailing252 input invalid length"); } return std::vector(input.begin() + 4, input.end()); } template std::vector to_bool_vector(T input) { std::vector input_v(input.begin(), input.end()); return convertBytesVectorToVector(input_v); } std::vector uint256_to_bool_vector(uint256 input) { return to_bool_vector(input); } std::vector uint252_to_bool_vector(uint252 input) { return trailing252(to_bool_vector(input)); } std::vector uint64_to_bool_vector(uint64_t input) { auto num_bv = convertIntToVectorLE(input); return convertBytesVectorToVector(num_bv); } void insert_uint256(std::vector& into, uint256 from) { std::vector blob = uint256_to_bool_vector(from); into.insert(into.end(), blob.begin(), blob.end()); } void insert_uint64(std::vector& into, uint64_t from) { std::vector num = uint64_to_bool_vector(from); into.insert(into.end(), num.begin(), num.end()); } template T swap_endianness_u64(T v) { if (v.size() != 64) { throw std::length_error("invalid bit length for 64-bit unsigned integer"); } for (size_t i = 0; i < 4; i++) { for (size_t j = 0; j < 8; j++) { std::swap(v[i*8 + j], v[((7-i)*8)+j]); } } return v; } template linear_combination packed_addition(pb_variable_array input) { auto input_swapped = swap_endianness_u64(input); return pb_packing_sum(pb_variable_array( input_swapped.rbegin(), input_swapped.rend() )); }