All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Classes | Public Types | Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator > Class Template Reference

SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator. More...

#include <reader.h>

Classes

struct  ClearStackOnExit
 
class  StackStream
 

Public Types

typedef SourceEncoding::Ch Ch
 SourceEncoding character type. More...
 

Public Member Functions

 GenericReader (StackAllocator *stackAllocator=0, size_t stackCapacity=kDefaultStackCapacity)
 Constructor. More...
 
template<unsigned parseFlags, typename InputStream , typename Handler >
ParseResult Parse (InputStream &is, Handler &handler)
 Parse JSON text. More...
 
template<typename InputStream , typename Handler >
ParseResult Parse (InputStream &is, Handler &handler)
 Parse JSON text (with kParseDefaultFlags) More...
 
bool HasParseError () const
 Whether a parse error has occured in the last parsing. More...
 
ParseErrorCode GetParseErrorCode () const
 Get the ParseErrorCode of last parsing. More...
 
size_t GetErrorOffset () const
 Get the position of last parsing error in input, 0 otherwise. More...
 

Protected Member Functions

void SetParseError (ParseErrorCode code, size_t offset)
 

Private Types

enum  IterativeParsingState {
  IterativeParsingStartState = 0, IterativeParsingFinishState, IterativeParsingErrorState, IterativeParsingObjectInitialState,
  IterativeParsingMemberKeyState, IterativeParsingKeyValueDelimiterState, IterativeParsingMemberValueState, IterativeParsingMemberDelimiterState,
  IterativeParsingObjectFinishState, IterativeParsingArrayInitialState, IterativeParsingElementState, IterativeParsingElementDelimiterState,
  IterativeParsingArrayFinishState, IterativeParsingValueState, cIterativeParsingStateCount
}
 
enum  Token {
  LeftBracketToken = 0, RightBracketToken, LeftCurlyBracketToken, RightCurlyBracketToken,
  CommaToken, ColonToken, StringToken, FalseToken,
  TrueToken, NullToken, NumberToken, kTokenCount
}
 

Private Member Functions

 GenericReader (const GenericReader &)
 
GenericReaderoperator= (const GenericReader &)
 
void ClearStack ()
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseObject (InputStream &is, Handler &handler)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseArray (InputStream &is, Handler &handler)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseNull (InputStream &is, Handler &handler)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseTrue (InputStream &is, Handler &handler)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseFalse (InputStream &is, Handler &handler)
 
template<typename InputStream >
unsigned ParseHex4 (InputStream &is)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseString (InputStream &is, Handler &handler, bool isKey=false)
 
template<unsigned parseFlags, typename SEncoding , typename TEncoding , typename InputStream , typename OutputStream >
RAPIDJSON_FORCEINLINE void ParseStringToStream (InputStream &is, OutputStream &os)
 
double StrtodFastPath (double significand, int exp)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseNumber (InputStream &is, Handler &handler)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
void ParseValue (InputStream &is, Handler &handler)
 
RAPIDJSON_FORCEINLINE Token Tokenize (Ch c)
 
RAPIDJSON_FORCEINLINE IterativeParsingState Predict (IterativeParsingState state, Token token)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
RAPIDJSON_FORCEINLINE IterativeParsingState Transit (IterativeParsingState src, Token token, IterativeParsingState dst, InputStream &is, Handler &handler)
 
template<typename InputStream >
void HandleError (IterativeParsingState src, InputStream &is)
 
template<unsigned parseFlags, typename InputStream , typename Handler >
ParseResult IterativeParse (InputStream &is, Handler &handler)
 

Private Attributes

internal::Stack< StackAllocator > stack_
 A stack for storing decoded string temporarily during non-destructive parsing. More...
 
ParseResult parseResult_
 

Static Private Attributes

static const size_t kDefaultStackCapacity = 256
 Default stack capacity in bytes for storing a single decoded string. More...
 

Detailed Description

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
class rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >

SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.

GenericReader parses JSON text from a stream, and send events synchronously to an object implementing Handler concept.

It needs to allocate a stack for storing a single decoded string during non-destructive parsing.

For in-situ parsing, the decoded string is directly written to the source text string, no temporary buffer is required.

A GenericReader object can be reused for parsing multiple JSON text.

Template Parameters
SourceEncodingEncoding of the input stream.
TargetEncodingEncoding of the parse output.
StackAllocatorAllocator type for stack.

Definition at line 363 of file reader.h.

Member Typedef Documentation

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
typedef SourceEncoding::Ch rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::Ch

SourceEncoding character type.

Definition at line 365 of file reader.h.

