diff --git a/include/rapidjson/rapidjson.h b/include/rapidjson/rapidjson.h index c0175e1..a6d5c06 100644 --- a/include/rapidjson/rapidjson.h +++ b/include/rapidjson/rapidjson.h @@ -209,31 +209,6 @@ struct StreamTraits { enum { copyOptimization = 0 }; }; -template::copyOptimization> -class StreamLocalCopy; - -template -class StreamLocalCopy { -public: - StreamLocalCopy(Stream& original) : s(original), original_(original) {} - ~StreamLocalCopy() { original_ = s; } - - Stream s; //!< copy -private: - StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; - Stream& original_; -}; - -template -class StreamLocalCopy { -public: - StreamLocalCopy(Stream& original) : s(original) {} - - Stream& s; //!< reference -private: - StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; -}; - //! Put N copies of a character to a stream. template inline void PutN(Stream& stream, Ch c, size_t n) { diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index d14a577..76fed8d 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -126,6 +126,43 @@ struct BaseReaderHandler { void EndArray(SizeType) { Default(); } }; +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimziation. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + /////////////////////////////////////////////////////////////////////////////// // SkipWhitespace @@ -135,7 +172,7 @@ struct BaseReaderHandler { */ template void SkipWhitespace(InputStream& is) { - StreamLocalCopy copy(is); + internal::StreamLocalCopy copy(is); InputStream& s(copy.s); while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') @@ -450,7 +487,7 @@ private: // Parse string and generate String event. Different code paths for kParseInsituFlag. template void ParseString(InputStream& is, Handler& handler) { - StreamLocalCopy copy(is); + internal::StreamLocalCopy copy(is); InputStream& s(copy.s); if (parseFlags & kParseInsituFlag) { @@ -531,7 +568,7 @@ private: template void ParseNumber(InputStream& is, Handler& handler) { - StreamLocalCopy copy(is); + internal::StreamLocalCopy copy(is); InputStream& s(copy.s); // Parse minus