30 typedef BufferT Buffer;
31 typedef DOMParser<SimpleJsonReader&> Parser;
33 typedef rapidjson::Value Field;
35 BOND_STATIC_CONSTEXPR uint16_t magic = SIMPLE_JSON_PROTOCOL;
36 BOND_STATIC_CONSTEXPR uint16_t version = 0x0001;
41 _document(boost::make_shared<rapidjson::Document>()),
51 _document(parent._document),
55 BOOST_ASSERT(parent._value);
66 if (!_value || _value == _document.get())
68 const unsigned parseFlags = rapidjson::kParseIterativeFlag | rapidjson::kParseStopWhenDoneFlag;
70 _document->ParseStream<parseFlags>(_streamHolder.Get());
74 BOOST_ASSERT(!_document->HasParseError());
75 _value = _document.get();
79 const Field* FindField(uint16_t
id,
const Metadata& metadata, BondDataType type)
86 return FindField(
id, metadata, type, type == BT_INT32);
89 const Field* FindField(uint16_t
id,
const Metadata& metadata, BondDataType type,
bool is_enum);
95 detail::Read(*GetValue(), var);
100 bool CanReadArray(uint32_t )
const
105 template <
typename T>
106 void ReadContainerBegin(uint32_t&, T&)
111 void ReadContainerEnd()
116 template <
typename T>
120 template <
typename T>
127 return _value == rhs._value;
133 return _streamHolder.Get().GetBuffer();
139 return _streamHolder.Get().GetBuffer();
143 rapidjson::Value::ConstMemberIterator MemberBegin()
const
145 return GetValue()->IsObject() ? GetValue()->MemberBegin() : rapidjson::Value::ConstMemberIterator();
148 rapidjson::Value::ConstMemberIterator MemberEnd()
const
150 return GetValue()->IsObject() ? GetValue()->MemberEnd() : rapidjson::Value::ConstMemberIterator();
153 rapidjson::Value::ConstValueIterator ArrayBegin()
const
155 return GetValue()->IsArray() ? GetValue()->Begin() : rapidjson::Value::ConstValueIterator();
158 rapidjson::Value::ConstValueIterator ArrayEnd()
const
160 return GetValue()->IsArray() ? GetValue()->End() : rapidjson::Value::ConstValueIterator();
163 uint32_t ArraySize()
const
165 return GetValue()->IsArray() ? GetValue()->Size() : 0;
168 const rapidjson::Value* GetValue()
const
170 BOOST_ASSERT(_value);
174 template <
typename Input>
175 friend struct base_input;
177 template <
typename Protocols,
typename A,
typename T,
typename Buffer>
180 template <
typename Protocols,
typename T,
typename Buffer>
183 template <
typename Protocols,
typename X,
typename T,
typename Buffer>
184 friend typename boost::enable_if<is_list_container<X> >::type
187 template <
typename Protocols,
typename X,
typename T,
typename Buffer>
188 friend typename boost::enable_if<is_set_container<X> >::type
191 template <
typename Protocols,
typename X,
typename T,
typename Buffer>
192 friend typename boost::enable_if<is_map_container<X> >::type
195 const rapidjson::Value* _value;
196 boost::shared_ptr<rapidjson::Document> _document;
203 explicit StreamHolder(
const Buffer& input)
209 _stream.emplace(input);
210 BOOST_ASSERT(IsParent());
216 _parent(&parent._streamHolder.GetParent())
218 BOOST_ASSERT(_parent->IsParent());
219 BOOST_ASSERT(!IsParent());
224 StreamHolder(
const StreamHolder& other)
225 : _stream(other.Get()),
228 BOOST_ASSERT(IsParent());
231 StreamHolder& operator=(
const StreamHolder& other)
233 _stream.emplace(other.Get());
235 BOOST_ASSERT(IsParent());
240 StreamHolder(StreamHolder&&) =
default;
241 StreamHolder& operator=(StreamHolder&&) =
default;
243 const detail::RapidJsonInputStream<Buffer>& Get()
const
245 return IsParent() ? _stream.value() : _parent->Get();
248 detail::RapidJsonInputStream<Buffer>& Get()
250 return IsParent() ? _stream.value() : _parent->Get();
254 bool IsParent()
const
256 const bool isParent = _parent ==
nullptr;
257 BOOST_ASSERT(isParent ==
static_cast<bool>(_stream));
261 StreamHolder& GetParent()
263 return IsParent() ? *this : *_parent;
266 boost::optional<detail::RapidJsonInputStream<Buffer>> _stream;
267 StreamHolder* _parent;