Member Enumeration Documentation

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
enum rapidjson::GenericReader::IterativeParsingState
private
Enumerator
IterativeParsingStartState 
IterativeParsingFinishState 
IterativeParsingErrorState 
IterativeParsingObjectInitialState 
IterativeParsingMemberKeyState 
IterativeParsingKeyValueDelimiterState 
IterativeParsingMemberValueState 
IterativeParsingMemberDelimiterState 
IterativeParsingObjectFinishState 
IterativeParsingArrayInitialState 
IterativeParsingElementState 
IterativeParsingElementDelimiterState 
IterativeParsingArrayFinishState 
IterativeParsingValueState 
cIterativeParsingStateCount 

Definition at line 923 of file reader.h.

923  {
927 
928  // Object states
935 
936  // Array states
941 
942  // Single value state
944 
946  };
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
enum rapidjson::GenericReader::Token
private
Enumerator
LeftBracketToken 
RightBracketToken 
LeftCurlyBracketToken 
RightCurlyBracketToken 
CommaToken 
ColonToken 
StringToken 
FalseToken 
TrueToken 
NullToken 
NumberToken 
kTokenCount 

Definition at line 949 of file reader.h.

Constructor & Destructor Documentation

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::GenericReader ( StackAllocator *  stackAllocator = 0,
size_t  stackCapacity = kDefaultStackCapacity 
)
inline

Constructor.

Parameters
allocatorOptional allocator for allocating stack memory. (Only use for non-destructive parsing)
stackCapacitystack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing)

Definition at line 371 of file reader.h.

371 : stack_(stackAllocator, stackCapacity), parseResult_() {}
ParseResult parseResult_
Definition: reader.h:1357
internal::Stack< StackAllocator > stack_
A stack for storing decoded string temporarily during non-destructive parsing.
Definition: reader.h:1356
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::GenericReader ( const GenericReader< SourceEncoding, TargetEncoding, StackAllocator > &  )
private

Member Function Documentation

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ClearStack ( )
inlineprivate

Definition at line 442 of file reader.h.

442 { stack_.Clear(); }
internal::Stack< StackAllocator > stack_
A stack for storing decoded string temporarily during non-destructive parsing.
Definition: reader.h:1356
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
size_t rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::GetErrorOffset ( ) const
inline

Get the position of last parsing error in input, 0 otherwise.

Definition at line 432 of file reader.h.

432 { return parseResult_.Offset(); }
size_t Offset() const
Get the error offset, if IsError(), 0 otherwise.
Definition: error.h:115
ParseResult parseResult_
Definition: reader.h:1357
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
ParseErrorCode rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::GetParseErrorCode ( ) const
inline

Get the ParseErrorCode of last parsing.

Definition at line 429 of file reader.h.

429 { return parseResult_.Code(); }
ParseErrorCode Code() const
Get the error code.
Definition: error.h:113
ParseResult parseResult_
Definition: reader.h:1357
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<typename InputStream >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::HandleError ( IterativeParsingState  src,
InputStream &  is 
)
inlineprivate

Definition at line 1304 of file reader.h.

1304  {
1305  if (HasParseError()) {
1306  // Error flag has been set.
1307  return;
1308  }
1309 
1310  switch (src) {
1319  }
1320  }
Missing a name for object member.
Definition: error.h:71
Missing a comma or &#39;]&#39; after an array element.
Definition: error.h:75
The document is empty.
Definition: error.h:66
Missing a colon after a name of object member.
Definition: error.h:72
Missing a comma or &#39;}&#39; after an object member.
Definition: error.h:73
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: reader.h:426
Unspecific syntax error.
Definition: error.h:88
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
The document root must not follow by other values.
Definition: error.h:67
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
bool rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::HasParseError ( ) const
inline

Whether a parse error has occured in the last parsing.

Definition at line 426 of file reader.h.

426 { return parseResult_.IsError(); }
ParseResult parseResult_
Definition: reader.h:1357
bool IsError() const
Whether the result is an error.
Definition: error.h:120
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
ParseResult rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::IterativeParse ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 1323 of file reader.h.

1323  {
1324  parseResult_.Clear();
1325  ClearStackOnExit scope(*this);
1327 
1328  SkipWhitespace(is);
1329  while (is.Peek() != '\0') {
1330  Token t = Tokenize(is.Peek());
1331  IterativeParsingState n = Predict(state, t);
1332  IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1333 
1334  if (d == IterativeParsingErrorState) {
1335  HandleError(state, is);
1336  break;
1337  }
1338 
1339  state = d;
1340 
1341  // Do not further consume streams if a root JSON has been parsed.
1342  if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState)
1343  break;
1344 
1345  SkipWhitespace(is);
1346  }
1347 
1348  // Handle the end of file.
1349  if (state != IterativeParsingFinishState)
1350  HandleError(state, is);
1351 
1352  return parseResult_;
1353  }
RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token)
Definition: reader.h:995
ParseResult parseResult_
Definition: reader.h:1357
After parsing a complete JSON root from stream, stop further processing the rest of stream...
Definition: reader.h:132
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:236
RAPIDJSON_FORCEINLINE Token Tokenize(Ch c)
Definition: reader.h:968
void Clear()
Reset error code.
Definition: error.h:127
void HandleError(IterativeParsingState src, InputStream &is)
Definition: reader.h:1304
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
GenericReader& rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::operator= ( const GenericReader< SourceEncoding, TargetEncoding, StackAllocator > &  )
private
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
ParseResult rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::Parse ( InputStream &  is,
Handler handler 
)
inline

