8 #include "../generic/optional.h"
23 namespace _json_impl {
24 typedef std::shared_ptr<std::istream> IStreamPtr;
31 std::string read_value_from_stream()
const;
34 JSONNode(_json_impl::IStreamPtr stream, std::streampos start, std::streampos end, std::size_t size=0):
35 stream_(stream), start_(start), end_(end), size_(size) {}
37 std::streampos start()
const {
41 std::streampos end()
const {
45 JSONNodeType type()
const;
49 std::size_t size()
const;
53 bool has_key(
const std::string& key)
const;
57 std::vector<std::string> keys()
const;
60 bool is_value_type()
const;
62 bool is_bool()
const {
63 return type_ == JSON_FALSE || type_ == JSON_TRUE;
67 return type_ == JSON_STRING;
70 bool is_number()
const {
71 return type_ == JSON_NUMBER;
74 bool is_array()
const {
75 return type_ == JSON_ARRAY;
78 bool is_object()
const {
79 return type_ == JSON_OBJECT;
122 mutable _json_impl::IStreamPtr stream_;
123 std::streampos start_ = 0;
124 std::streampos end_ = 0;
125 std::size_t size_ = 0;
126 JSONNodeType type_ = JSON_OBJECT;
131 template<
typename Func>
132 void read_keys(Func&& cb)
const;
138 friend JSONIterator json_read(std::shared_ptr<std::istream>);
144 JSONIterator(_json_impl::IStreamPtr stream, std::streampos pos,
bool is_array_item=
false):
146 is_array_iterator_(is_array_item) {
148 current_node_ = std::make_shared<JSONNode>();
149 parse_node(*current_node_, stream, pos);
154 mutable _json_impl::IStreamPtr stream_;
155 bool is_array_iterator_ =
false;
157 std::shared_ptr<JSONNode> current_node_;
159 void parse_node(
JSONNode& node, _json_impl::IStreamPtr stream, std::streampos pos);
160 void set_invalid(
const std::string& message);
166 typedef std::input_iterator_tag iterator_category;
168 bool is_valid()
const {
169 return bool(current_node_);
173 return current_node_.get();
177 return *current_node_.get();
184 explicit operator bool()
const {
196 if(!current_node_ && !rhs.current_node_) {
200 return ((stream_.get() == rhs.stream_.get()) &&
201 (current_node_->start() == rhs.current_node_->start()));
205 return !((*this) == rhs);
208 bool is_array_iterator()
const {
209 return is_array_iterator_;
222 inline optional<long> json_auto_cast<long>(JSONIterator it) {
223 return optional<long>(it->to_int().value());
227 inline optional<float> json_auto_cast<float>(JSONIterator it) {
228 return it->to_float();
232 inline optional<bool> json_auto_cast<bool>(JSONIterator it) {
233 return it->to_bool();
237 inline optional<std::string> json_auto_cast<std::string>(JSONIterator it) {
238 return optional<std::string>(it->to_str());
241 JSONIterator json_load(
const Path& path);
242 JSONIterator json_parse(
const std::string& data);
243 JSONIterator json_read(std::shared_ptr<std::istream> stream);