1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
3 // SPDX-License-Identifier: LGPL-3.0+
5 #ifndef __ZETH_SERIALIZATION_STREAM_UTILS_TCC__
6 #define __ZETH_SERIALIZATION_STREAM_UTILS_TCC__
8 #include "libzeth/core/group_element_utils.hpp"
9 #include "libzeth/serialization/stream_utils.hpp"
15 typename std::enable_if<std::is_fundamental<T>::value, T>::type read_bytes(
19 read_bytes(val, in_s);
24 typename std::enable_if<std::is_fundamental<T>::value, void>::type read_bytes(
25 T &val, std::istream &in_s)
27 in_s.read((char *)(&val), sizeof(T));
31 typename std::enable_if<std::is_fundamental<T>::value, void>::type write_bytes(
32 const T &val, std::ostream &out_s)
34 out_s.write((const char *)(&val), sizeof(T));
37 /// Write the first n from a collection of values, using a specified writer
42 void(WriterFn)(const MemberT<CollectionT> &, std::ostream &)>
43 void collection_n_write_bytes(
44 const CollectionT &collection, const size_t n, std::ostream &out_s)
46 for (size_t i = 0; i < n; ++i) {
47 WriterFn(collection[i], out_s);
51 /// Read n element using a specified reader function, appending to the given
55 void(ReaderFn)(MemberT<CollectionT> &, std::istream &)>
56 void collection_n_read_bytes(
57 CollectionT &collection, const size_t n, std::istream &in_s)
59 for (size_t i = 0; i < n; ++i) {
60 collection.emplace_back();
61 ReaderFn(collection.back(), in_s);
65 /// Write a full collection of values to a stream as bytes, using
66 /// a specific writer function.
69 void(WriterT)(const MemberT<CollectionT> &, std::ostream &)>
70 void collection_write_bytes(const CollectionT &collection, std::ostream &out_s)
72 write_bytes(collection.size(), out_s);
73 collection_n_write_bytes<CollectionT, WriterT>(
74 collection, collection.size(), out_s);
77 /// Read a collection of values, from a stream of bytes, using
78 /// a specific reader function.
82 void(ReaderT)(MemberT<CollectionT> &, std::istream &)>
83 void collection_read_bytes(CollectionT &collection, std::istream &in_s)
85 const size_t n = read_bytes<size_t>(in_s);
88 collection.reserve(n);
89 collection_n_read_bytes<CollectionT, ReaderT>(collection, n, in_s);
92 template<typename T, void(ReaderFn)(T &, std::istream &)>
93 void sparse_vector_read_bytes(
94 libsnark::sparse_vector<T> &sparse_vector, std::istream &in_s)
96 sparse_vector.domain_size_ = read_bytes<size_t>(in_s);
97 const size_t num_entries = read_bytes<size_t>(in_s);
98 sparse_vector.indices.clear();
99 sparse_vector.indices.reserve(num_entries);
100 sparse_vector.values.clear();
101 sparse_vector.values.reserve(num_entries);
103 for (size_t i = 0; i < num_entries; ++i) {
104 sparse_vector.indices.push_back(read_bytes<size_t>(in_s));
105 sparse_vector.values.emplace_back();
106 ReaderFn(sparse_vector.values.back(), in_s);
110 template<typename T, void(WriterFn)(const T &, std::ostream &)>
111 void sparse_vector_write_bytes(
112 const libsnark::sparse_vector<T> &sparse_vector, std::ostream &out_s)
114 const size_t num_entries = sparse_vector.indices.size();
115 assert(num_entries == sparse_vector.values.size());
117 write_bytes(sparse_vector.domain_size_, out_s);
118 write_bytes(num_entries, out_s);
119 for (size_t i = 0; i < num_entries; ++i) {
120 write_bytes(sparse_vector.indices[i], out_s);
121 WriterFn(sparse_vector.values[i], out_s);
125 template<typename T, void(ReaderFn)(T &, std::istream &)>
126 void accumulation_vector_read_bytes(
127 libsnark::accumulation_vector<T> &acc_vector, std::istream &in_s)
129 ReaderFn(acc_vector.first, in_s);
130 sparse_vector_read_bytes<T, ReaderFn>(acc_vector.rest, in_s);
133 template<typename T, void(WriterFn)(const T &, std::ostream &)>
134 void accumulation_vector_write_bytes(
135 const libsnark::accumulation_vector<T> &acc_vector, std::ostream &out_s)
137 WriterFn(acc_vector.first, out_s);
138 sparse_vector_write_bytes<T, WriterFn>(acc_vector.rest, out_s);
141 template<typename kcT>
142 void knowledge_commitment_read_bytes(
143 kcT &knowledge_commitment, std::istream &in_s)
145 group_element_read_bytes(knowledge_commitment.g, in_s);
146 group_element_read_bytes(knowledge_commitment.h, in_s);
149 template<typename kcT>
150 void knowledge_commitment_write_bytes(
151 const kcT &knowledge_commitment, std::ostream &out_s)
153 group_element_write_bytes(knowledge_commitment.g, out_s);
154 group_element_write_bytes(knowledge_commitment.h, out_s);
157 template<typename kcvectorT>
158 void knowledge_commitment_vector_read_bytes(
159 kcvectorT &knowledge_commitment_vector, std::istream &in_s)
161 using kcT = typename std::decay<decltype(
162 knowledge_commitment_vector.values[0])>::type;
163 sparse_vector_read_bytes<kcT, knowledge_commitment_read_bytes<kcT>>(
164 knowledge_commitment_vector, in_s);
167 template<typename kcvectorT>
168 void knowledge_commitment_vector_write_bytes(
169 const kcvectorT &knowledge_commitment_vector, std::ostream &out_s)
171 using kcT = typename std::decay<decltype(
172 knowledge_commitment_vector.values[0])>::type;
173 sparse_vector_write_bytes<kcT, knowledge_commitment_write_bytes<kcT>>(
174 knowledge_commitment_vector, out_s);
177 } // namespace libzeth
179 #endif // __ZETH_SERIALIZATION_STREAM_UTILS_TCC__