Parse JSON text.

Template Parameters
parseFlagsCombination of ParseFlag.
InputStreamType of input stream, implementing Stream concept.
HandlerType of handler, implementing Handler concept.
Parameters
isInput stream to be parsed.
handlerThe handler to receive events.
Returns
Whether the parsing is successful.

Definition at line 382 of file reader.h.

382  {
383  if (parseFlags & kParseIterativeFlag)
384  return IterativeParse<parseFlags>(is, handler);
385 
387 
388  ClearStackOnExit scope(*this);
389 
390  SkipWhitespace(is);
391 
392  if (is.Peek() == '\0') {
394  RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
395  }
396  else {
397  ParseValue<parseFlags>(is, handler);
398  RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
399 
400  if (!(parseFlags & kParseStopWhenDoneFlag)) {
401  SkipWhitespace(is);
402 
403  if (is.Peek() != '\0') {
405  RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
406  }
407  }
408  }
409 
410  return parseResult_;
411  }
Iterative(constant complexity in terms of function call stack size) parsing.
Definition: reader.h:131
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
Definition: reader.h:91
ParseResult parseResult_
Definition: reader.h:1357
The document is empty.
Definition: error.h:66
After parsing a complete JSON root from stream, stop further processing the rest of stream...
Definition: reader.h:132
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:236
void Clear()
Reset error code.
Definition: error.h:127
The document root must not follow by other values.
Definition: error.h:67
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<typename InputStream , typename Handler >
ParseResult rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::Parse ( InputStream &  is,
Handler handler 
)
inline

Parse JSON text (with kParseDefaultFlags)

Template Parameters
InputStreamType of input stream, implementing Stream concept
HandlerType of handler, implementing Handler concept.
Parameters
isInput stream to be parsed.
handlerThe handler to receive events.
Returns
Whether the parsing is successful.

Definition at line 421 of file reader.h.

421  {
422  return Parse<kParseDefaultFlags>(is, handler);
423  }
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseArray ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 507 of file reader.h.

507  {
508  RAPIDJSON_ASSERT(is.Peek() == '[');
509  is.Take(); // Skip '['
510 
511  if (!handler.StartArray())
513 
514  SkipWhitespace(is);
515 
516  if (is.Peek() == ']') {
517  is.Take();
518  if (!handler.EndArray(0)) // empty array
520  return;
521  }
522 
523  for (SizeType elementCount = 0;;) {
524  ParseValue<parseFlags>(is, handler);
525  RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
526 
527  ++elementCount;
528  SkipWhitespace(is);
529 
530  switch (is.Take()) {
531  case ',': SkipWhitespace(is); break;
532  case ']':
533  if (!handler.EndArray(elementCount))
535  else
536  return;
538  }
539  }
540  }
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
Missing a comma or &#39;]&#39; after an array element.
Definition: error.h:75
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:247
Parsing was terminated.
Definition: error.h:87
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:236
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseFalse ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 569 of file reader.h.

569  {
570  RAPIDJSON_ASSERT(is.Peek() == 'f');
571  is.Take();
572 
573  if (is.Take() == 'a' && is.Take() == 'l' && is.Take() == 's' && is.Take() == 'e') {
574  if (!handler.Bool(false))
576  }
577  else
579  }
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
Parsing was terminated.
Definition: error.h:87
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<typename InputStream >
unsigned rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseHex4 ( InputStream &  is)
inlineprivate

Definition at line 583 of file reader.h.

583  {
584  unsigned codepoint = 0;
585  for (int i = 0; i < 4; i++) {
586  Ch c = is.Take();
587  codepoint <<= 4;
588  codepoint += static_cast<unsigned>(c);
589  if (c >= '0' && c <= '9')
590  codepoint -= '0';
591  else if (c >= 'A' && c <= 'F')
592  codepoint -= 'A' - 10;
593  else if (c >= 'a' && c <= 'f')
594  codepoint -= 'a' - 10;
595  else {
597  RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
598  }
599  }
600  return codepoint;
601  }
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
Definition: reader.h:91
SourceEncoding::Ch Ch
SourceEncoding character type.
Definition: reader.h:365
Incorrect hex digit after \u escape in string.
Definition: error.h:77
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseNull ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 543 of file reader.h.

