Merge remote-tracking branch 'origin/master' into issue120floatprecision
This commit is contained in:
commit
92554b52a2
@ -7,6 +7,7 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
using namespace rapidjson;
|
using namespace rapidjson;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
int main(int, char*[]) {
|
int main(int, char*[]) {
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1896,9 +1896,26 @@ template <typename SourceAllocator>
|
|||||||
inline
|
inline
|
||||||
GenericValue<Encoding,Allocator>::GenericValue(const GenericValue<Encoding,SourceAllocator>& rhs, Allocator& allocator)
|
GenericValue<Encoding,Allocator>::GenericValue(const GenericValue<Encoding,SourceAllocator>& rhs, Allocator& allocator)
|
||||||
{
|
{
|
||||||
GenericDocument<Encoding,Allocator> d(&allocator);
|
switch (rhs.GetType()) {
|
||||||
rhs.Accept(d);
|
case kObjectType:
|
||||||
RawAssign(*d.stack_.template Pop<GenericValue>(1));
|
case kArrayType: { // perform deep copy via SAX Handler
|
||||||
|
GenericDocument<Encoding,Allocator> d(&allocator);
|
||||||
|
rhs.Accept(d);
|
||||||
|
RawAssign(*d.stack_.template Pop<GenericValue>(1));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case kStringType:
|
||||||
|
if (rhs.flags_ == kConstStringFlag) {
|
||||||
|
flags_ = rhs.flags_;
|
||||||
|
data_ = *reinterpret_cast<const Data*>(&rhs.data_);
|
||||||
|
} else {
|
||||||
|
SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: // kNumberType, kTrueType, kFalseType, kNullType
|
||||||
|
flags_ = rhs.flags_;
|
||||||
|
data_ = *reinterpret_cast<const Data*>(&rhs.data_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RAPIDJSON_NAMESPACE_END
|
RAPIDJSON_NAMESPACE_END
|
||||||
|
@ -40,7 +40,7 @@ public:
|
|||||||
\param buffer user-supplied buffer.
|
\param buffer user-supplied buffer.
|
||||||
\param bufferSize size of buffer in bytes. Must >=4 bytes.
|
\param bufferSize size of buffer in bytes. Must >=4 bytes.
|
||||||
*/
|
*/
|
||||||
FileReadStream(FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) {
|
FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) {
|
||||||
RAPIDJSON_ASSERT(fp_ != 0);
|
RAPIDJSON_ASSERT(fp_ != 0);
|
||||||
RAPIDJSON_ASSERT(bufferSize >= 4);
|
RAPIDJSON_ASSERT(bufferSize >= 4);
|
||||||
Read();
|
Read();
|
||||||
@ -79,7 +79,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* fp_;
|
std::FILE* fp_;
|
||||||
Ch *buffer_;
|
Ch *buffer_;
|
||||||
size_t bufferSize_;
|
size_t bufferSize_;
|
||||||
Ch *bufferLast_;
|
Ch *bufferLast_;
|
||||||
|
@ -36,7 +36,7 @@ class FileStream {
|
|||||||
public:
|
public:
|
||||||
typedef char Ch; //!< Character type. Only support char.
|
typedef char Ch; //!< Character type. Only support char.
|
||||||
|
|
||||||
FileStream(FILE* fp) : fp_(fp), current_('\0'), count_(0) { Read(); }
|
FileStream(std::FILE* fp) : fp_(fp), current_('\0'), count_(0) { Read(); }
|
||||||
char Peek() const { return current_; }
|
char Peek() const { return current_; }
|
||||||
char Take() { char c = current_; Read(); return c; }
|
char Take() { char c = current_; Read(); return c; }
|
||||||
size_t Tell() const { return count_; }
|
size_t Tell() const { return count_; }
|
||||||
@ -63,7 +63,7 @@ private:
|
|||||||
current_ = '\0';
|
current_ = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* fp_;
|
std::FILE* fp_;
|
||||||
char current_;
|
char current_;
|
||||||
size_t count_;
|
size_t count_;
|
||||||
};
|
};
|
||||||
|
@ -34,7 +34,7 @@ class FileWriteStream {
|
|||||||
public:
|
public:
|
||||||
typedef char Ch; //!< Character type. Only support char.
|
typedef char Ch; //!< Character type. Only support char.
|
||||||
|
|
||||||
FileWriteStream(FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) {
|
FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) {
|
||||||
RAPIDJSON_ASSERT(fp_ != 0);
|
RAPIDJSON_ASSERT(fp_ != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ private:
|
|||||||
FileWriteStream(const FileWriteStream&);
|
FileWriteStream(const FileWriteStream&);
|
||||||
FileWriteStream& operator=(const FileWriteStream&);
|
FileWriteStream& operator=(const FileWriteStream&);
|
||||||
|
|
||||||
FILE* fp_;
|
std::FILE* fp_;
|
||||||
char *buffer_;
|
char *buffer_;
|
||||||
char *bufferEnd_;
|
char *bufferEnd_;
|
||||||
char *current_;
|
char *current_;
|
||||||
|
@ -25,48 +25,48 @@
|
|||||||
using namespace rapidjson;
|
using namespace rapidjson;
|
||||||
|
|
||||||
TEST(StringBuffer, InitialSize) {
|
TEST(StringBuffer, InitialSize) {
|
||||||
StringBuffer buffer;
|
StringBuffer buffer;
|
||||||
EXPECT_EQ(0u, buffer.GetSize());
|
EXPECT_EQ(0u, buffer.GetSize());
|
||||||
EXPECT_STREQ("", buffer.GetString());
|
EXPECT_STREQ("", buffer.GetString());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StringBuffer, Put) {
|
TEST(StringBuffer, Put) {
|
||||||
StringBuffer buffer;
|
StringBuffer buffer;
|
||||||
buffer.Put('A');
|
buffer.Put('A');
|
||||||
|
|
||||||
EXPECT_EQ(1u, buffer.GetSize());
|
EXPECT_EQ(1u, buffer.GetSize());
|
||||||
EXPECT_STREQ("A", buffer.GetString());
|
EXPECT_STREQ("A", buffer.GetString());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StringBuffer, Clear) {
|
TEST(StringBuffer, Clear) {
|
||||||
StringBuffer buffer;
|
StringBuffer buffer;
|
||||||
buffer.Put('A');
|
buffer.Put('A');
|
||||||
buffer.Put('B');
|
buffer.Put('B');
|
||||||
buffer.Put('C');
|
buffer.Put('C');
|
||||||
buffer.Clear();
|
buffer.Clear();
|
||||||
|
|
||||||
EXPECT_EQ(0u, buffer.GetSize());
|
EXPECT_EQ(0u, buffer.GetSize());
|
||||||
EXPECT_STREQ("", buffer.GetString());
|
EXPECT_STREQ("", buffer.GetString());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StringBuffer, Push) {
|
TEST(StringBuffer, Push) {
|
||||||
StringBuffer buffer;
|
StringBuffer buffer;
|
||||||
buffer.Push(5);
|
buffer.Push(5);
|
||||||
|
|
||||||
EXPECT_EQ(5u, buffer.GetSize());
|
EXPECT_EQ(5u, buffer.GetSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StringBuffer, Pop) {
|
TEST(StringBuffer, Pop) {
|
||||||
StringBuffer buffer;
|
StringBuffer buffer;
|
||||||
buffer.Put('A');
|
buffer.Put('A');
|
||||||
buffer.Put('B');
|
buffer.Put('B');
|
||||||
buffer.Put('C');
|
buffer.Put('C');
|
||||||
buffer.Put('D');
|
buffer.Put('D');
|
||||||
buffer.Put('E');
|
buffer.Put('E');
|
||||||
buffer.Pop(3);
|
buffer.Pop(3);
|
||||||
|
|
||||||
EXPECT_EQ(2u, buffer.GetSize());
|
EXPECT_EQ(2u, buffer.GetSize());
|
||||||
EXPECT_STREQ("AB", buffer.GetString());
|
EXPECT_STREQ("AB", buffer.GetString());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
||||||
@ -74,67 +74,73 @@ TEST(StringBuffer, Pop) {
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
TEST(StringBuffer, Traits) {
|
TEST(StringBuffer, Traits) {
|
||||||
static_assert( std::is_constructible<StringBuffer>::value, "");
|
static_assert( std::is_constructible<StringBuffer>::value, "");
|
||||||
static_assert( std::is_default_constructible<StringBuffer>::value, "");
|
static_assert( std::is_default_constructible<StringBuffer>::value, "");
|
||||||
static_assert(!std::is_copy_constructible<StringBuffer>::value, "");
|
#ifndef _MSC_VER
|
||||||
static_assert( std::is_move_constructible<StringBuffer>::value, "");
|
static_assert(!std::is_copy_constructible<StringBuffer>::value, "");
|
||||||
|
#endif
|
||||||
|
static_assert( std::is_move_constructible<StringBuffer>::value, "");
|
||||||
|
|
||||||
static_assert(!std::is_nothrow_constructible<StringBuffer>::value, "");
|
static_assert(!std::is_nothrow_constructible<StringBuffer>::value, "");
|
||||||
static_assert(!std::is_nothrow_default_constructible<StringBuffer>::value, "");
|
static_assert(!std::is_nothrow_default_constructible<StringBuffer>::value, "");
|
||||||
static_assert(!std::is_nothrow_copy_constructible<StringBuffer>::value, "");
|
static_assert(!std::is_nothrow_copy_constructible<StringBuffer>::value, "");
|
||||||
static_assert(!std::is_nothrow_move_constructible<StringBuffer>::value, "");
|
static_assert(!std::is_nothrow_move_constructible<StringBuffer>::value, "");
|
||||||
|
|
||||||
static_assert( std::is_assignable<StringBuffer,StringBuffer>::value, "");
|
static_assert( std::is_assignable<StringBuffer,StringBuffer>::value, "");
|
||||||
static_assert(!std::is_copy_assignable<StringBuffer>::value, "");
|
#ifndef _MSC_VER
|
||||||
static_assert( std::is_move_assignable<StringBuffer>::value, "");
|
static_assert(!std::is_copy_assignable<StringBuffer>::value, "");
|
||||||
|
#endif
|
||||||
|
static_assert( std::is_move_assignable<StringBuffer>::value, "");
|
||||||
|
|
||||||
static_assert(!std::is_nothrow_assignable<StringBuffer,StringBuffer>::value, "");
|
static_assert(!std::is_nothrow_assignable<StringBuffer,StringBuffer>::value, "");
|
||||||
static_assert(!std::is_nothrow_copy_assignable<StringBuffer>::value, "");
|
static_assert(!std::is_nothrow_copy_assignable<StringBuffer>::value, "");
|
||||||
static_assert(!std::is_nothrow_move_assignable<StringBuffer>::value, "");
|
static_assert(!std::is_nothrow_move_assignable<StringBuffer>::value, "");
|
||||||
|
|
||||||
static_assert( std::is_destructible<StringBuffer>::value, "");
|
static_assert( std::is_destructible<StringBuffer>::value, "");
|
||||||
static_assert( std::is_nothrow_destructible<StringBuffer>::value, "");
|
#ifndef _MSC_VER
|
||||||
|
static_assert(std::is_nothrow_destructible<StringBuffer>::value, "");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StringBuffer, MoveConstructor) {
|
TEST(StringBuffer, MoveConstructor) {
|
||||||
StringBuffer x;
|
StringBuffer x;
|
||||||
x.Put('A');
|
x.Put('A');
|
||||||
x.Put('B');
|
x.Put('B');
|
||||||
x.Put('C');
|
x.Put('C');
|
||||||
x.Put('D');
|
x.Put('D');
|
||||||
|
|
||||||
EXPECT_EQ(4u, x.GetSize());
|
EXPECT_EQ(4u, x.GetSize());
|
||||||
EXPECT_STREQ("ABCD", x.GetString());
|
EXPECT_STREQ("ABCD", x.GetString());
|
||||||
|
|
||||||
// StringBuffer y(x); // does not compile (!is_copy_constructible)
|
// StringBuffer y(x); // does not compile (!is_copy_constructible)
|
||||||
StringBuffer y(std::move(x));
|
StringBuffer y(std::move(x));
|
||||||
EXPECT_EQ(0u, x.GetSize());
|
EXPECT_EQ(0u, x.GetSize());
|
||||||
EXPECT_EQ(4u, y.GetSize());
|
EXPECT_EQ(4u, y.GetSize());
|
||||||
EXPECT_STREQ("ABCD", y.GetString());
|
EXPECT_STREQ("ABCD", y.GetString());
|
||||||
|
|
||||||
// StringBuffer z = y; // does not compile (!is_copy_assignable)
|
// StringBuffer z = y; // does not compile (!is_copy_assignable)
|
||||||
StringBuffer z = std::move(y);
|
StringBuffer z = std::move(y);
|
||||||
EXPECT_EQ(0u, y.GetSize());
|
EXPECT_EQ(0u, y.GetSize());
|
||||||
EXPECT_EQ(4u, z.GetSize());
|
EXPECT_EQ(4u, z.GetSize());
|
||||||
EXPECT_STREQ("ABCD", z.GetString());
|
EXPECT_STREQ("ABCD", z.GetString());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StringBuffer, MoveAssignment) {
|
TEST(StringBuffer, MoveAssignment) {
|
||||||
StringBuffer x;
|
StringBuffer x;
|
||||||
x.Put('A');
|
x.Put('A');
|
||||||
x.Put('B');
|
x.Put('B');
|
||||||
x.Put('C');
|
x.Put('C');
|
||||||
x.Put('D');
|
x.Put('D');
|
||||||
|
|
||||||
EXPECT_EQ(4u, x.GetSize());
|
EXPECT_EQ(4u, x.GetSize());
|
||||||
EXPECT_STREQ("ABCD", x.GetString());
|
EXPECT_STREQ("ABCD", x.GetString());
|
||||||
|
|
||||||
StringBuffer y;
|
StringBuffer y;
|
||||||
// y = x; // does not compile (!is_copy_assignable)
|
// y = x; // does not compile (!is_copy_assignable)
|
||||||
y = std::move(x);
|
y = std::move(x);
|
||||||
EXPECT_EQ(0u, x.GetSize());
|
EXPECT_EQ(0u, x.GetSize());
|
||||||
EXPECT_EQ(4u, y.GetSize());
|
EXPECT_EQ(4u, y.GetSize());
|
||||||
EXPECT_STREQ("ABCD", y.GetString());
|
EXPECT_STREQ("ABCD", y.GetString());
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user