From a4b438e59ea36aa4482d011fbc59cd876a021bcf Mon Sep 17 00:00:00 2001 From: Shane Grant Date: Fri, 20 Dec 2013 10:11:29 -0800 Subject: [PATCH] adds ability to parse infinity --- include/cereal/external/rapidjson/reader.h | 29 ++++++++++++++++------ 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/include/cereal/external/rapidjson/reader.h b/include/cereal/external/rapidjson/reader.h index c27bba7e..a2beca82 100644 --- a/include/cereal/external/rapidjson/reader.h +++ b/include/cereal/external/rapidjson/reader.h @@ -329,7 +329,7 @@ private: // Parses for null or NaN template - void ParseNull(Stream& stream, Handler& handler) { + void ParseNaNNull(Stream& stream, Handler& handler) { RAPIDJSON_ASSERT(stream.Peek() == 'n'); stream.Take(); @@ -341,6 +341,18 @@ private: RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell() - 1); } + // Parses for infinity + template + void ParseInfinity(Stream& stream, Handler& handler) { + RAPIDJSON_ASSERT(stream.Peek() == 'i'); + stream.Take(); + + if (stream.Take() == 'n' && stream.Take() == 'f') + handler.Double( std::numeric_limits::infinity() ); + else + RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell() - 1); + } + template void ParseTrue(Stream& stream, Handler& handler) { RAPIDJSON_ASSERT(stream.Peek() == 't'); @@ -688,13 +700,14 @@ private: template void ParseValue(Stream& stream, Handler& handler) { switch (stream.Peek()) { - case 'n': ParseNull (stream, handler); break; - case 't': ParseTrue (stream, handler); break; - case 'f': ParseFalse (stream, handler); break; - case '"': ParseString(stream, handler); break; - case '{': ParseObject(stream, handler); break; - case '[': ParseArray (stream, handler); break; - default : ParseNumber(stream, handler); + case 'n': ParseNaNNull (stream, handler); break; + case 'i': ParseInfinity (stream, handler); break; + case 't': ParseTrue (stream, handler); break; + case 'f': ParseFalse (stream, handler); break; + case '"': ParseString (stream, handler); break; + case '{': ParseObject (stream, handler); break; + case '[': ParseArray (stream, handler); break; + default : ParseNumber (stream, handler); } }