543  {
544  RAPIDJSON_ASSERT(is.Peek() == 'n');
545  is.Take();
546 
547  if (is.Take() == 'u' && is.Take() == 'l' && is.Take() == 'l') {
548  if (!handler.Null())
550  }
551  else
553  }
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
Parsing was terminated.
Definition: error.h:87
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseNumber ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 721 of file reader.h.

721  {
722  internal::StreamLocalCopy<InputStream> copy(is);
723  InputStream& s(copy.s);
724 
725  // Parse minus
726  bool minus = false;
727  if (s.Peek() == '-') {
728  minus = true;
729  s.Take();
730  }
731 
732  // Parse int: zero / ( digit1-9 *DIGIT )
733  unsigned i = 0;
734  uint64_t i64 = 0;
735  bool use64bit = false;
736  if (s.Peek() == '0') {
737  i = 0;
738  s.Take();
739  }
740  else if (s.Peek() >= '1' && s.Peek() <= '9') {
741  i = static_cast<unsigned>(s.Take() - '0');
742 
743  if (minus)
744  while (s.Peek() >= '0' && s.Peek() <= '9') {
745  if (i >= 214748364) { // 2^31 = 2147483648
746  if (i != 214748364 || s.Peek() > '8') {
747  i64 = i;
748  use64bit = true;
749  break;
750  }
751  }
752  i = i * 10 + static_cast<unsigned>(s.Take() - '0');
753  }
754  else
755  while (s.Peek() >= '0' && s.Peek() <= '9') {
756  if (i >= 429496729) { // 2^32 - 1 = 4294967295
757  if (i != 429496729 || s.Peek() > '5') {
758  i64 = i;
759  use64bit = true;
760  break;
761  }
762  }
763  i = i * 10 + static_cast<unsigned>(s.Take() - '0');
764  }
765  }
766  else
768 
769  // Parse 64bit int
770  double d = 0.0;
771  bool useDouble = false;
772  if (use64bit) {
773  if (minus)
774  while (s.Peek() >= '0' && s.Peek() <= '9') {
775  if (i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC)) // 2^63 = 9223372036854775808
776  if (i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8') {
777  d = (double)i64;
778  useDouble = true;
779  break;
780  }
781  i64 = i64 * 10 + static_cast<unsigned>(s.Take() - '0');
782  }
783  else
784  while (s.Peek() >= '0' && s.Peek() <= '9') {
785  if (i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999)) // 2^64 - 1 = 18446744073709551615
786  if (i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5') {
787  d = (double)i64;
788  useDouble = true;
789  break;
790  }
791  i64 = i64 * 10 + static_cast<unsigned>(s.Take() - '0');
792  }
793  }
794 
795  // Force double for big integer
796  if (useDouble) {
797  while (s.Peek() >= '0' && s.Peek() <= '9') {
798  if (d >= 1.7976931348623157e307) // DBL_MAX / 10.0
800  d = d * 10 + (s.Take() - '0');
801  }
802  }
803 
804  // Parse frac = decimal-point 1*DIGIT
805  int expFrac = 0;
806  if (s.Peek() == '.') {
807  s.Take();
808 
809 #if RAPIDJSON_64BIT
810  // Use i64 to store significand in 64-bit architecture
811  if (!useDouble) {
812  if (!use64bit)
813  i64 = i;
814 
815  while (s.Peek() >= '0' && s.Peek() <= '9') {
816  if (i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))
817  break;
818  else {
819  i64 = i64 * 10 + static_cast<unsigned>(s.Take() - '0');
820  --expFrac;
821  }
822  }
823 
824  d = (double)i64;
825  }
826 #else
827  // Use double to store significand in 32-bit architecture
828  if (!useDouble)
829  d = use64bit ? (double)i64 : (double)i;
830 #endif
831  useDouble = true;
832 
833  while (s.Peek() >= '0' && s.Peek() <= '9') {
834  d = d * 10 + (s.Take() - '0');
835  --expFrac;
836  }
837 
838  if (expFrac == 0)
840  }
841 
842  // Parse exp = e [ minus / plus ] 1*DIGIT
843  int exp = 0;
844  if (s.Peek() == 'e' || s.Peek() == 'E') {
845  if (!useDouble) {
846  d = use64bit ? (double)i64 : (double)i;
847  useDouble = true;
848  }
849  s.Take();
850 
851  bool expMinus = false;
852  if (s.Peek() == '+')
853  s.Take();
854  else if (s.Peek() == '-') {
855  s.Take();
856  expMinus = true;
857  }
858 
859  if (s.Peek() >= '0' && s.Peek() <= '9') {
860  exp = s.Take() - '0';
861  while (s.Peek() >= '0' && s.Peek() <= '9') {
862  exp = exp * 10 + (s.Take() - '0');
863  if (exp > 308 && !expMinus) // exp > 308 should be rare, so it should be checked first.
865  }
866  }
867  else
869 
870  if (expMinus)
871  exp = -exp;
872  }
873 
874  // Finish parsing, call event according to the type of number.
875  bool cont = true;
876  if (useDouble) {
877  int expSum = exp + expFrac;
878  if (expSum < -308) {
879  // Prevent expSum < -308, making Pow10(expSum) = 0
880  d = StrtodFastPath(d, exp);
881  d = StrtodFastPath(d, expFrac);
882  }
883  else
884  d = StrtodFastPath(d, expSum);
885 
886  cont = handler.Double(minus ? -d : d);
887  }
888  else {
889  if (use64bit) {
890  if (minus)
891  cont = handler.Int64(-(int64_t)i64);
892  else
893  cont = handler.Uint64(i64);
894  }
895  else {
896  if (minus)
897  cont = handler.Int(-(int)i);
898  else
899  cont = handler.Uint(i);
900  }
901  }
902  if (!cont)
904  }
Miss fraction part in number.
Definition: error.h:84
sqlite_int64 i64
Definition: tkeyvfs.cc:34
Number too big to be stored in double.
Definition: error.h:83
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:186
Miss exponent in number.
Definition: error.h:85
unsigned __int64 uint64_t
Definition: stdint.h:132
Parsing was terminated.
Definition: error.h:87
signed __int64 int64_t
Definition: stdint.h:131
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
T copy(T const &v)
double StrtodFastPath(double significand, int exp)
Definition: reader.h:708
static const double s
Definition: Units.h:99
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseObject ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 456 of file reader.h.

