26#error CODEC_VERSION must be set
29#ifndef CODEC_VERSION_NAMESPACE
30#error CODEC_VERSION_NAMESPACE must be set
33#ifndef DCCL_DEFAULT_FIELD_CODEC_HEADER_H
34#define DCCL_DEFAULT_FIELD_CODEC_HEADER_H
48 "Must use specialization of DefaultFieldCodecLoader");
53 static_assert(
sizeof(
TimeCodecLoader) == 0,
"Must use specialization of TimeCodecLoader");
58 static_assert(
sizeof(
StaticCodecLoader) == 0,
"Must use specialization of StaticCodecLoader");
64 "Must use specialization of PresenceCodecLoader");
70 "Must use specialization of VarBytesCodecLoader");
75 static_assert(
sizeof(
HashCodecLoader) == 0,
"Must use specialization of HashCodecLoader");
80 static_assert(
sizeof(
CRCCodecLoader) == 0,
"Must use specialization of CRCCodecLoader");
97 using namespace CODEC_VERSION_NAMESPACE;
98 using google::protobuf::FieldDescriptor;
100 std::string name = ::dccl::Codec::default_codec_name(CODEC_VERSION);
101 manager.
add<DefaultBoolCodec>(name);
102 manager.
add<DefaultStringCodec, FieldDescriptor::TYPE_STRING>(name);
103 manager.
add<DefaultBytesCodec, FieldDescriptor::TYPE_BYTES>(name);
104 manager.
add<DefaultEnumCodec>(name);
105 manager.
add<DefaultMessageCodec, FieldDescriptor::TYPE_MESSAGE>(name);
107 add<true, double, float, int32, int64, uint32, uint64>(manager);
111 template <
bool enable,
typename T,
typename... Types>
114 using namespace CODEC_VERSION_NAMESPACE;
115 std::string name = ::dccl::Codec::default_codec_name(CODEC_VERSION);
116 manager.
add<DefaultNumericFieldCodec<T>>(name);
118 add<enable, Types...>(manager);
129 const std::string& name =
"dccl.time" + std::to_string(CODEC_VERSION))
131 add<true, double, int64, uint64>(manager, name);
134 template <
bool enable,
typename T,
typename... Types>
137 using namespace CODEC_VERSION_NAMESPACE;
138 manager.
add<TimeCodec<T>>(name);
139 add<enable, Types...>(manager, name);
149 const std::string& name =
"dccl.static" + std::to_string(CODEC_VERSION))
151 add<true, std::string, double, float, int32, int64, uint32, uint64>(manager, name);
154 template <
bool enable,
typename T,
typename... Types>
157 using namespace CODEC_VERSION_NAMESPACE;
158 manager.
add<StaticCodec<T>>(name);
159 add<enable, Types...>(manager, name);
167#if CODEC_VERSION >= 3
172 using namespace CODEC_VERSION_NAMESPACE;
173 using google::protobuf::FieldDescriptor;
175 manager.
add<PresenceBitCodec<DefaultBoolCodec>>(name_);
176 manager.
add<PresenceBitCodec<DefaultStringCodec>, FieldDescriptor::TYPE_STRING>(name_);
177 manager.
add<PresenceBitCodec<DefaultBytesCodec>, FieldDescriptor::TYPE_BYTES>(name_);
178 manager.
add<PresenceBitCodec<DefaultEnumCodec>>(name_);
181 manager.
add<DefaultMessageCodec, FieldDescriptor::TYPE_MESSAGE>(name_);
182 add<true, double, float, int32, int64, uint32, uint64>(manager);
185 template <
bool enable,
typename T,
typename... Types>
188 using namespace CODEC_VERSION_NAMESPACE;
189 std::string name = ::dccl::Codec::default_codec_name(CODEC_VERSION);
190 manager.
add<PresenceBitCodec<DefaultNumericFieldCodec<T>>>(name_);
191 add<enable, Types...>(manager);
194 template <
bool enable>
static void add(FieldCodecManagerLocal& manager) {}
197 static const std::string name_;
200const std::string PresenceCodecLoader<CODEC_VERSION>::name_{
"dccl.presence" +
201 std::to_string(CODEC_VERSION)};
203template <>
struct VarBytesCodecLoader<CODEC_VERSION>
205 static void add(FieldCodecManagerLocal& manager)
207 using namespace CODEC_VERSION_NAMESPACE;
208 manager.add<VarBytesCodec>(
"dccl.var_bytes" + std::to_string(CODEC_VERSION));
214#if CODEC_VERSION >= 4
215template <>
struct HashCodecLoader<CODEC_VERSION>
217 static void add(FieldCodecManagerLocal& manager, std::set<int> versions = {CODEC_VERSION})
219 using namespace CODEC_VERSION_NAMESPACE;
221 for (
int v : versions) manager.add<HashCodec>(
"dccl.hash" + std::to_string(v));
225template <>
struct CRCCodecLoader<CODEC_VERSION>
227 static void add(FieldCodecManagerLocal& manager, std::set<int> versions = {CODEC_VERSION})
229 using namespace CODEC_VERSION_NAMESPACE;
231 for (
int v : versions)
233 manager.add<CRC16Codec>(
"dccl.crc16" + std::to_string(v));
234 manager.add<CRC32Codec>(
"dccl.crc32" + std::to_string(v));
240 manager.add<CRC16Codec>(
"dccl.crc16");
241 manager.add<CRC32Codec>(
"dccl.crc32");
251#undef CODEC_VERSION_NAMESPACE
A class for managing the various field codecs. Here you can add and remove field codecs....
std::enable_if< std::is_base_of< google::protobuf::Message, typenameCodec::wire_type >::value &&!std::is_same< google::protobuf::Message, typenameCodec::wire_type >::value, void >::type add(const std::string &name)
Add a new field codec (used for codecs operating on statically generated Protobuf messages,...
Dynamic Compact Control Language namespace.