From 7890a1b17a1bb149830501c25f19f8de5645c38a Mon Sep 17 00:00:00 2001 From: "Philipp A. Hartmann" Date: Wed, 2 Jul 2014 21:26:44 +0200 Subject: [PATCH] StreamLocalCopy: move to reader.h Eventually move to internal header `internal/streamcopy.h`? Based on 088e8173. --- include/rapidjson/rapidjson.h | 25 -------------------- include/rapidjson/reader.h | 43 ++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/include/rapidjson/rapidjson.h b/include/rapidjson/rapidjson.h index c0175e17..a6d5c06c 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 d14a5776..76fed8d5 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