456  {
457  RAPIDJSON_ASSERT(is.Peek() == '{');
458  is.Take(); // Skip '{'
459 
460  if (!handler.StartObject())
462 
463  SkipWhitespace(is);
464 
465  if (is.Peek() == '}') {
466  is.Take();
467  if (!handler.EndObject(0)) // empty object
469  return;
470  }
471 
472  for (SizeType memberCount = 0;;) {
473  if (is.Peek() != '"')
475 
476  ParseString<parseFlags>(is, handler, true);
477  RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
478 
479  SkipWhitespace(is);
480 
481  if (is.Take() != ':')
483 
484  SkipWhitespace(is);
485 
486  ParseValue<parseFlags>(is, handler);
487  RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
488 
489  SkipWhitespace(is);
490 
491  ++memberCount;
492 
493  switch (is.Take()) {
494  case ',': SkipWhitespace(is); break;
495  case '}':
496  if (!handler.EndObject(memberCount))
498  else
499  return;
501  }
502  }
503  }
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
Missing a name for object member.
Definition: error.h:71
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:247
Missing a colon after a name of object member.
Definition: error.h:72
Parsing was terminated.
Definition: error.h:87
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:236
Missing a comma or &#39;}&#39; after an object member.
Definition: error.h:73
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseString ( InputStream &  is,
Handler handler,
bool  isKey = false 
)
inlineprivate

Definition at line 622 of file reader.h.

622  {
623  internal::StreamLocalCopy<InputStream> copy(is);
624  InputStream& s(copy.s);
625 
626  bool success = false;
627  if (parseFlags & kParseInsituFlag) {
628  typename InputStream::Ch *head = s.PutBegin();
629  ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
630  RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
631  size_t length = s.PutEnd(head) - 1;
632  RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);
633  const typename TargetEncoding::Ch* const str = (typename TargetEncoding::Ch*)head;
634  success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false));
635  }
636  else {
637  StackStream stackStream(stack_);
638  ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
639  RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
640  const typename TargetEncoding::Ch* const str = stack_.template Pop<typename TargetEncoding::Ch>(stackStream.length_);
641  success = (isKey ? handler.Key(str, stackStream.length_ - 1, true) : handler.String(str, stackStream.length_ - 1, true));
642  }
643  if (!success)
645  }
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:247
Parsing was terminated.
Definition: error.h:87
In-situ(destructive) parsing.
Definition: reader.h:129
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
internal::Stack< StackAllocator > stack_
A stack for storing decoded string temporarily during non-destructive parsing.
Definition: reader.h:1356
T copy(T const &v)
static const double s
Definition: Units.h:99
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename SEncoding , typename TEncoding , typename InputStream , typename OutputStream >
RAPIDJSON_FORCEINLINE void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseStringToStream ( InputStream &  is,
OutputStream &  os 
)
inlineprivate

Definition at line 650 of file reader.h.

