Commit 799fdea9 authored by KaitoHH's avatar KaitoHH

add cursor wrapper

parent 143641c7
// Tencent is pleased to support the open source community by making RapidJSON available.
//
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
#ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_
#define RAPIDJSON_CURSORSTREAMWRAPPER_H_
#include "stream.h"
RAPIDJSON_NAMESPACE_BEGIN
//! Cursor stream wrapper for counting line and column number if error exists.
/*!
\tparam InputStream Any stream that implements Stream Concept
*/
template <typename InputStream, typename Encoding = UTF8<> >
class CursorStreamWrapper : public GenericStreamWrapper<InputStream, Encoding> {
public:
typedef typename Encoding::Ch Ch;
CursorStreamWrapper(InputStream& is):
GenericStreamWrapper<InputStream, Encoding>(is), line_(1), col_(0) {}
// counting line and column number
Ch Take() {
Ch ch = this->is_.Take();
if(ch == '\n') {
line_ ++;
col_ = 0;
} else {
col_ ++;
}
return ch;
}
//! Get the error line number, if error exists.
size_t GetLine() const { return line_; }
//! Get the error column number, if error exists.
size_t GetColumn() const { return col_; }
private:
size_t line_; //!< Current Line
size_t col_; //!< Current Column
};
RAPIDJSON_NAMESPACE_END
#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_
...@@ -2219,17 +2219,14 @@ public: ...@@ -2219,17 +2219,14 @@ public:
\return The document itself for fluent API. \return The document itself for fluent API.
*/ */
template <unsigned parseFlags, typename SourceEncoding, typename InputStream> template <unsigned parseFlags, typename SourceEncoding, typename InputStream>
GenericDocument& ParseStream(InputStream& is_) { GenericDocument& ParseStream(InputStream& is) {
GenericReader<SourceEncoding, Encoding, StackAllocator> reader( GenericReader<SourceEncoding, Encoding, StackAllocator> reader(
stack_.HasAllocator() ? &stack_.GetAllocator() : 0); stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
ClearStackOnExit scope(*this); ClearStackOnExit scope(*this);
GenericStreamWrapper<InputStream, SourceEncoding> is(is_);
parseResult_ = reader.template Parse<parseFlags>(is, *this); parseResult_ = reader.template Parse<parseFlags>(is, *this);
if (parseResult_) { if (parseResult_) {
RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document
} else {
parseResult_.SetPos(is.line_, is.col_);
} }
return *this; return *this;
} }
...@@ -2358,12 +2355,6 @@ public: ...@@ -2358,12 +2355,6 @@ public:
//! Get the position of last parsing error in input, 0 otherwise. //! Get the position of last parsing error in input, 0 otherwise.
size_t GetErrorOffset() const { return parseResult_.Offset(); } size_t GetErrorOffset() const { return parseResult_.Offset(); }
//! Get the position of last parsing error in input, 0 otherwise.
size_t GetErrorLine() const { return parseResult_.Line(); }
//! Get the position of last parsing error in input, 0 otherwise.
size_t GetErrorColumn() const { return parseResult_.Col(); }
//! Implicit conversion to get the last parse result //! Implicit conversion to get the last parse result
#ifndef __clang // -Wdocumentation #ifndef __clang // -Wdocumentation
......
...@@ -108,18 +108,14 @@ struct ParseResult { ...@@ -108,18 +108,14 @@ struct ParseResult {
typedef bool (ParseResult::*BooleanType)() const; typedef bool (ParseResult::*BooleanType)() const;
public: public:
//! Default constructor, no error. //! Default constructor, no error.
ParseResult() : code_(kParseErrorNone), offset_(0), line_(0), col_(0) {} ParseResult() : code_(kParseErrorNone), offset_(0) {}
//! Constructor to set an error. //! Constructor to set an error.
ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset), line_(0), col_(0) {} ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {}
//! Get the error code. //! Get the error code.
ParseErrorCode Code() const { return code_; } ParseErrorCode Code() const { return code_; }
//! Get the error offset, if \ref IsError(), 0 otherwise. //! Get the error offset, if \ref IsError(), 0 otherwise.
size_t Offset() const { return offset_; } size_t Offset() const { return offset_; }
//! Get the position of line number if error exists.
size_t Line() const { return line_; }
//! Get the position of column number if error exists.
size_t Col() const { return col_; }
//! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError().
operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; }
...@@ -138,14 +134,10 @@ public: ...@@ -138,14 +134,10 @@ public:
void Clear() { Set(kParseErrorNone); } void Clear() { Set(kParseErrorNone); }
//! Update error code and offset. //! Update error code and offset.
void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; }
//! Update line number and column number of the error position
void SetPos(size_t line, size_t col) { line_ = line; col_ = col; }
private: private:
ParseErrorCode code_; ParseErrorCode code_;
size_t offset_; size_t offset_;
size_t line_;
size_t col_;
}; };
//! Function pointer type of GetParseError(). //! Function pointer type of GetParseError().
......
...@@ -104,40 +104,28 @@ inline void PutN(Stream& stream, Ch c, size_t n) { ...@@ -104,40 +104,28 @@ inline void PutN(Stream& stream, Ch c, size_t n) {
// GenericStreamWrapper // GenericStreamWrapper
//! A Stream Wrapper //! A Stream Wrapper
/*! \tThis string stream is designed for counting line and column number /*! \tThis string stream is a wrapper for any stream by just forwarding any
\tof the error (if exists) position, while just forwarding any received \treceived message to the origin stream.
\tmessage to the origin stream.
\note implements Stream concept \note implements Stream concept
*/ */
#if defined(_MSC_VER) && _MSC_VER <= 1700 #if defined(_MSC_VER) && _MSC_VER <= 1800
RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(4702) // disable unreachable code RAPIDJSON_DIAG_OFF(4702) // unreachable code
RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated
#endif #endif
template <typename InputStream, typename Encoding> template <typename InputStream, typename Encoding = UTF8<> >
class GenericStreamWrapper { class GenericStreamWrapper {
public: public:
typedef typename Encoding::Ch Ch; typedef typename Encoding::Ch Ch;
size_t line_; size_t line_;
size_t col_; size_t col_;
GenericStreamWrapper(InputStream& is): line_(1), col_(0), is_(is) {} GenericStreamWrapper(InputStream& is): is_(is) {}
Ch Peek() const { return is_.Peek(); } Ch Peek() const { return is_.Peek(); }
Ch Take() { return is_.Take(); }
// counting line and column number
Ch Take() {
Ch ch = is_.Take();
if(ch == '\n') {
line_ ++;
col_ = 0;
} else {
col_ ++;
}
return ch;
}
size_t Tell() { return is_.Tell(); } size_t Tell() { return is_.Tell(); }
Ch* PutBegin() { return is_.PutBegin(); } Ch* PutBegin() { return is_.PutBegin(); }
void Put(Ch ch) { is_.Put(ch); } void Put(Ch ch) { is_.Put(ch); }
void Flush() { is_.Flush(); } void Flush() { is_.Flush(); }
...@@ -150,16 +138,11 @@ public: ...@@ -150,16 +138,11 @@ public:
UTFType GetType() const { return is_.GetType(); } UTFType GetType() const { return is_.GetType(); }
bool HasBOM() const { return is_.HasBOM(); } bool HasBOM() const { return is_.HasBOM(); }
private: protected:
InputStream& is_; InputStream& is_;
// elimante vs2010-2013 C4512 warning by
// prohibiting copy constructor & assignment operator.
GenericStreamWrapper& operator=(const GenericStreamWrapper &);
GenericStreamWrapper(const GenericStreamWrapper&);
}; };
#if defined(_MSC_VER) && _MSC_VER <= 1700 #if defined(_MSC_VER) && _MSC_VER <= 1800
RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_POP
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment