YPC  0.2.0
do_parse_interface.h
1 #pragma once
2 #include "ypc/core_t/analyzer/var/model_var.h"
3 #include "ypc/core_t/analyzer/var/parser_var.h"
4 #include "ypc/stbox/ebyte.h"
5 #include <type_traits>
6 
7 namespace ypc {
8 namespace internal {
9 
10 template <typename, typename T> struct has_set_context {
11  static constexpr bool value = false;
12 };
13 
14 template <typename C, typename Ret, typename... Args>
15 struct has_set_context<C, Ret(Args...)> {
16 private:
17  template <typename T>
18  static constexpr auto check(T *) -> typename std::is_same<
19  decltype(std::declval<T>().set_context(std::declval<Args>()...)),
20  Ret>::type;
21 
22  template <typename> static constexpr std::false_type check(...);
23 
24  typedef decltype(check<C>(0)) type;
25 
26 public:
27  static constexpr bool value = type::value;
28 };
29 
30 template <typename, typename T> struct has_do_parse {
31  static constexpr bool value = false;
32  // static_assert(
33  // std::integral_constant<T, false>::value,
34  //"A parser must contains one of the following public function: "
35  //"\n1. stbox::bytes do_parse(const stbox::bytes & param) "
36  //"\n2. stbox::bytes do_parse(const uint8_t * param, uint32_t len) "
37  //"\n3. template<typename Model> stbox::bytes do_parse(const Model & "
38  //"\tmodel, const stbox::bytes & param)"
39  //"\n4. template<typename Model> stbox::bytes do_parse(const Model & "
40  //"model, const uint8_t * param, uint32_t len)");
41 };
42 
43 template <typename C, typename Ret, typename... Args>
44 struct has_do_parse<C, Ret(Args...)> {
45 private:
46  template <typename T>
47  static constexpr auto check(T *) -> typename std::is_same<
48  decltype(std::declval<T>().do_parse(std::declval<Args>()...)), Ret>::type;
49 
50  template <typename> static constexpr std::false_type check(...);
51 
52  typedef decltype(check<C>(0)) type;
53 
54 public:
55  static constexpr bool value = type::value;
56 };
57 
58 template <typename ModelT> struct get_raw_param_func {
59  typedef stbox::bytes type(const ModelT &, const uint8_t *, uint32_t);
60 };
61 template <> struct get_raw_param_func<void> {
62  typedef stbox::bytes type(const uint8_t *, uint32_t);
63 };
64 template <typename ParserT,
65  bool has_set_context_func =
66  has_set_context<ParserT, void(analyzer_context *)>::value>
68  static void set(ParserT *parser, analyzer_context *context) {
69  parser->set_context(context);
70  }
71 };
72 template <typename ParserT> struct set_analyzer_context_helper<ParserT, false> {
73  static void set(ParserT *parser, analyzer_context *context) {}
74 };
75 
76 template <typename ParserT, typename ModelT,
77  bool hash_model = !std::is_same<ModelT, void>::value,
78  bool use_raw_param = has_do_parse<
79  ParserT, typename get_raw_param_func<ModelT>::type>::value>
81 };
82 
83 template <typename ParserT>
84 class do_parse_interface<ParserT, void, false, true>
85  : virtual public parser_var<ParserT>, virtual public analyzer_context {
87 protected:
88  stbox::bytes do_parse(const uint8_t *input_param, uint32_t len) {
89  set_analyzer_context_helper<ParserT>::set(parser_var_t::m_parser.get(),
90  this);
91  return parser_var_t::m_parser->do_parse(input_param, len);
92  }
93 };
94 
95 template <typename ParserT>
96 class do_parse_interface<ParserT, void, false, false>
97  : virtual public parser_var<ParserT>, virtual public analyzer_context {
99 
100 protected:
101  stbox::bytes do_parse(const uint8_t *input_param, uint32_t len) {
102  set_analyzer_context_helper<ParserT>::set(parser_var_t::m_parser.get(),
103  this);
104  return parser_var_t::m_parser->do_parse(stbox::bytes(input_param, len));
105  }
106 };
107 
108 template <typename ParserT, typename ModelT>
109 class do_parse_interface<ParserT, ModelT, true, true>
110  : virtual public model_var<ModelT>,
111  virtual public parser_var<ParserT>,
112  virtual public analyzer_context {
115 
116 protected:
117  stbox::bytes do_parse(const uint8_t *input_param, uint32_t len) {
118  set_analyzer_context_helper<ParserT>::set(parser_var_t::m_parser.get(),
119  this);
120  return parser_var_t::m_parser->do_parse(model_var_t::m_model, input_param,
121  len);
122  }
123 };
124 
125 template <typename ParserT, typename ModelT>
126 class do_parse_interface<ParserT, ModelT, true, false>
127  : virtual public model_var<ModelT>,
128  virtual public parser_var<ParserT>,
129  virtual public analyzer_context {
132 
133 protected:
134  stbox::bytes do_parse(const uint8_t *input_param, uint32_t len) {
135  set_analyzer_context_helper<ParserT>::set(parser_var_t::m_parser.get(),
136  this);
137  return parser_var_t::m_parser->do_parse(model_var_t::m_model,
138  stbox::bytes(input_param, len));
139  }
140 };
141 } // namespace internal
142 } // namespace ypc
ypc::internal::do_parse_interface
Definition: do_parse_interface.h:80
ypc::internal::model_var
Definition: model_var.h:8
parser
Definition: parser.h:10
ypc::internal::has_do_parse
Definition: do_parse_interface.h:30
ypc::internal::parser_var
Definition: parser_var.h:7
ypc::internal::set_analyzer_context_helper
Definition: do_parse_interface.h:67
ypc::internal::has_set_context
Definition: do_parse_interface.h:10
ypc::analyzer_context
Definition: analyzer_context.h:5
ypc::internal::get_raw_param_func
Definition: do_parse_interface.h:58