650  {
651 //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
652 #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
653  static const char escape[256] = {
654  Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/',
655  Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0,
656  0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0,
657  0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
658  Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
659  };
660 #undef Z16
661 //!@endcond
662 
663  RAPIDJSON_ASSERT(is.Peek() == '\"');
664  is.Take(); // Skip '\"'
665 
666  for (;;) {
667  Ch c = is.Peek();
668  if (c == '\\') { // Escape
669  is.Take();
670  Ch e = is.Take();
671  if ((sizeof(Ch) == 1 || unsigned(e) < 256) && escape[(unsigned char)e]) {
672  os.Put(escape[(unsigned char)e]);
673  }
674  else if (e == 'u') { // Unicode
675  unsigned codepoint = ParseHex4(is);
676  if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
677  // Handle UTF-16 surrogate pair
678  if (is.Take() != '\\' || is.Take() != 'u')
680  unsigned codepoint2 = ParseHex4(is);
681  if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
683  codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
684  }
685  TEncoding::Encode(os, codepoint);
686  }
687  else
689  }
690  else if (c == '"') { // Closing double quote
691  is.Take();
692  os.Put('\0'); // null-terminate the string
693  return;
694  }
695  else if (c == '\0')
697  else if ((unsigned)c < 0x20) // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
699  else {
700  if (parseFlags & kParseValidateEncodingFlag ?
704  }
705  }
706  }
Validate encoding of JSON strings.
Definition: reader.h:130
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
Invalid escape character in string.
Definition: error.h:79
Invalid encoding in string.
Definition: error.h:81
unsigned ParseHex4(InputStream &is)
Definition: reader.h:583
SourceEncoding::Ch Ch
SourceEncoding character type.
Definition: reader.h:365
static RAPIDJSON_FORCEINLINE bool Validate(InputStream &is, OutputStream &os)
Validate one Unicode codepoint from an encoded stream.
Definition: encodings.h:604
const double e
#define Z16
Missing a closing quotation mark in string.
Definition: error.h:80
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
The surrogate pair in string is invalid.
Definition: error.h:78
static RAPIDJSON_FORCEINLINE bool Transcode(InputStream &is, OutputStream &os)
Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the outp...
Definition: encodings.h:594
std::string escape(std::string const &str)
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseTrue ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 556 of file reader.h.

