From 5408f1dc9664d8ed11042787be134fdf6d5b19fe Mon Sep 17 00:00:00 2001 From: NN Date: Sat, 23 May 2020 16:40:58 +0300 Subject: [PATCH 1/3] Add constructor from all integer types. Fixes #1428 --- Release/include/cpprest/json.h | 62 ++++++++++++++----- Release/src/json/json.cpp | 37 ++++++++--- .../functional/json/construction_tests.cpp | 55 ++++++++++++++++ 3 files changed, 130 insertions(+), 24 deletions(-) diff --git a/Release/include/cpprest/json.h b/Release/include/cpprest/json.h index 8fbbf947f2..84bf2b89d6 100644 --- a/Release/include/cpprest/json.h +++ b/Release/include/cpprest/json.h @@ -100,25 +100,37 @@ class value /// Constructor creating a JSON number value /// /// The C++ value to create a JSON value from - _ASYNCRTIMP value(int32_t value); + _ASYNCRTIMP value(int value); /// /// Constructor creating a JSON number value /// /// The C++ value to create a JSON value from - _ASYNCRTIMP value(uint32_t value); + _ASYNCRTIMP value(unsigned value); /// /// Constructor creating a JSON number value /// /// The C++ value to create a JSON value from - _ASYNCRTIMP value(int64_t value); + _ASYNCRTIMP value(long value); /// /// Constructor creating a JSON number value /// /// The C++ value to create a JSON value from - _ASYNCRTIMP value(uint64_t value); + _ASYNCRTIMP value(unsigned long value); + + /// + /// Constructor creating a JSON number value + /// + /// The C++ value to create a JSON value from + _ASYNCRTIMP value(long long value); + + /// + /// Constructor creating a JSON number value + /// + /// The C++ value to create a JSON value from + _ASYNCRTIMP value(unsigned long long value); /// /// Constructor creating a JSON number value @@ -222,28 +234,42 @@ class value /// /// The C++ value to create a JSON value from /// A JSON number value - static _ASYNCRTIMP value __cdecl number(int32_t value); + static _ASYNCRTIMP value __cdecl number(int value); + + /// + /// Creates a number value + /// + /// The C++ value to create a JSON value from + /// A JSON number value + static _ASYNCRTIMP value __cdecl number(unsigned value); + + /// + /// Creates a number value + /// + /// The C++ value to create a JSON value from + /// A JSON number value + static _ASYNCRTIMP value __cdecl number(long value); /// /// Creates a number value /// /// The C++ value to create a JSON value from /// A JSON number value - static _ASYNCRTIMP value __cdecl number(uint32_t value); + static _ASYNCRTIMP value __cdecl number(unsigned long value); /// /// Creates a number value /// /// The C++ value to create a JSON value from /// A JSON number value - static _ASYNCRTIMP value __cdecl number(int64_t value); + static _ASYNCRTIMP value __cdecl number(long long value); /// /// Creates a number value /// /// The C++ value to create a JSON value from /// A JSON number value - static _ASYNCRTIMP value __cdecl number(uint64_t value); + static _ASYNCRTIMP value __cdecl number(unsigned long long value); /// /// Creates a Boolean value @@ -1218,10 +1244,12 @@ class number // convert to unsigned int64). This helps handling number objects e.g. comparing two numbers. number(double value) : m_value(value), m_type(double_type) {} - number(int32_t value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) {} - number(uint32_t value) : m_intval(value), m_type(unsigned_type) {} - number(int64_t value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) {} - number(uint64_t value) : m_uintval(value), m_type(unsigned_type) {} + number(int value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) {} + number(unsigned value) : m_intval(value), m_type(unsigned_type) {} + number(long value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) {} + number(unsigned long value) : m_uintval(value), m_type(unsigned_type) {} + number(long long value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) { } + number(unsigned long long value) : m_uintval(value), m_type(unsigned_type) { } public: /// @@ -1438,10 +1466,12 @@ class _Number : public _Value { public: _Number(double value) : m_number(value) {} - _Number(int32_t value) : m_number(value) {} - _Number(uint32_t value) : m_number(value) {} - _Number(int64_t value) : m_number(value) {} - _Number(uint64_t value) : m_number(value) {} + _Number(int value) : m_number(value) {} + _Number(unsigned value) : m_number(value) {} + _Number(long value) : m_number(value) {} + _Number(unsigned long value) : m_number(value) {} + _Number(long long value) : m_number(value) { } + _Number(unsigned long long value) : m_number(value) { } virtual std::unique_ptr<_Value> _copy_value() { return utility::details::make_unique<_Number>(*this); } diff --git a/Release/src/json/json.cpp b/Release/src/json/json.cpp index f1f0865d87..079ccae473 100644 --- a/Release/src/json/json.cpp +++ b/Release/src/json/json.cpp @@ -38,7 +38,7 @@ web::json::value::value() { } -web::json::value::value(int32_t value) +web::json::value::value(int value) : m_value(utility::details::make_unique(value)) #ifdef ENABLE_JSON_VALUE_VISUALIZER , m_kind(value::Number) @@ -46,7 +46,7 @@ web::json::value::value(int32_t value) { } -web::json::value::value(uint32_t value) +web::json::value::value(unsigned value) : m_value(utility::details::make_unique(value)) #ifdef ENABLE_JSON_VALUE_VISUALIZER , m_kind(value::Number) @@ -54,7 +54,8 @@ web::json::value::value(uint32_t value) { } -web::json::value::value(int64_t value) + +web::json::value::value(long value) : m_value(utility::details::make_unique(value)) #ifdef ENABLE_JSON_VALUE_VISUALIZER , m_kind(value::Number) @@ -62,7 +63,23 @@ web::json::value::value(int64_t value) { } -web::json::value::value(uint64_t value) +web::json::value::value(unsigned long value) + : m_value(utility::details::make_unique(value)) +#ifdef ENABLE_JSON_VALUE_VISUALIZER + , m_kind(value::Number) +#endif +{ +} + +web::json::value::value(long long value) + : m_value(utility::details::make_unique(value)) +#ifdef ENABLE_JSON_VALUE_VISUALIZER + , m_kind(value::Number) +#endif +{ +} + +web::json::value::value(unsigned long long value) : m_value(utility::details::make_unique(value)) #ifdef ENABLE_JSON_VALUE_VISUALIZER , m_kind(value::Number) @@ -162,13 +179,17 @@ web::json::value web::json::value::null() { return web::json::value(); } web::json::value web::json::value::number(double value) { return web::json::value(value); } -web::json::value web::json::value::number(int32_t value) { return web::json::value(value); } +web::json::value web::json::value::number(int value) { return web::json::value(value); } + +web::json::value web::json::value::number(unsigned value) { return web::json::value(value); } + +web::json::value web::json::value::number(long value) { return web::json::value(value); } -web::json::value web::json::value::number(uint32_t value) { return web::json::value(value); } +web::json::value web::json::value::number(unsigned long value) { return web::json::value(value); } -web::json::value web::json::value::number(int64_t value) { return web::json::value(value); } +web::json::value web::json::value::number(long long value) { return web::json::value(value); } -web::json::value web::json::value::number(uint64_t value) { return web::json::value(value); } +web::json::value web::json::value::number(unsigned long long value) { return web::json::value(value); } web::json::value web::json::value::boolean(bool value) { return web::json::value(value); } diff --git a/Release/tests/functional/json/construction_tests.cpp b/Release/tests/functional/json/construction_tests.cpp index 111b1454e1..7a9275b301 100644 --- a/Release/tests/functional/json/construction_tests.cpp +++ b/Release/tests/functional/json/construction_tests.cpp @@ -50,6 +50,61 @@ SUITE(construction_tests) VERIFY_ARE_EQUAL(U("null"), arr[1].serialize()); } + TEST(int_assignment_op) + { + json::value v; + v = static_cast(1); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + + v = static_cast(1); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + + v = static_cast(1); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + + v = static_cast(1); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + + v = static_cast(1); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + + v = static_cast(1); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + } + + TEST(int_ctor) + { + { + json::value v(static_cast(1)); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + } + + { + json::value v(static_cast(1)); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + } + + { + json::value v(static_cast(1)); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + } + + { + json::value v(static_cast(1)); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + } + + { + json::value v(static_cast(1)); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + } + + { + json::value v(static_cast(1)); + VERIFY_ARE_EQUAL(U("1"), v.serialize()); + } + } + TEST(copy_ctor_array) { json::value arr = json::value::array(); From 06363bc78325e9541dd9fa2a6eab291d3f3c8596 Mon Sep 17 00:00:00 2001 From: NN <580536+NN---@users.noreply.github.com> Date: Thu, 10 Mar 2022 22:38:13 +0200 Subject: [PATCH 2/3] Update Release/include/cpprest/json.h Co-authored-by: Charlie Barto --- Release/include/cpprest/json.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Release/include/cpprest/json.h b/Release/include/cpprest/json.h index 84bf2b89d6..78e20c4d9e 100644 --- a/Release/include/cpprest/json.h +++ b/Release/include/cpprest/json.h @@ -1248,8 +1248,8 @@ class number number(unsigned value) : m_intval(value), m_type(unsigned_type) {} number(long value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) {} number(unsigned long value) : m_uintval(value), m_type(unsigned_type) {} - number(long long value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) { } - number(unsigned long long value) : m_uintval(value), m_type(unsigned_type) { } + number(long long value) : m_intval(value), m_type(value < 0 ? signed_type : unsigned_type) {} + number(unsigned long long value) : m_uintval(value), m_type(unsigned_type) {} public: /// From 3eac925ada68dc2df6a5b688fdfb79865e04a6f3 Mon Sep 17 00:00:00 2001 From: NN <580536+NN---@users.noreply.github.com> Date: Thu, 10 Mar 2022 22:38:30 +0200 Subject: [PATCH 3/3] Update Release/include/cpprest/json.h Co-authored-by: Charlie Barto --- Release/include/cpprest/json.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Release/include/cpprest/json.h b/Release/include/cpprest/json.h index 78e20c4d9e..9549f9b8d5 100644 --- a/Release/include/cpprest/json.h +++ b/Release/include/cpprest/json.h @@ -1470,8 +1470,8 @@ class _Number : public _Value _Number(unsigned value) : m_number(value) {} _Number(long value) : m_number(value) {} _Number(unsigned long value) : m_number(value) {} - _Number(long long value) : m_number(value) { } - _Number(unsigned long long value) : m_number(value) { } + _Number(long long value) : m_number(value) {} + _Number(unsigned long long value) : m_number(value) {} virtual std::unique_ptr<_Value> _copy_value() { return utility::details::make_unique<_Number>(*this); }