From 2ee15de4a9f5813594820eb510dfcd2090238b18 Mon Sep 17 00:00:00 2001 From: miloyip Date: Sat, 2 May 2015 22:58:41 +0800 Subject: [PATCH] Add no allocator overloads for Swap --- include/rapidjson/pointer.h | 18 +++++++++++++++++- test/unittest/pointertest.cpp | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/include/rapidjson/pointer.h b/include/rapidjson/pointer.h index cd52b43..c0b2253 100644 --- a/include/rapidjson/pointer.h +++ b/include/rapidjson/pointer.h @@ -357,6 +357,11 @@ public: return Create(root, allocator).Swap(value); } + template + ValueType& Swap(GenericDocument& root, ValueType& value) const { + return Create(root).Swap(value); + } + private: void Parse(const Ch* source, size_t length) { // Create own allocator if user did not supply. @@ -462,6 +467,8 @@ private: PointerParseErrorCode parseErrorCode_; }; +typedef GenericPointer Pointer; + ////////////////////////////////////////////////////////////////////////////// template @@ -717,7 +724,16 @@ typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], t return SwapValueByPointer(root, pointer, value, a); } -typedef GenericPointer Pointer; +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value) { + return pointer.Swap(root, value); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value) { + const GenericPointer pointer(source, N - 1); + return SwapValueByPointer(root, pointer, value); +} RAPIDJSON_NAMESPACE_END diff --git a/test/unittest/pointertest.cpp b/test/unittest/pointertest.cpp index 13015ba..75ca5a3 100644 --- a/test/unittest/pointertest.cpp +++ b/test/unittest/pointertest.cpp @@ -526,6 +526,14 @@ TEST(Pointer, Swap) { EXPECT_STREQ("bar", d["foo"][1].GetString()); } +TEST(Pointer, Swap_NoAllocator) { + Document d; + d.Parse(kJson); + Pointer("/foo/0").Swap(d, *Pointer("/foo/1").Get(d)); + EXPECT_STREQ("baz", d["foo"][0].GetString()); + EXPECT_STREQ("bar", d["foo"][1].GetString()); +} + TEST(Pointer, CreateValueByPointer) { Document d; Document::AllocatorType& a = d.GetAllocator(); @@ -958,3 +966,15 @@ TEST(Pointer, SwapValueByPointer) { EXPECT_STREQ("bar", d["foo"][0].GetString()); EXPECT_STREQ("baz", d["foo"][1].GetString()); } + +TEST(Pointer, SwapValueByPointer_NoAllocator) { + Document d; + d.Parse(kJson); + SwapValueByPointer(d, Pointer("/foo/0"), *GetValueByPointer(d, "/foo/1")); + EXPECT_STREQ("baz", d["foo"][0].GetString()); + EXPECT_STREQ("bar", d["foo"][1].GetString()); + + SwapValueByPointer(d, "/foo/0", *GetValueByPointer(d, "/foo/1")); + EXPECT_STREQ("bar", d["foo"][0].GetString()); + EXPECT_STREQ("baz", d["foo"][1].GetString()); +}