add GenericDocument<>::Swap

See #368.
This commit is contained in:
Philipp A. Hartmann 2015-07-04 01:57:24 +02:00
parent eb5818a5a2
commit dd901f498b
3 changed files with 42 additions and 1 deletions

View File

@ -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
//!@{ //!@{

View File

@ -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:
} }
#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() {

View File

@ -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) {
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;