/Users/brunogarcia/projects/bitcoin-core-dev/src/univalue/include/univalue.h
Line | Count | Source |
1 | | // Copyright 2014 BitPay Inc. |
2 | | // Copyright 2015 Bitcoin Core Developers |
3 | | // Distributed under the MIT software license, see the accompanying |
4 | | // file COPYING or https://opensource.org/licenses/mit-license.php. |
5 | | |
6 | | #ifndef BITCOIN_UNIVALUE_INCLUDE_UNIVALUE_H |
7 | | #define BITCOIN_UNIVALUE_INCLUDE_UNIVALUE_H |
8 | | |
9 | | #include <charconv> |
10 | | #include <cstddef> |
11 | | #include <cstdint> |
12 | | #include <map> |
13 | | #include <stdexcept> |
14 | | #include <string> |
15 | | #include <string_view> |
16 | | #include <system_error> |
17 | | #include <type_traits> |
18 | | #include <utility> |
19 | | #include <vector> |
20 | | |
21 | | // NOLINTNEXTLINE(misc-no-recursion) |
22 | | class UniValue { |
23 | | public: |
24 | | enum VType { VNULL, VOBJ, VARR, VSTR, VNUM, VBOOL, }; |
25 | | |
26 | | class type_error : public std::runtime_error |
27 | | { |
28 | | using std::runtime_error::runtime_error; |
29 | | }; |
30 | | |
31 | 0 | UniValue() { typ = VNULL; } |
32 | 0 | UniValue(UniValue::VType type, std::string str = {}) : typ{type}, val{std::move(str)} {} |
33 | | template <typename Ref, typename T = std::remove_cv_t<std::remove_reference_t<Ref>>, |
34 | | std::enable_if_t<std::is_floating_point_v<T> || // setFloat |
35 | | std::is_same_v<bool, T> || // setBool |
36 | | std::is_signed_v<T> || std::is_unsigned_v<T> || // setInt |
37 | | std::is_constructible_v<std::string, T>, // setStr |
38 | | bool> = true> |
39 | | UniValue(Ref&& val) |
40 | 0 | { |
41 | 0 | if constexpr (std::is_floating_point_v<T>) { |
42 | 0 | setFloat(val); |
43 | 0 | } else if constexpr (std::is_same_v<bool, T>) { |
44 | 0 | setBool(val); |
45 | 0 | } else if constexpr (std::is_signed_v<T>) { |
46 | 0 | setInt(int64_t{val}); |
47 | 0 | } else if constexpr (std::is_unsigned_v<T>) { |
48 | 0 | setInt(uint64_t{val}); |
49 | 0 | } else { |
50 | 0 | setStr(std::string{std::forward<Ref>(val)}); |
51 | 0 | } |
52 | 0 | } Unexecuted instantiation: UniValue::UniValue<std::__1::basic_string_view<char, std::__1::char_traits<char>>&, std::__1::basic_string_view<char, std::__1::char_traits<char>>, true>(std::__1::basic_string_view<char, std::__1::char_traits<char>>&) Unexecuted instantiation: UniValue::UniValue<bool, bool, true>(bool&&) Unexecuted instantiation: UniValue::UniValue<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, true>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&&) Unexecuted instantiation: UniValue::UniValue<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, true>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) Unexecuted instantiation: UniValue::UniValue<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, true>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&&) Unexecuted instantiation: UniValue::UniValue<unsigned int const&, unsigned int, true>(unsigned int const&) Unexecuted instantiation: UniValue::UniValue<unsigned int, unsigned int, true>(unsigned int&&) Unexecuted instantiation: UniValue::UniValue<int, int, true>(int&&) Unexecuted instantiation: UniValue::UniValue<long long, long long, true>(long long&&) Unexecuted instantiation: UniValue::UniValue<unsigned long long, unsigned long long, true>(unsigned long long&&) Unexecuted instantiation: UniValue::UniValue<int const&, int, true>(int const&) Unexecuted instantiation: UniValue::UniValue<long long const&, long long, true>(long long const&) Unexecuted instantiation: UniValue::UniValue<bool&, bool, true>(bool&) Unexecuted instantiation: UniValue::UniValue<char const (&) [4], char [4], true>(char const (&) [4]) Unexecuted instantiation: UniValue::UniValue<int&, int, true>(int&) Unexecuted instantiation: UniValue::UniValue<char const (&) [33], char [33], true>(char const (&) [33]) Unexecuted instantiation: UniValue::UniValue<char const (&) [47], char [47], true>(char const (&) [47]) Unexecuted instantiation: UniValue::UniValue<char const (&) [1], char [1], true>(char const (&) [1]) Unexecuted instantiation: UniValue::UniValue<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, true>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&) Unexecuted instantiation: UniValue::UniValue<unsigned char&, unsigned char, true>(unsigned char&) Unexecuted instantiation: UniValue::UniValue<long long&, long long, true>(long long&) Unexecuted instantiation: UniValue::UniValue<char const (&) [11], char [11], true>(char const (&) [11]) Unexecuted instantiation: UniValue::UniValue<char const (&) [30], char [30], true>(char const (&) [30]) Unexecuted instantiation: UniValue::UniValue<char const (&) [45], char [45], true>(char const (&) [45]) Unexecuted instantiation: UniValue::UniValue<char const (&) [86], char [86], true>(char const (&) [86]) Unexecuted instantiation: UniValue::UniValue<char const (&) [54], char [54], true>(char const (&) [54]) Unexecuted instantiation: UniValue::UniValue<unsigned long long const&, unsigned long long, true>(unsigned long long const&) Unexecuted instantiation: UniValue::UniValue<bool const&, bool, true>(bool const&) Unexecuted instantiation: UniValue::UniValue<char const (&) [137], char [137], true>(char const (&) [137]) Unexecuted instantiation: UniValue::UniValue<char const (&) [6], char [6], true>(char const (&) [6]) Unexecuted instantiation: UniValue::UniValue<char const (&) [3], char [3], true>(char const (&) [3]) Unexecuted instantiation: UniValue::UniValue<char const (&) [35], char [35], true>(char const (&) [35]) Unexecuted instantiation: UniValue::UniValue<char const (&) [5], char [5], true>(char const (&) [5]) Unexecuted instantiation: UniValue::UniValue<char const (&) [7], char [7], true>(char const (&) [7]) Unexecuted instantiation: UniValue::UniValue<char const (&) [9], char [9], true>(char const (&) [9]) Unexecuted instantiation: UniValue::UniValue<char const (&) [8], char [8], true>(char const (&) [8]) Unexecuted instantiation: UniValue::UniValue<char const (&) [12], char [12], true>(char const (&) [12]) Unexecuted instantiation: UniValue::UniValue<unsigned long, unsigned long, true>(unsigned long&&) Unexecuted instantiation: UniValue::UniValue<double, double, true>(double&&) Unexecuted instantiation: UniValue::UniValue<char const (&) [103], char [103], true>(char const (&) [103]) Unexecuted instantiation: UniValue::UniValue<char const (&) [18], char [18], true>(char const (&) [18]) Unexecuted instantiation: UniValue::UniValue<unsigned long long&, unsigned long long, true>(unsigned long long&) Unexecuted instantiation: UniValue::UniValue<unsigned long const&, unsigned long, true>(unsigned long const&) Unexecuted instantiation: UniValue::UniValue<char const (&) [26], char [26], true>(char const (&) [26]) Unexecuted instantiation: UniValue::UniValue<unsigned int&, unsigned int, true>(unsigned int&) Unexecuted instantiation: UniValue::UniValue<unsigned long&, unsigned long, true>(unsigned long&) Unexecuted instantiation: UniValue::UniValue<char const (&) [38], char [38], true>(char const (&) [38]) Unexecuted instantiation: UniValue::UniValue<double&, double, true>(double&) Unexecuted instantiation: UniValue::UniValue<char const (&) [60], char [60], true>(char const (&) [60]) Unexecuted instantiation: UniValue::UniValue<char const (&) [17], char [17], true>(char const (&) [17]) Unexecuted instantiation: UniValue::UniValue<char const (&) [15], char [15], true>(char const (&) [15]) Unexecuted instantiation: UniValue::UniValue<char const (&) [10], char [10], true>(char const (&) [10]) Unexecuted instantiation: UniValue::UniValue<char const (&) [23], char [23], true>(char const (&) [23]) Unexecuted instantiation: UniValue::UniValue<char const (&) [13], char [13], true>(char const (&) [13]) Unexecuted instantiation: UniValue::UniValue<char const*, char const*, true>(char const*&&) Unexecuted instantiation: UniValue::UniValue<unsigned short const&, unsigned short, true>(unsigned short const&) Unexecuted instantiation: UniValue::UniValue<char const (&) [21], char [21], true>(char const (&) [21]) Unexecuted instantiation: UniValue::UniValue<unsigned short, unsigned short, true>(unsigned short&&) Unexecuted instantiation: UniValue::UniValue<char const (&) [91], char [91], true>(char const (&) [91]) |
53 | | |
54 | | void clear(); |
55 | | |
56 | | void setNull(); |
57 | | void setBool(bool val); |
58 | | void setNumStr(std::string str); |
59 | | void setInt(uint64_t val); |
60 | | void setInt(int64_t val); |
61 | 0 | void setInt(int val_) { return setInt(int64_t{val_}); } |
62 | | void setFloat(double val); |
63 | | void setStr(std::string str); |
64 | | void setArray(); |
65 | | void setObject(); |
66 | | |
67 | 0 | enum VType getType() const { return typ; } |
68 | 0 | const std::string& getValStr() const { return val; } |
69 | 0 | bool empty() const { return (values.size() == 0); } |
70 | | |
71 | 0 | size_t size() const { return values.size(); } |
72 | | |
73 | | void reserve(size_t new_cap); |
74 | | |
75 | | void getObjMap(std::map<std::string,UniValue>& kv) const; |
76 | | bool checkObject(const std::map<std::string,UniValue::VType>& memberTypes) const; |
77 | | const UniValue& operator[](const std::string& key) const; |
78 | | const UniValue& operator[](size_t index) const; |
79 | 0 | bool exists(const std::string& key) const { size_t i; return findKey(key, i); } |
80 | | |
81 | 0 | bool isNull() const { return (typ == VNULL); } |
82 | 0 | bool isTrue() const { return (typ == VBOOL) && (val == "1"); } |
83 | 0 | bool isFalse() const { return (typ == VBOOL) && (val != "1"); } |
84 | 0 | bool isBool() const { return (typ == VBOOL); } |
85 | 0 | bool isStr() const { return (typ == VSTR); } |
86 | 0 | bool isNum() const { return (typ == VNUM); } |
87 | 0 | bool isArray() const { return (typ == VARR); } |
88 | 0 | bool isObject() const { return (typ == VOBJ); } |
89 | | |
90 | | void push_back(UniValue val); |
91 | | void push_backV(const std::vector<UniValue>& vec); |
92 | | template <class It> |
93 | | void push_backV(It first, It last); |
94 | | |
95 | | void pushKVEnd(std::string key, UniValue val); |
96 | | void pushKV(std::string key, UniValue val); |
97 | | void pushKVs(UniValue obj); |
98 | | |
99 | | std::string write(unsigned int prettyIndent = 0, |
100 | | unsigned int indentLevel = 0) const; |
101 | | |
102 | | bool read(std::string_view raw); |
103 | | |
104 | | private: |
105 | | UniValue::VType typ; |
106 | | std::string val; // numbers are stored as C++ strings |
107 | | std::vector<std::string> keys; |
108 | | std::vector<UniValue> values; |
109 | | |
110 | | void checkType(const VType& expected) const; |
111 | | bool findKey(const std::string& key, size_t& retIdx) const; |
112 | | void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const; |
113 | | void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const; |
114 | | |
115 | | public: |
116 | | // Strict type-specific getters, these throw std::runtime_error if the |
117 | | // value is of unexpected type |
118 | | const std::vector<std::string>& getKeys() const; |
119 | | const std::vector<UniValue>& getValues() const; |
120 | | template <typename Int> |
121 | | Int getInt() const; |
122 | | bool get_bool() const; |
123 | | const std::string& get_str() const; |
124 | | double get_real() const; |
125 | | const UniValue& get_obj() const; |
126 | | const UniValue& get_array() const; |
127 | | |
128 | 0 | enum VType type() const { return getType(); } |
129 | | const UniValue& find_value(std::string_view key) const; |
130 | | }; |
131 | | |
132 | | template <class It> |
133 | | void UniValue::push_backV(It first, It last) |
134 | 0 | { |
135 | 0 | checkType(VARR); |
136 | 0 | values.insert(values.end(), first, last); |
137 | 0 | } |
138 | | |
139 | | template <typename Int> |
140 | | Int UniValue::getInt() const |
141 | 0 | { |
142 | 0 | static_assert(std::is_integral_v<Int>); |
143 | 0 | checkType(VNUM); |
144 | 0 | Int result; |
145 | 0 | const auto [first_nonmatching, error_condition] = std::from_chars(val.data(), val.data() + val.size(), result); |
146 | 0 | if (first_nonmatching != val.data() + val.size() || error_condition != std::errc{}) { |
147 | 0 | throw std::runtime_error("JSON integer out of range"); |
148 | 0 | } |
149 | 0 | return result; |
150 | 0 | } Unexecuted instantiation: long long UniValue::getInt<long long>() const Unexecuted instantiation: int UniValue::getInt<int>() const Unexecuted instantiation: unsigned long long UniValue::getInt<unsigned long long>() const Unexecuted instantiation: unsigned int UniValue::getInt<unsigned int>() const Unexecuted instantiation: unsigned short UniValue::getInt<unsigned short>() const |
151 | | |
152 | | enum jtokentype { |
153 | | JTOK_ERR = -1, |
154 | | JTOK_NONE = 0, // eof |
155 | | JTOK_OBJ_OPEN, |
156 | | JTOK_OBJ_CLOSE, |
157 | | JTOK_ARR_OPEN, |
158 | | JTOK_ARR_CLOSE, |
159 | | JTOK_COLON, |
160 | | JTOK_COMMA, |
161 | | JTOK_KW_NULL, |
162 | | JTOK_KW_TRUE, |
163 | | JTOK_KW_FALSE, |
164 | | JTOK_NUMBER, |
165 | | JTOK_STRING, |
166 | | }; |
167 | | |
168 | | extern enum jtokentype getJsonToken(std::string& tokenVal, |
169 | | unsigned int& consumed, const char *raw, const char *end); |
170 | | extern const char *uvTypeName(UniValue::VType t); |
171 | | |
172 | | static inline bool jsonTokenIsValue(enum jtokentype jtt) |
173 | 0 | { |
174 | 0 | switch (jtt) { |
175 | 0 | case JTOK_KW_NULL: |
176 | 0 | case JTOK_KW_TRUE: |
177 | 0 | case JTOK_KW_FALSE: |
178 | 0 | case JTOK_NUMBER: |
179 | 0 | case JTOK_STRING: |
180 | 0 | return true; |
181 | | |
182 | 0 | default: |
183 | 0 | return false; |
184 | 0 | } |
185 | | |
186 | | // not reached |
187 | 0 | } Unexecuted instantiation: hex.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: integer.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: key.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: kitchen_sink.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: parse_univalue.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: rpc.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: script.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: script_assets_test_minimizer.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: script_format.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: string.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: transaction.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: client.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: args.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: config.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: run_command.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: settings.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: core_write.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: external_signer.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: net_types.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: rawtransaction_util.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: request.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: util.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: univalue.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: univalue_get.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: univalue_read.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: univalue_write.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: external_signer_scriptpubkeyman.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: interfaces.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: load.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: addresses.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: backup.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: coins.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: encrypt.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: signmessage.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: spend.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: transactions.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: wallet.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: setup_common.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: addrdb.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: httprpc.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: init.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: warnings.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: rest.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: blockchain.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: fees.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: mempool.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: mining.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: net.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: node.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: output_script.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: rawtransaction.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: server.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: server_util.cpp:jsonTokenIsValue(jtokentype) Unexecuted instantiation: txoutproof.cpp:jsonTokenIsValue(jtokentype) |
188 | | |
189 | | static inline bool json_isspace(int ch) |
190 | 0 | { |
191 | 0 | switch (ch) { |
192 | 0 | case 0x20: |
193 | 0 | case 0x09: |
194 | 0 | case 0x0a: |
195 | 0 | case 0x0d: |
196 | 0 | return true; |
197 | | |
198 | 0 | default: |
199 | 0 | return false; |
200 | 0 | } |
201 | | |
202 | | // not reached |
203 | 0 | } Unexecuted instantiation: hex.cpp:json_isspace(int) Unexecuted instantiation: integer.cpp:json_isspace(int) Unexecuted instantiation: key.cpp:json_isspace(int) Unexecuted instantiation: kitchen_sink.cpp:json_isspace(int) Unexecuted instantiation: parse_univalue.cpp:json_isspace(int) Unexecuted instantiation: rpc.cpp:json_isspace(int) Unexecuted instantiation: script.cpp:json_isspace(int) Unexecuted instantiation: script_assets_test_minimizer.cpp:json_isspace(int) Unexecuted instantiation: script_format.cpp:json_isspace(int) Unexecuted instantiation: string.cpp:json_isspace(int) Unexecuted instantiation: transaction.cpp:json_isspace(int) Unexecuted instantiation: client.cpp:json_isspace(int) Unexecuted instantiation: args.cpp:json_isspace(int) Unexecuted instantiation: config.cpp:json_isspace(int) Unexecuted instantiation: run_command.cpp:json_isspace(int) Unexecuted instantiation: settings.cpp:json_isspace(int) Unexecuted instantiation: core_write.cpp:json_isspace(int) Unexecuted instantiation: external_signer.cpp:json_isspace(int) Unexecuted instantiation: net_types.cpp:json_isspace(int) Unexecuted instantiation: rawtransaction_util.cpp:json_isspace(int) Unexecuted instantiation: request.cpp:json_isspace(int) Unexecuted instantiation: util.cpp:json_isspace(int) Unexecuted instantiation: univalue.cpp:json_isspace(int) Unexecuted instantiation: univalue_get.cpp:json_isspace(int) Unexecuted instantiation: univalue_read.cpp:json_isspace(int) Unexecuted instantiation: univalue_write.cpp:json_isspace(int) Unexecuted instantiation: external_signer_scriptpubkeyman.cpp:json_isspace(int) Unexecuted instantiation: interfaces.cpp:json_isspace(int) Unexecuted instantiation: load.cpp:json_isspace(int) Unexecuted instantiation: addresses.cpp:json_isspace(int) Unexecuted instantiation: backup.cpp:json_isspace(int) Unexecuted instantiation: coins.cpp:json_isspace(int) Unexecuted instantiation: encrypt.cpp:json_isspace(int) Unexecuted instantiation: signmessage.cpp:json_isspace(int) Unexecuted instantiation: spend.cpp:json_isspace(int) Unexecuted instantiation: transactions.cpp:json_isspace(int) Unexecuted instantiation: wallet.cpp:json_isspace(int) Unexecuted instantiation: setup_common.cpp:json_isspace(int) Unexecuted instantiation: addrdb.cpp:json_isspace(int) Unexecuted instantiation: httprpc.cpp:json_isspace(int) Unexecuted instantiation: init.cpp:json_isspace(int) Unexecuted instantiation: warnings.cpp:json_isspace(int) Unexecuted instantiation: rest.cpp:json_isspace(int) Unexecuted instantiation: blockchain.cpp:json_isspace(int) Unexecuted instantiation: fees.cpp:json_isspace(int) Unexecuted instantiation: mempool.cpp:json_isspace(int) Unexecuted instantiation: mining.cpp:json_isspace(int) Unexecuted instantiation: net.cpp:json_isspace(int) Unexecuted instantiation: node.cpp:json_isspace(int) Unexecuted instantiation: output_script.cpp:json_isspace(int) Unexecuted instantiation: rawtransaction.cpp:json_isspace(int) Unexecuted instantiation: server.cpp:json_isspace(int) Unexecuted instantiation: server_util.cpp:json_isspace(int) Unexecuted instantiation: txoutproof.cpp:json_isspace(int) |
204 | | |
205 | | extern const UniValue NullUniValue; |
206 | | |
207 | | #endif // BITCOIN_UNIVALUE_INCLUDE_UNIVALUE_H |