git / moonbite-core / src/univalue/lib/univalue.cpp · raw

// Copyright 2014 BitPay Inc.// Copyright 2015 Bitcoin Core Developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#include <stdint.h>#include <iomanip>#include <sstream>#include <stdlib.h>#include "univalue.h"const UniValue NullUniValue;void UniValue::clear(){    typ = VNULL;    val.clear();    keys.clear();    values.clear();}bool UniValue::setNull(){    clear();    return true;}bool UniValue::setBool(bool val_){    clear();    typ = VBOOL;    if (val_)        val = "1";    return true;}static bool validNumStr(const std::string& s){    std::string tokenVal;    unsigned int consumed;    enum jtokentype tt = getJsonToken(tokenVal, consumed, s.data(), s.data() + s.size());    return (tt == JTOK_NUMBER);}bool UniValue::setNumStr(const std::string& val_){    if (!validNumStr(val_))        return false;    clear();    typ = VNUM;    val = val_;    return true;}bool UniValue::setInt(uint64_t val_){    std::ostringstream oss;    oss << val_;    return setNumStr(oss.str());}bool UniValue::setInt(int64_t val_){    std::ostringstream oss;    oss << val_;    return setNumStr(oss.str());}bool UniValue::setFloat(double val_){    std::ostringstream oss;    oss << std::setprecision(16) << val_;    bool ret = setNumStr(oss.str());    typ = VNUM;    return ret;}bool UniValue::setStr(const std::string& val_){    clear();    typ = VSTR;    val = val_;    return true;}bool UniValue::setArray(){    clear();    typ = VARR;    return true;}bool UniValue::setObject(){    clear();    typ = VOBJ;    return true;}bool UniValue::push_back(const UniValue& val_){    if (typ != VARR)        return false;    values.push_back(val_);    return true;}bool UniValue::push_backV(const std::vector<UniValue>& vec){    if (typ != VARR)        return false;    values.insert(values.end(), vec.begin(), vec.end());    return true;}void UniValue::__pushKV(const std::string& key, const UniValue& val_){    keys.push_back(key);    values.push_back(val_);}bool UniValue::pushKV(const std::string& key, const UniValue& val_){    if (typ != VOBJ)        return false;    size_t idx;    if (findKey(key, idx))        values[idx] = val_;    else        __pushKV(key, val_);    return true;}bool UniValue::pushKVs(const UniValue& obj){    if (typ != VOBJ || obj.typ != VOBJ)        return false;    for (size_t i = 0; i < obj.keys.size(); i++)        __pushKV(obj.keys[i], obj.values.at(i));    return true;}void UniValue::getObjMap(std::map<std::string,UniValue>& kv) const{    if (typ != VOBJ)        return;    kv.clear();    for (size_t i = 0; i < keys.size(); i++)        kv[keys[i]] = values[i];}bool UniValue::findKey(const std::string& key, size_t& retIdx) const{    for (size_t i = 0; i < keys.size(); i++) {        if (keys[i] == key) {            retIdx = i;            return true;        }    }    return false;}bool UniValue::checkObject(const std::map<std::string,UniValue::VType>& t) const{    if (typ != VOBJ)        return false;    for (std::map<std::string,UniValue::VType>::const_iterator it = t.begin();         it != t.end(); ++it) {        size_t idx = 0;        if (!findKey(it->first, idx))            return false;        if (values.at(idx).getType() != it->second)            return false;    }    return true;}const UniValue& UniValue::operator[](const std::string& key) const{    if (typ != VOBJ)        return NullUniValue;    size_t index = 0;    if (!findKey(key, index))        return NullUniValue;    return values.at(index);}const UniValue& UniValue::operator[](size_t index) const{    if (typ != VOBJ && typ != VARR)        return NullUniValue;    if (index >= values.size())        return NullUniValue;    return values.at(index);}const char *uvTypeName(UniValue::VType t){    switch (t) {    case UniValue::VNULL: return "null";    case UniValue::VBOOL: return "bool";    case UniValue::VOBJ: return "object";    case UniValue::VARR: return "array";    case UniValue::VSTR: return "string";    case UniValue::VNUM: return "number";    }    // not reached    return NULL;}const UniValue& find_value(const UniValue& obj, const std::string& name){    for (unsigned int i = 0; i < obj.keys.size(); i++)        if (obj.keys[i] == name)            return obj.values.at(i);    return NullUniValue;}