Skip to content

Commit

Permalink
Merge pull request #740 from CreoValis/writer-move-ctor
Browse files Browse the repository at this point in the history
Move constructor support for Writer
  • Loading branch information
miloyip committed Sep 20, 2016
2 parents 5268211 + 1a64cd0 commit 185a7cc
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 0 deletions.
14 changes: 14 additions & 0 deletions include/rapidjson/prettywriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(effc++)
#endif

#if defined(__clang__)
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(c++98-compat)
#endif

RAPIDJSON_NAMESPACE_BEGIN

//! Combination of PrettyWriter format flags.
Expand Down Expand Up @@ -57,6 +62,11 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,
explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) :
Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {}

#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
PrettyWriter(PrettyWriter&& rhs) :
Base(std::forward<PrettyWriter>(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {}
#endif

//! Set custom indentation.
/*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r').
\param indentCharCount Number of indent characters for each indentation level.
Expand Down Expand Up @@ -254,6 +264,10 @@ class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding,

RAPIDJSON_NAMESPACE_END

#if defined(__clang__)
RAPIDJSON_DIAG_POP
#endif

#ifdef __GNUC__
RAPIDJSON_DIAG_POP
#endif
Expand Down
8 changes: 8 additions & 0 deletions include/rapidjson/writer.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(padded)
RAPIDJSON_DIAG_OFF(unreachable-code)
RAPIDJSON_DIAG_OFF(c++98-compat)
#endif

RAPIDJSON_NAMESPACE_BEGIN
Expand Down Expand Up @@ -103,6 +104,13 @@ class Writer {
Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) :
os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {}

#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
Writer(Writer&& rhs) :
os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) {
rhs.os_=nullptr;
}
#endif

//! Reset the writer with a new stream.
/*!
This function reset the writer with a new stream and default settings,
Expand Down
31 changes: 31 additions & 0 deletions test/unittest/prettywritertest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
#include "rapidjson/stringbuffer.h"
#include "rapidjson/filewritestream.h"

#ifdef __clang__
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(c++98-compat)
#endif

using namespace rapidjson;

static const char kJson[] = "{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3,-1],\"u64\":1234567890123456789,\"i64\":-1234567890123456789}";
Expand Down Expand Up @@ -201,3 +206,29 @@ TEST(PrettyWriter, RawValue) {
"}",
buffer.GetString());
}

#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
TEST(PrettyWriter, MoveCtor) {
StringBuffer buffer;
auto writerGen=[](StringBuffer &target) -> PrettyWriter<StringBuffer> {

This comment has been minimized.

Copy link
@acelyc111

acelyc111 Sep 21, 2016

gcc 4.4.7 is not support this syntax, maybe macro RAPIDJSON_HAS_CXX11_RVALUE_REFS should modify

This comment has been minimized.

Copy link
@miloyip

miloyip Sep 21, 2016

Author Collaborator

Fixed in 0761ac1
Thank you.

PrettyWriter<StringBuffer> writer(target);
writer.StartObject();
writer.Key("a");
writer.Int(1);
return std::move(writer);
};

PrettyWriter<StringBuffer> writer(writerGen(buffer));
writer.EndObject();
EXPECT_TRUE(writer.IsComplete());
EXPECT_STREQ(
"{\n"
" \"a\": 1\n"
"}",
buffer.GetString());
}
#endif

#ifdef __clang__
RAPIDJSON_DIAG_POP
#endif
27 changes: 27 additions & 0 deletions test/unittest/writertest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
#include "rapidjson/stringbuffer.h"
#include "rapidjson/memorybuffer.h"

#ifdef __clang__
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(c++98-compat)
#endif

using namespace rapidjson;

TEST(Writer, Compact) {
Expand Down Expand Up @@ -495,3 +500,25 @@ TEST(Writer, RawValue) {
EXPECT_TRUE(writer.IsComplete());
EXPECT_STREQ("{\"a\":1,\"raw\":[\"Hello\\nWorld\", 123.456]}", buffer.GetString());
}

#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
TEST(Writer, MoveCtor) {
StringBuffer buffer;
auto writerGen=[](StringBuffer &target) -> Writer<StringBuffer> {
Writer<StringBuffer> writer(target);
writer.StartObject();
writer.Key("a");
writer.Int(1);
return std::move(writer);
};

Writer<StringBuffer> writer(writerGen(buffer));
writer.EndObject();
EXPECT_TRUE(writer.IsComplete());
EXPECT_STREQ("{\"a\":1}", buffer.GetString());
}
#endif

#ifdef __clang__
RAPIDJSON_DIAG_POP
#endif

0 comments on commit 185a7cc

Please sign in to comment.