29template<
class Inner,
typename T>
45#define LENGTH_PREFIXED_PROTO_HELPER(Inner, T) \
46 struct LengthPrefixedProtoHelper< Inner, T > \
48 static T read(const Store & store, typename Inner::ReadConn conn); \
49 [[nodiscard]] static WireFormatGenerator write(const Store & store, typename Inner::WriteConn conn, const T & str); \
51 template<typename U> using S = typename Inner::template Serialise<U>; \
54template<
class Inner,
typename T>
55LENGTH_PREFIXED_PROTO_HELPER(Inner, std::vector<T>);
57template<
class Inner,
typename T>
58LENGTH_PREFIXED_PROTO_HELPER(Inner, std::set<T>);
60template<
class Inner,
typename... Ts>
61LENGTH_PREFIXED_PROTO_HELPER(Inner, std::tuple<Ts...>);
63template<
class Inner,
typename K,
typename V>
64#define DONT_SUBSTITUTE_KV_TYPE std::map<K, V>
65LENGTH_PREFIXED_PROTO_HELPER(Inner, DONT_SUBSTITUTE_KV_TYPE);
66#undef DONT_SUBSTITUTE_KV_TYPE
68template<
class Inner,
typename T>
71 const Store & store,
typename Inner::ReadConn conn)
73 std::vector<T> resSet;
74 auto size = readNum<size_t>(conn.from);
76 resSet.push_back(S<T>::read(store, conn));
81template<
class Inner,
typename T>
83LengthPrefixedProtoHelper<Inner, std::vector<T>>::write(
84 const Store & store,
typename Inner::WriteConn conn,
const std::vector<T> & resSet)
86 co_yield resSet.size();
87 for (
auto & key : resSet) {
88 co_yield S<T>::write(store, conn, key);
92template<
class Inner,
typename T>
95 const Store & store,
typename Inner::ReadConn conn)
98 auto size = readNum<size_t>(conn.from);
100 resSet.insert(S<T>::read(store, conn));
105template<
class Inner,
typename T>
108 const Store & store,
typename Inner::WriteConn conn,
const std::set<T> & resSet)
110 co_yield resSet.size();
111 for (
auto & key : resSet) {
112 co_yield S<T>::write(store, conn, key);
116template<
class Inner,
typename K,
typename V>
119 const Store & store,
typename Inner::ReadConn conn)
121 std::map<K, V> resMap;
122 auto size = readNum<size_t>(conn.from);
124 auto k = S<K>::read(store, conn);
125 auto v = S<V>::read(store, conn);
126 resMap.insert_or_assign(std::move(k), std::move(v));
131template<
class Inner,
typename K,
typename V>
134 const Store & store,
typename Inner::WriteConn conn,
const std::map<K, V> & resMap)
136 co_yield resMap.size();
137 for (
auto & i : resMap) {
138 co_yield S<K>::write(store, conn, i.first);
139 co_yield S<V>::write(store, conn, i.second);
143template<
class Inner,
typename... Ts>
146 const Store & store,
typename Inner::ReadConn conn)
148 return std::tuple<Ts...> {
149 S<Ts>::read(store, conn)...,
153template<
class Inner,
typename... Ts>
156 const Store & store,
typename Inner::WriteConn conn,
const std::tuple<Ts...> & res)
158 auto fullArgs = std::apply(
159 [&](
auto &... rest) {
160 return std::tuple<
const Store &,
typename Inner::WriteConn &,
const Ts &...>(
161 std::cref(store), conn, rest...
167 []<
typename... Us>(
auto & store,
auto conn,
const Us &... args) -> WireFormatGenerator {
168 (
co_yield S<Us>::write(store, conn, args), ...);
Definition store-api.hh:195
Definition length-prefixed-protocol-helper.hh:30