diff options
Diffstat (limited to 'src/univalue/include/univalue.h')
-rw-r--r-- | src/univalue/include/univalue.h | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/univalue/include/univalue.h b/src/univalue/include/univalue.h index fc5cf402be..35eaa2dd0d 100644 --- a/src/univalue/include/univalue.h +++ b/src/univalue/include/univalue.h @@ -6,13 +6,14 @@ #ifndef __UNIVALUE_H__ #define __UNIVALUE_H__ -#include <stdint.h> -#include <string.h> - +#include <charconv> +#include <cstdint> +#include <cstring> +#include <map> +#include <stdexcept> #include <string> +#include <type_traits> #include <vector> -#include <map> -#include <cassert> class UniValue { public: @@ -168,10 +169,24 @@ public: // value is of unexpected type const std::vector<std::string>& getKeys() const; const std::vector<UniValue>& getValues() const; + template <typename Int> + auto getInt() const + { + static_assert(std::is_integral<Int>::value); + if (typ != VNUM) { + throw std::runtime_error("JSON value is not an integer as expected"); + } + Int result; + const auto [first_nonmatching, error_condition] = std::from_chars(val.data(), val.data() + val.size(), result); + if (first_nonmatching != val.data() + val.size() || error_condition != std::errc{}) { + throw std::runtime_error("JSON integer out of range"); + } + return result; + } bool get_bool() const; const std::string& get_str() const; - int get_int() const; - int64_t get_int64() const; + auto get_int() const { return getInt<int>(); }; + auto get_int64() const { return getInt<int64_t>(); }; double get_real() const; const UniValue& get_obj() const; const UniValue& get_array() const; |