556  {
557  RAPIDJSON_ASSERT(is.Peek() == 't');
558  is.Take();
559 
560  if (is.Take() == 'r' && is.Take() == 'u' && is.Take() == 'e') {
561  if (!handler.Bool(true))
563  }
564  else
566  }
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
Parsing was terminated.
Definition: error.h:87
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::ParseValue ( InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 908 of file reader.h.

908  {
909  switch (is.Peek()) {
910  case 'n': ParseNull <parseFlags>(is, handler); break;
911  case 't': ParseTrue <parseFlags>(is, handler); break;
912  case 'f': ParseFalse <parseFlags>(is, handler); break;
913  case '"': ParseString<parseFlags>(is, handler); break;
914  case '{': ParseObject<parseFlags>(is, handler); break;
915  case '[': ParseArray <parseFlags>(is, handler); break;
916  default : ParseNumber<parseFlags>(is, handler);
917  }
918  }
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
RAPIDJSON_FORCEINLINE IterativeParsingState rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::Predict ( IterativeParsingState  state,
Token  token 
)
inlineprivate

Definition at line 995 of file reader.h.

995  {
996  // current state x one lookahead token -> new state
997  static const char G[cIterativeParsingStateCount][kTokenCount] = {
998  // Start
999  {
1000  IterativeParsingArrayInitialState, // Left bracket
1001  IterativeParsingErrorState, // Right bracket
1002  IterativeParsingObjectInitialState, // Left curly bracket
1003  IterativeParsingErrorState, // Right curly bracket
1004  IterativeParsingErrorState, // Comma
1005  IterativeParsingErrorState, // Colon
1006  IterativeParsingValueState, // String
1007  IterativeParsingValueState, // False
1010  IterativeParsingValueState // Number
1011  },
1012  // Finish(sink state)
1013  {
1016  IterativeParsingErrorState
1017  },
1018  // Error(sink state)
1019  {
1022  IterativeParsingErrorState
1023  },
1024  // ObjectInitial
1025  {
1026  IterativeParsingErrorState, // Left bracket
1027  IterativeParsingErrorState, // Right bracket
1028  IterativeParsingErrorState, // Left curly bracket
1029  IterativeParsingObjectFinishState, // Right curly bracket
1030  IterativeParsingErrorState, // Comma
1031  IterativeParsingErrorState, // Colon
1033  IterativeParsingErrorState, // False
1036  IterativeParsingErrorState // Number
1037  },
1038  // MemberKey
1039  {
1040  IterativeParsingErrorState, // Left bracket
1041  IterativeParsingErrorState, // Right bracket
1042  IterativeParsingErrorState, // Left curly bracket
1043  IterativeParsingErrorState, // Right curly bracket
1044  IterativeParsingErrorState, // Comma
1046  IterativeParsingErrorState, // String
1047  IterativeParsingErrorState, // False
1050  IterativeParsingErrorState // Number
1051  },
1052  // KeyValueDelimiter
1053  {
1054  IterativeParsingArrayInitialState, // Left bracket(push MemberValue state)
1055  IterativeParsingErrorState, // Right bracket
1056  IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state)
1057  IterativeParsingErrorState, // Right curly bracket
1058  IterativeParsingErrorState, // Comma
1059  IterativeParsingErrorState, // Colon
1064  IterativeParsingMemberValueState // Number
1065  },
1066  // MemberValue
1067  {
1068  IterativeParsingErrorState, // Left bracket
1069  IterativeParsingErrorState, // Right bracket
1070  IterativeParsingErrorState, // Left curly bracket
1071  IterativeParsingObjectFinishState, // Right curly bracket
1073  IterativeParsingErrorState, // Colon
1074  IterativeParsingErrorState, // String
1075  IterativeParsingErrorState, // False
1078  IterativeParsingErrorState // Number
1079  },
1080  // MemberDelimiter
1081  {
1082  IterativeParsingErrorState, // Left bracket
1083  IterativeParsingErrorState, // Right bracket
1084  IterativeParsingErrorState, // Left curly bracket
1085  IterativeParsingErrorState, // Right curly bracket
1086  IterativeParsingErrorState, // Comma
1087  IterativeParsingErrorState, // Colon
1089  IterativeParsingErrorState, // False
1092  IterativeParsingErrorState // Number
1093  },
1094  // ObjectFinish(sink state)
1095  {
1098  IterativeParsingErrorState
1099  },
1100  // ArrayInitial
1101  {
1102  IterativeParsingArrayInitialState, // Left bracket(push Element state)
1103  IterativeParsingArrayFinishState, // Right bracket
1104  IterativeParsingObjectInitialState, // Left curly bracket(push Element state)
1105  IterativeParsingErrorState, // Right curly bracket
1106  IterativeParsingErrorState, // Comma
1107  IterativeParsingErrorState, // Colon
1108  IterativeParsingElementState, // String
1112  IterativeParsingElementState // Number
1113  },
1114  // Element
1115  {
1116  IterativeParsingErrorState, // Left bracket
1117  IterativeParsingArrayFinishState, // Right bracket
1118  IterativeParsingErrorState, // Left curly bracket
1119  IterativeParsingErrorState, // Right curly bracket
1121  IterativeParsingErrorState, // Colon
1122  IterativeParsingErrorState, // String
1123  IterativeParsingErrorState, // False
1126  IterativeParsingErrorState // Number
1127  },
1128  // ElementDelimiter
1129  {
1130  IterativeParsingArrayInitialState, // Left bracket(push Element state)
1131  IterativeParsingErrorState, // Right bracket
1132  IterativeParsingObjectInitialState, // Left curly bracket(push Element state)
1133  IterativeParsingErrorState, // Right curly bracket
1134  IterativeParsingErrorState, // Comma
1135  IterativeParsingErrorState, // Colon
1136  IterativeParsingElementState, // String
1140  IterativeParsingElementState // Number
1141  },
1142  // ArrayFinish(sink state)
1143  {
1146  IterativeParsingErrorState
1147  },
1148  // Single Value (sink state)
1149  {
1152  IterativeParsingErrorState
1153  }
1154  }; // End of G
1155 
1156  return (IterativeParsingState)G[state][token];
1157  }
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
void rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::SetParseError ( ParseErrorCode  code,
size_t  offset 
)
inlineprotected

Definition at line 435 of file reader.h.

435 { parseResult_.Set(code, offset); }
void Set(ParseErrorCode code, size_t offset=0)
Update error code and offset.
Definition: error.h:129
ParseResult parseResult_
Definition: reader.h:1357
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
double rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::StrtodFastPath ( double  significand,
int  exp 
)
inlineprivate

Definition at line 708 of file reader.h.

708  {
709  // Fast path only works on limited range of values.
710  // But for simplicity and performance, currently only implement this.
711  // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
712  if (exp < -308)
713  return 0.0;
714  else if (exp >= 0)
715  return significand * internal::Pow10(exp);
716  else
717  return significand / internal::Pow10(-exp);
718  }
double Pow10(int n)
Computes integer powers of 10 in double (10.0^n).
Definition: pow10.h:32
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
RAPIDJSON_FORCEINLINE Token rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::Tokenize ( Ch  c)
inlineprivate

