Commit dd901f49 authored by Philipp A. Hartmann's avatar Philipp A. Hartmann

add GenericDocument<>::Swap

See #368.
parent eb5818a5
...@@ -1803,6 +1803,22 @@ public: ...@@ -1803,6 +1803,22 @@ public:
} }
#endif #endif
//! Exchange the contents of this document with those of another.
/*!
\param other Another document.
\note Constant complexity.
\see GenericValue::Swap
*/
GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT {
using std::swap;
ValueType::Swap(rhs);
stack_.Swap(rhs.stack_);
swap(allocator_, rhs.allocator_);
swap(ownAllocator_, rhs.ownAllocator_);
swap(parseResult_, rhs.parseResult_);
return *this;
}
//!@name Parse from stream //!@name Parse from stream
//!@{ //!@{
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#ifndef RAPIDJSON_INTERNAL_STACK_H_ #ifndef RAPIDJSON_INTERNAL_STACK_H_
#define RAPIDJSON_INTERNAL_STACK_H_ #define RAPIDJSON_INTERNAL_STACK_H_
#include <algorithm> // std::swap
#include "../rapidjson.h" #include "../rapidjson.h"
RAPIDJSON_NAMESPACE_BEGIN RAPIDJSON_NAMESPACE_BEGIN
...@@ -81,6 +83,17 @@ public: ...@@ -81,6 +83,17 @@ public:
} }
#endif #endif
void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT {
using std::swap;
swap(allocator_, rhs.allocator_);
swap(ownAllocator_, rhs.ownAllocator_);
swap(stack_, rhs.stack_);
swap(stackTop_, rhs.stackTop_);
swap(stackEnd_, rhs.stackEnd_);
swap(initialCapacity_, rhs.initialCapacity_);
}
void Clear() { stackTop_ = stack_; } void Clear() { stackTop_ = stack_; }
void ShrinkToFit() { void ShrinkToFit() {
......
...@@ -202,7 +202,8 @@ TEST(Document, Swap) { ...@@ -202,7 +202,8 @@ TEST(Document, Swap) {
o.SetObject().AddMember("a", 1, a); o.SetObject().AddMember("a", 1, a);
// Swap between Document and Value // Swap between Document and Value
d1.Swap(o); // d1.Swap(o); // doesn't compile
o.Swap(d1);
EXPECT_TRUE(d1.IsObject()); EXPECT_TRUE(d1.IsObject());
EXPECT_TRUE(o.IsArray()); EXPECT_TRUE(o.IsArray());
...@@ -212,8 +213,19 @@ TEST(Document, Swap) { ...@@ -212,8 +213,19 @@ TEST(Document, Swap) {
d1.Swap(d2); d1.Swap(d2);
EXPECT_TRUE(d1.IsArray()); EXPECT_TRUE(d1.IsArray());
EXPECT_TRUE(d2.IsObject()); EXPECT_TRUE(d2.IsObject());
EXPECT_EQ(&d2.GetAllocator(), &a);
// reset value
Value().Swap(d1);
EXPECT_TRUE(d1.IsNull());
// reset document, including allocator
Document().Swap(d2);
EXPECT_TRUE(d2.IsNull());
EXPECT_NE(&d2.GetAllocator(), &a);
} }
// This should be slow due to assignment in inner-loop. // This should be slow due to assignment in inner-loop.
struct OutputStringStream : public std::ostringstream { struct OutputStringStream : public std::ostringstream {
typedef char Ch; typedef char Ch;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment