1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
 
    3 // SPDX-License-Identifier: LGPL-3.0+
 
    5 #ifndef __ZETH_SERIALIZATION_R1CS_VARIABLE_ASSIGNMENT_SERIALIZATION_TCC__
 
    6 #define __ZETH_SERIALIZATION_R1CS_VARIABLE_ASSIGNMENT_SERIALIZATION_TCC__
 
    8 #include "libzeth/core/field_element_utils.hpp"
 
    9 #include "libzeth/serialization/r1cs_variable_assignment_serialization.hpp"
 
   10 #include "libzeth/serialization/stream_utils.hpp"
 
   15 template<typename FieldT>
 
   16 void r1cs_variable_assignment_read_bytes(
 
   17     libsnark::r1cs_variable_assignment<FieldT> &assignment, std::istream &in_s)
 
   19     collection_read_bytes<
 
   20         libsnark::r1cs_variable_assignment<FieldT>,
 
   21         field_element_read_bytes<FieldT>>(assignment, in_s);
 
   24 template<typename FieldT>
 
   25 void r1cs_variable_assignment_read_bytes(
 
   26     libsnark::r1cs_primary_input<FieldT> &primary,
 
   27     libsnark::r1cs_auxiliary_input<FieldT> &auxiliary,
 
   28     const size_t primary_input_size,
 
   31     // Manually read the collection size, compute the primary and auxiliary
 
   32     // sizes and read into the separate arrays.
 
   33     const size_t n = read_bytes<size_t>(in_s);
 
   34     if (n < primary_input_size) {
 
   35         throw std::length_error(
 
   36             "assignment length smaller than primary input size");
 
   40     collection_n_read_bytes<
 
   41         libsnark::r1cs_primary_input<FieldT>,
 
   42         field_element_read_bytes<FieldT>>(primary, primary_input_size, in_s);
 
   45     collection_n_read_bytes<
 
   46         libsnark::r1cs_auxiliary_input<FieldT>,
 
   47         field_element_read_bytes<FieldT>>(
 
   48         auxiliary, n - primary_input_size, in_s);
 
   51 template<typename FieldT>
 
   52 void r1cs_variable_assignment_write_bytes(
 
   53     const libsnark::r1cs_variable_assignment<FieldT> &assignment,
 
   56     collection_write_bytes<
 
   57         libsnark::r1cs_variable_assignment<FieldT>,
 
   58         field_element_write_bytes<FieldT>>(assignment, out_s);
 
   61 template<typename FieldT>
 
   62 void r1cs_variable_assignment_write_bytes(
 
   63     const libsnark::r1cs_primary_input<FieldT> &primary,
 
   64     const libsnark::r1cs_auxiliary_input<FieldT> &auxiliary,
 
   67     // Manually write out the aggregation of primary and auxiliary as a single
 
   69     const size_t total_size = primary.size() + auxiliary.size();
 
   70     write_bytes(total_size, out_s);
 
   71     collection_n_write_bytes<
 
   72         libsnark::r1cs_primary_input<FieldT>,
 
   73         field_element_write_bytes>(primary, primary.size(), out_s);
 
   74     collection_n_write_bytes<
 
   75         libsnark::r1cs_primary_input<FieldT>,
 
   76         field_element_write_bytes>(auxiliary, auxiliary.size(), out_s);
 
   79 } // namespace libzeth
 
   81 #endif // __ZETH_SERIALIZATION_R1CS_VARIABLE_ASSIGNMENT_SERIALIZATION_TCC__