mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-11 08:46:16 +02:00
be81764320
This introduces some shared infrastructure for our notion of protocols. We can then define multiple protocols in terms of that notion. We an also express how particular protocols depend on each other. For example, we can define a common protocol and a worker protocol, where the second depends on the first in terms of the data types it can read and write. The "serve" protocol can just use the common one for now, but will eventually need its own machinary just like the worker protocol for version-aware serialisers
41 lines
1.2 KiB
C++
41 lines
1.2 KiB
C++
#pragma once
|
|
/**
|
|
* @file
|
|
*
|
|
* Template implementations (as opposed to mere declarations).
|
|
*
|
|
* This file is an exmample of the "impl.hh" pattern. See the
|
|
* contributing guide.
|
|
*/
|
|
|
|
#include "common-protocol.hh"
|
|
#include "length-prefixed-protocol-helper.hh"
|
|
|
|
namespace nix {
|
|
|
|
/* protocol-agnostic templates */
|
|
|
|
#define COMMON_USE_LENGTH_PREFIX_SERIALISER(TEMPLATE, T) \
|
|
TEMPLATE T CommonProto::Serialise< T >::read(const Store & store, CommonProto::ReadConn conn) \
|
|
{ \
|
|
return LengthPrefixedProtoHelper<CommonProto, T >::read(store, conn); \
|
|
} \
|
|
TEMPLATE void CommonProto::Serialise< T >::write(const Store & store, CommonProto::WriteConn conn, const T & t) \
|
|
{ \
|
|
LengthPrefixedProtoHelper<CommonProto, T >::write(store, conn, t); \
|
|
}
|
|
|
|
COMMON_USE_LENGTH_PREFIX_SERIALISER(template<typename T>, std::vector<T>)
|
|
COMMON_USE_LENGTH_PREFIX_SERIALISER(template<typename T>, std::set<T>)
|
|
COMMON_USE_LENGTH_PREFIX_SERIALISER(template<typename... Ts>, std::tuple<Ts...>)
|
|
|
|
#define COMMA_ ,
|
|
COMMON_USE_LENGTH_PREFIX_SERIALISER(
|
|
template<typename K COMMA_ typename V>,
|
|
std::map<K COMMA_ V>)
|
|
#undef COMMA_
|
|
|
|
|
|
/* protocol-specific templates */
|
|
|
|
}
|