// // json.cpp // json // // Created by Sam Jaffe on 1/30/16. // Copyright © 2016 Sam Jaffe. All rights reserved. // #include "json.hpp" const json::value json::value::null_value{}; template <> void json::helper::parse_numeric(json::value & json, char const * & data) { numeric_token_info info = data; if ( info.is_double || info.parse_numeric() == DOUBLE ) { helper::parse_double(json, data); } else { uint_jt const val = info.val; if (info.is_negative) { if (val == INT_JT_OVER) { json = INT_JT_MIN; } else { json = -int_jt(val); } } else if (val <= uint_jt(INT_JT_MAX)) { json = int_jt(val); } else { json = val; } data = info.it; } } json::value& json::value::operator[](const size_t idx) { if (!is_array()) { data.set(); } array_jt & val = data.get(); if (val.size() <= idx) val.resize(idx+1); return val[idx]; } json::value const& json::value::operator[](const size_t idx) const { if (!is_array()) return null_value; array_jt const& val = data.get(); if (val.size() <= idx) return null_value; else return val[idx]; } json::value& json::value::operator[](std::string const& key) { if (!is_object()) { data.set(); } return data.get()[key]; } json::value const& json::value::operator[](std::string const& key) const { if (!is_object()) return null_value; object_jt const& val = data.get(); auto it = val.find(key); if (it != val.end()) { return it->second; } else { return null_value; } } json::value::string_jt const& json::value::as_string() const { return data.get(); } json::value::double_jt json::value::as_double() const { if (data.is()) { return data.get(); } else if (data.is()) { return static_cast(data.get()); } else if (data.is()) { return data.get() ? 1.0 : 0.0; } else { return 0.0; } } json::value::int_jt json::value::as_int() const { if (data.is()) { return static_cast(data.get()); } else if (data.is()) { return data.get(); } else if (data.is() && data.get() <= uint_jt(INT_JT_MAX)) { return static_cast(data.get()); } else if (data.is()) { return data.get() ? 1 : 0; } else { return 0; } } json::value::uint_jt json::value::as_uint() const { if (data.is()) { return static_cast(data.get()); } else if (data.is() && data.get() >= 0) { return static_cast(data.get()); } else if (data.is()) { return data.get(); } else if (data.is()) { return data.get() ? 1 : 0; } else { return 0; } } json::value::bool_jt json::value::as_bool() const { if (data.is()) { return data.get() != 0; } else if (data.is()) { return data.get() != 0; } else if (data.is()) { return data.get() != 0; } else if (data.is()) { return data.get(); } else { return false; } }