5 #ifndef __BASE_PROTO_IMPL_H__
6 #define __BASE_PROTO_IMPL_H__
13 #define PROTO_DEBUG(args...) if (detail::debug_) LOG(DEBUG, ##args)
18 void operator()(
const uint8_t *data,
int element_size, U *obj) {
19 int value =
get_value(data, element_size);
26 void operator()(
const uint8_t *data,
int element_size,
void *obj) {
33 void operator()(uint8_t *data,
int element_size, U *obj) {
34 uint64_t value = T::get(obj);
41 void operator()(uint8_t *data,
int element_size, U *obj) {
42 memset(data, 0, element_size);
46 template <
typename Accessor,
typename T>
48 template <
typename Iterator>
49 int Copy(Iterator begin, Iterator end, uint8_t *data) {
51 for (Iterator iter = begin; iter != end; ++iter) {
53 data +=
sizeof(*iter);
54 count+=
sizeof(*iter);
58 int operator()(uint8_t *data,
int element_size, T *obj) {
59 int count =
Copy(Accessor::begin(obj), Accessor::end(obj), data);
65 int operator()(uint8_t *data,
int element_size, T *obj) {
70 template <
typename P,
typename C>
74 context->
Push(child_obj);
100 template<
typename T,
typename ChildContextType>
102 template <
typename C>
104 ChildContextType *child_obj =
105 dynamic_cast<ChildContextType *
>(context_obj);
107 T::insert(obj, child_obj);
111 template <
typename ChildContextType>
118 template <
typename Parent,
typename T,
typename ChildContextType>
122 storer(obj, context->
Pop());
126 template<
typename Parent,
typename T>
133 template<
typename Parent>
140 template <
typename Child,
typename T,
typename opt_ctx_t>
144 return pushfn(context, obj);
148 template <
typename Child,
typename T>
157 template <
typename Child>
159 typedef typename Child::ContextType
ctx_t;
160 template <
typename U>
162 typedef typename Child::ContextSwap swap_t;
163 ctx_t *nobj = swap_t()(obj);
174 template <
class Parent,
typename Child>
176 template <
typename T>
185 typedef typename Child::ContextType opt_ctx_t;
187 typedef typename boost::mpl::if_<
188 boost::is_same<opt_ctx_t, void>,
189 T, opt_ctx_t>
::type ctx_t;
191 typedef typename boost::mpl::if_<
192 boost::is_same<typename Child::ContextSwap, void>,
196 ctx_t *child_obj = context_op_t()(context, obj);
198 int result = Child::Parse(data, size, context, child_obj);
199 if (result < 0)
return result;
200 typedef typename boost::mpl::if_<
201 boost::is_same<typename Child::ContextSwap, void>,
204 typedef typename boost::mpl::if_<
205 boost::is_same<push_ctx_t, void>,
213 template <
typename T,
typename Context>
216 size_t msgsize, Context *obj) {
218 int value = t(obj, data, size);
220 if ((
size_t) value > msgsize) {
222 << value <<
" > " << msgsize);
230 template <
typename Context>
233 size_t msgsize, Context *obj) {
236 if ((
size_t) value > msgsize) {
238 << value <<
" > " << msgsize);
246 template <
typename Context>
249 size_t msgsize, Context *obj) {
257 uint8_t *data,
int arg) {
264 uint8_t *data,
int arg) {
268 template<
typename Accessor,
typename T>
272 int element_size = context->
size();
274 if (element_size < 0) element_size = size;
275 else if (size < (
size_t) element_size) {
277 << size <<
" < " << element_size);
292 template<
typename SizeSetter,
typename T>
296 return SizeSetter::get(obj);
300 template<
typename Derived,
typename T>
304 typedef typename Derived::Setter setter_t;
306 setter(data, Derived::kSize, obj);
307 return Derived::kSize;
311 template<
typename Derived,
typename T>
315 return Derived::kSize;
319 template <
typename Derived>
322 return size >= Derived::kSize;
332 template <
typename Setter,
typename T>
334 static int get(
const T *msg) {
335 return Setter::size(msg);
338 template <
typename T>
340 static int get(
const T *msg) {
344 template <
typename Derived>
346 static int get(
const void *msg) {
347 return Derived::kSize;
351 template <
typename T>
363 template <
typename ContextAccessor>
372 template <
typename Accessor>
375 template <
typename Obj>
387 template <
typename Obj>
394 typename Accessor::CollectionType::const_iterator
iter;
401 bool HasNext(
void *obj)
const {
return false; }
404 template <
typename T>
void operator()(ParseContext *context, T *obj)
#define PROTO_DEBUG(args...)
int operator()(const uint8_t *data, size_t size, ParseContext *context, T *obj)
void * operator()(ParseContext *context, void *obj)
T * operator()(ParseContext *context, T *obj)
T * operator()(ParseContext *context, T *obj)
int operator()(uint8_t *data, int element_size, T *obj)
bool HasNext(void *obj) const
void operator()(EncodeContext *ctx)
void operator()(EncodeContext::CallbackType cb, EncodeContext *context, uint8_t *data, int arg)
void operator()(const uint8_t *data, int element_size, U *obj)
void set_lensize(int lensize)
void SwapData(ParseObject *obj)
bool HasNext(Obj *obj) const
int operator()(const uint8_t *data, size_t size, ParseContext *context, T *obj)
bool operator()(int size)
void operator()(uint8_t *data, int element_size, U *obj)
int operator()(const uint8_t *data, size_t size, ParseContext *context, T *obj)
void operator()(C *obj, ParseObject *context_obj)
void SaveOffset(std::string)
static uint64_t get_value(const uint8_t *data, int size)
int operator()(ParseContext *context, const uint8_t *data, size_t size, size_t msgsize, Context *obj)
void operator()(EncodeContext *context, uint8_t *data, int arg)
ContextIterator(void *obj)
static int Parse(const uint8_t *data, size_t size, ParseContext *context, T *obj)
int operator()(const uint8_t *data, size_t size, ParseContext *context, T *obj)
ContextIterator(const Obj *obj)
ctx_t * operator()(ParseContext *context, U *obj)
void operator()(void *obj, ParseObject *child_obj)
void operator()(EncodeContext *ctx)
bool operator()(int size)
void AddCallback(CallbackType cb, uint8_t *data, int arg)
boost::function< void(EncodeContext *, uint8_t *, int, int)> CallbackType
int Copy(Iterator begin, Iterator end, uint8_t *data)
static void set(C *obj, T value)
int operator()(uint8_t *data, int element_size, T *obj)
void set_size(size_t length)
Accessor::CollectionType::const_iterator iter
void operator()(const uint8_t *data, int element_size, void *obj)
int operator()(const uint8_t *data, size_t size, ParseContext *context, T *obj)
void operator()(uint8_t *data, int element_size, U *obj)
int operator()(ParseContext *context, const uint8_t *data, size_t size, size_t msgsize, Context *obj)
opt_ctx_t * operator()(ParseContext *context, T *obj)
void operator()(EncodeContext *context, uint8_t *data, int arg)
void Push(ParseObject *data)
int operator()(ParseContext *context, const uint8_t *data, size_t size, size_t msgsize, Context *obj)
void operator()(ParseContext *context, void *obj)
C * operator()(ParseContext *context, P *obj)
void operator()(ParseContext *context, void *obj)
void operator()(EncodeContext::CallbackType cb, EncodeContext *context, uint8_t *data, int arg)
ContextAccessor::ValueType ValueType
P * operator()(ParseContext *context, P *obj)
Accessor::ValueType ValueType
static void put_value(uint8_t *data, int size, uint64_t value)