Definition at line 968 of file reader.h.

968  {
969 
970 //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
971 #define N NumberToken
972 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
973  // Maps from ASCII to Token
974  static const unsigned char tokenMap[256] = {
975  N16, // 00~0F
976  N16, // 10~1F
977  N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
978  N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
979  N16, // 40~4F
980  N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
981  N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
982  N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
983  N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
984  };
985 #undef N
986 #undef N16
987 //!@endcond
988 
989  if (sizeof(Ch) == 1 || unsigned(c) < 256)
990  return (Token)tokenMap[(unsigned char)c];
991  else
992  return NumberToken;
993  }
SourceEncoding::Ch Ch
SourceEncoding character type.
Definition: reader.h:365
template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
template<unsigned parseFlags, typename InputStream , typename Handler >
RAPIDJSON_FORCEINLINE IterativeParsingState rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::Transit ( IterativeParsingState  src,
Token  token,
IterativeParsingState  dst,
InputStream &  is,
Handler handler 
)
inlineprivate

Definition at line 1162 of file reader.h.

1162  {
1163  switch (dst) {
1165  RAPIDJSON_ASSERT(false);
1167 
1169  return dst;
1170 
1172  return dst;
1173 
1176  {
1177  // Push the state(Element or MemeberValue) if we are nested in another array or value of member.
1178  // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop.
1179  IterativeParsingState n = src;
1184  // Push current state.
1185  *stack_.template Push<SizeType>(1) = n;
1186  // Initialize and push the member/element count.
1187  *stack_.template Push<SizeType>(1) = 0;
1188  // Call handler
1189  bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1190  // On handler short circuits the parsing.
1191  if (!hr) {
1194  }
1195  else {
1196  is.Take();
1197  return dst;
1198  }
1199  }
1200 
1202  ParseString<parseFlags>(is, handler, true);
1203  if (HasParseError())
1205  else
1206  return dst;
1207 
1209  if (token == ColonToken) {
1210  is.Take();
1211  return dst;
1212  }
1213  else
1215 
1217  // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
1218  ParseValue<parseFlags>(is, handler);
1219  if (HasParseError()) {
1221  }
1222  return dst;
1223 
1225  // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
1226  ParseValue<parseFlags>(is, handler);
1227  if (HasParseError()) {
1229  }
1230  return dst;
1231 
1234  is.Take();
1235  // Update member/element count.
1236  *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1237  return dst;
1238 
1240  {
1241  // Get member count.
1242  SizeType c = *stack_.template Pop<SizeType>(1);
1243  // If the object is not empty, count the last member.
1245  ++c;
1246  // Restore the state.
1247  IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));
1248  // Transit to Finish state if this is the topmost scope.
1249  if (n == IterativeParsingStartState)
1251  // Call handler
1252  bool hr = handler.EndObject(c);
1253  // On handler short circuits the parsing.
1254  if (!hr) {
1257  }
1258  else {
1259  is.Take();
1260  return n;
1261  }
1262  }
1263 
1265  {
1266  // Get element count.
1267  SizeType c = *stack_.template Pop<SizeType>(1);
1268  // If the array is not empty, count the last element.
1269  if (src == IterativeParsingElementState)
1270  ++c;
1271  // Restore the state.
1272  IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));
1273  // Transit to Finish state if this is the topmost scope.
1274  if (n == IterativeParsingStartState)
1276  // Call handler
1277  bool hr = handler.EndArray(c);
1278  // On handler short circuits the parsing.
1279  if (!hr) {
1282  }
1283  else {
1284  is.Take();
1285  return n;
1286  }
1287  }
1288 
1290  // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
1291  ParseValue<parseFlags>(is, handler);
1292  if (HasParseError()) {
1294  }
1296 
1297  default:
1298  RAPIDJSON_ASSERT(false);
1300  }
1301  }
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:247
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
Definition: reader.h:91
Parsing was terminated.
Definition: error.h:87
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: reader.h:426
internal::Stack< StackAllocator > stack_
A stack for storing decoded string temporarily during non-destructive parsing.
Definition: reader.h:1356

Member Data Documentation

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
const size_t rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::kDefaultStackCapacity = 256
staticprivate

Default stack capacity in bytes for storing a single decoded string.

Definition at line 1355 of file reader.h.

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
ParseResult rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::parseResult_
private

Definition at line 1357 of file reader.h.

template<typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator>
internal::Stack<StackAllocator> rapidjson::GenericReader< SourceEncoding, TargetEncoding, StackAllocator >::stack_
private

A stack for storing decoded string temporarily during non-destructive parsing.

Definition at line 1356 of file reader.h.


The documentation for this class was generated from the following file: