7 #include <boost/bind.hpp>
16 StackFrame() : offset(0), lensize(0), size(-1), total_size(-1) {
22 std::unique_ptr<ParseObject>
data;
46 return current->
data.release();
51 frame->
data.reset(data);
69 frame->
data.release();
73 if (!
stack_.empty() && obj) {
75 frame->
data.reset(obj);
86 return current->
data.get();
91 stack_.back()->offset += delta;
114 current->
size = length;
123 return current->
size;
142 const uint8_t *data,
int data_size) {
184 int p_offset = frame->
offset;
209 boost::bind(cb, _1, data, top->
offset, element_size));
213 std::pair<std::map<std::string, int>::iterator,
bool > result =
214 offsets_.insert(make_pair(key, offset));
215 if (!result.second) {
216 PROTO_DEBUG(
"Offset for " << key <<
" already set");
222 for (boost::ptr_vector<StackFrame>::iterator it =
stack_.begin();
223 it !=
stack_.end(); ++it) {
224 length += it->offset;
226 PROTO_DEBUG(
"Saving Offset for " << key <<
" at " << length);
231 std::map<std::string, int>::iterator it =
offsets_.find(std::string(key));
#define PROTO_DEBUG(args...)
void set_lensize(int lensize)
void SwapData(ParseObject *obj)
int FindOffset(const char *)
size_t total_size() const
void SaveOffset(std::string)
void SetError(int error, int subcode, std::string type, const uint8_t *data, int data_size)
boost::function< void(EncodeContext *)> CallbackFn
ParseErrorContext error_context_
std::vector< StackFrame * > stack_
std::unique_ptr< ParseObject > data
void AddCallback(CallbackType cb, uint8_t *data, int arg)
void SaveOffset(std::string, int)
boost::function< void(EncodeContext *, uint8_t *, int, int)> CallbackType
std::vector< CallbackFn > callbacks
void set_size(size_t length)
boost::ptr_vector< StackFrame > stack_
void Push(ParseObject *data)
std::map< std::string, int > offsets_
std::vector< CallbackFn >::iterator CallbackIterator