/** @file ***************************************************************************** Implementation of interfaces for an accumulation vector. See accumulation_vector.hpp . ***************************************************************************** * @author This file is part of libsnark, developed by SCIPR Lab * and contributors (see AUTHORS). * @copyright MIT license (see LICENSE file) *****************************************************************************/ #ifndef ACCUMULATION_VECTOR_TCC_ #define ACCUMULATION_VECTOR_TCC_ namespace libsnark { template bool accumulation_vector::operator==(const accumulation_vector &other) const { return (this->first == other.first && this->rest == other.rest); } template bool accumulation_vector::is_fully_accumulated() const { return rest.empty(); } template size_t accumulation_vector::domain_size() const { return rest.domain_size(); } template size_t accumulation_vector::size() const { return rest.domain_size(); } template size_t accumulation_vector::size_in_bits() const { const size_t first_size_in_bits = T::size_in_bits(); const size_t rest_size_in_bits = rest.size_in_bits(); return first_size_in_bits + rest_size_in_bits; } template template accumulation_vector accumulation_vector::accumulate_chunk(const typename std::vector::const_iterator &it_begin, const typename std::vector::const_iterator &it_end, const size_t offset) const { std::pair > acc_result = rest.template accumulate(it_begin, it_end, offset); T new_first = first + acc_result.first; return accumulation_vector(std::move(new_first), std::move(acc_result.second)); } template std::ostream& operator<<(std::ostream& out, const accumulation_vector &v) { out << v.first << OUTPUT_NEWLINE; out << v.rest << OUTPUT_NEWLINE; return out; } template std::istream& operator>>(std::istream& in, accumulation_vector &v) { in >> v.first; consume_OUTPUT_NEWLINE(in); in >> v.rest; consume_OUTPUT_NEWLINE(in); return in; } } // libsnark #endif // ACCUMULATION_VECTOR_TCC_