Bitcoin Core  31.0.0
P2P Digital Currency
type-tuple.h
Go to the documentation of this file.
1 // Copyright (c) The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef MP_PROXY_TYPE_TUPLE_H
6 #define MP_PROXY_TYPE_TUPLE_H
7 
8 #include <mp/util.h>
9 
10 namespace mp {
11 // TODO: Should generalize this to work with arbitrary length tuples, not just length 2-tuples.
12 template <typename KeyLocalType, typename ValueLocalType, typename Value, typename Output>
13 void CustomBuildField(TypeList<std::tuple<KeyLocalType, ValueLocalType>>,
15  InvokeContext& invoke_context,
16  Value&& value,
17  Output&& output)
18 {
19  auto pair = output.init();
21  BuildField(TypeList<KeyLocalType>(), invoke_context, Make<StructField, std::tuple_element_t<0, Accessors>>(pair), std::get<0>(value));
22  BuildField(TypeList<ValueLocalType>(), invoke_context, Make<StructField, std::tuple_element_t<1, Accessors>>(pair), std::get<1>(value));
23 }
24 
25 // TODO: Should generalize this to work with arbitrary length tuples, not just length 2-tuples.
26 template <typename KeyLocalType, typename ValueLocalType, typename Input, typename ReadDest>
27 decltype(auto) CustomReadField(TypeList<std::tuple<KeyLocalType, ValueLocalType>>,
28  Priority<1>,
29  InvokeContext& invoke_context,
30  Input&& input,
31  ReadDest&& read_dest)
32 {
33  return read_dest.update([&](auto& value) {
34  const auto& pair = input.get();
36  using Accessors = typename Struct::Accessors;
37  ReadField(TypeList<KeyLocalType>(), invoke_context, Make<StructField, std::tuple_element_t<0, Accessors>>(pair),
38  ReadDestUpdate(std::get<0>(value)));
39  ReadField(TypeList<ValueLocalType>(), invoke_context, Make<StructField, std::tuple_element_t<1, Accessors>>(pair),
40  ReadDestUpdate(std::get<1>(value)));
41  });
42 }
43 } // namespace mp
44 
45 #endif // MP_PROXY_TYPE_TUPLE_H
Function parameter type for prioritizing overloaded function calls that would otherwise be ambiguous...
Definition: util.h:108
Definition: common.h:29
Generic utility functions used by capnp code.
Definition: util.h:32
Destination parameter type that can be passed to ReadField function as an alternative to ReadDestEmpl...
Definition: proxy-types.h:145
Functions to serialize / deserialize common bitcoin types.
Definition: common-types.h:57
Mapping from capnp struct type to struct traits (specializations are generated by proxy-codegen...
Definition: proxy.h:32
void BuildField(TypeList< LocalTypes... >, Context &context, Output &&output, Values &&... values)
Definition: proxy-types.h:250
decltype(auto) CustomReadField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Input &&input, ReadDest &&read_dest) requires Unserializable< LocalType
Overload multiprocess library&#39;s CustomReadField hook to allow any object with an Unserialize method t...
Definition: common-types.h:100
void CustomBuildField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Value &&value, Output &&output) requires Serializable< LocalType
Overload multiprocess library&#39;s CustomBuildField hook to allow any serializable object to be stored i...
decltype(auto) ReadField(TypeList< LocalTypes... >, InvokeContext &invoke_context, Input &&input, Args &&... args)
Definition: proxy-types.h:213
Class< Types..., std::remove_reference_t< Args >... > Make(Args &&... args)
Construct a template class value by deducing template arguments from the types of constructor argumen...
Definition: util.h:46