DCCL v4
field_codec_data.h
1 #ifndef DCCLFIELDCODECDATAH
2 #define DCCLFIELDCODECDATAH
3 
4 #include "../dynamic_conditions.h"
5 
6 #include "field_codec_message_stack.h"
7 
8 #include <typeindex>
9 
10 namespace google
11 {
12 namespace protobuf
13 {
14 class Message;
15 class Descriptor;
16 } // namespace protobuf
17 } // namespace google
18 
19 namespace dccl
20 {
21 namespace internal
22 {
23 // Data shared amongst all the FieldCodecs for a single message
24 struct CodecData
25 {
26  MessagePart part_{dccl::UNKNOWN};
27  bool strict_{false};
28  const google::protobuf::Message* root_message_{nullptr};
29  const google::protobuf::Descriptor* root_descriptor_{nullptr};
30  MessageStackData message_data_;
31  DynamicConditions dynamic_conditions_;
32 
33  template <typename FieldCodecType>
34  void set_codec_specific_data(std::shared_ptr<dccl::any> data)
35  {
36  codec_specific_[std::type_index(typeid(FieldCodecType))] = data;
37  }
38 
39  template <typename FieldCodecType> std::shared_ptr<dccl::any> codec_specific_data()
40  {
41  return codec_specific_.at(std::type_index(typeid(FieldCodecType)));
42  }
43 
44  template <typename FieldCodecType> bool has_codec_specific_data()
45  {
46  return codec_specific_.count(std::type_index(typeid(FieldCodecType)));
47  }
48 
49  private:
50  std::map<std::type_index, std::shared_ptr<dccl::any>> codec_specific_;
51 };
52 } // namespace internal
53 } // namespace dccl
54 
55 #endif
dccl::DynamicConditions
Definition: dynamic_conditions.h:39
dccl
Dynamic Compact Control Language namespace.
Definition: any.h:49
Message
dccl::internal::MessageStackData
Definition: field_codec_message_stack.h:42
dccl::internal::CodecData
Definition: field_codec_data.h:24