♻️ adjusting lexer/parser in symmetry to #1006

This commit is contained in:
Niels Lohmann 2018-03-12 19:15:11 +01:00
parent b56ac86471
commit 8557151d90
No known key found for this signature in database
GPG key ID: 7F3CEA63AE251B69
5 changed files with 34 additions and 12 deletions

View file

@ -32,6 +32,7 @@ class lexer
using number_integer_t = typename BasicJsonType::number_integer_t; using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t; using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
public: public:
/// token types for the parser /// token types for the parser
@ -1130,7 +1131,7 @@ scan_number_done:
} }
/// return current string value (implicitly resets the token; useful only once) /// return current string value (implicitly resets the token; useful only once)
std::string&& move_string() string_t&& move_string()
{ {
return std::move(token_buffer); return std::move(token_buffer);
} }
@ -1260,7 +1261,7 @@ scan_number_done:
std::vector<char> token_string {}; std::vector<char> token_string {};
/// buffer for variable-length tokens (numbers, strings) /// buffer for variable-length tokens (numbers, strings)
std::string token_buffer {}; string_t token_buffer {};
/// a description of occurred lexer errors /// a description of occurred lexer errors
const char* error_message = ""; const char* error_message = "";

View file

@ -32,6 +32,7 @@ class parser
using number_integer_t = typename BasicJsonType::number_integer_t; using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t; using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
using lexer_t = lexer<BasicJsonType>; using lexer_t = lexer<BasicJsonType>;
using token_type = typename lexer_t::token_type; using token_type = typename lexer_t::token_type;
@ -175,7 +176,7 @@ class parser
} }
// parse values // parse values
std::string key; string_t key;
BasicJsonType value; BasicJsonType value;
while (true) while (true)
{ {

View file

@ -1871,6 +1871,7 @@ class lexer
using number_integer_t = typename BasicJsonType::number_integer_t; using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t; using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
public: public:
/// token types for the parser /// token types for the parser
@ -2969,7 +2970,7 @@ scan_number_done:
} }
/// return current string value (implicitly resets the token; useful only once) /// return current string value (implicitly resets the token; useful only once)
std::string&& move_string() string_t&& move_string()
{ {
return std::move(token_buffer); return std::move(token_buffer);
} }
@ -3099,7 +3100,7 @@ scan_number_done:
std::vector<char> token_string {}; std::vector<char> token_string {};
/// buffer for variable-length tokens (numbers, strings) /// buffer for variable-length tokens (numbers, strings)
std::string token_buffer {}; string_t token_buffer {};
/// a description of occurred lexer errors /// a description of occurred lexer errors
const char* error_message = ""; const char* error_message = "";
@ -3155,6 +3156,7 @@ class parser
using number_integer_t = typename BasicJsonType::number_integer_t; using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t; using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
using lexer_t = lexer<BasicJsonType>; using lexer_t = lexer<BasicJsonType>;
using token_type = typename lexer_t::token_type; using token_type = typename lexer_t::token_type;
@ -3298,7 +3300,7 @@ class parser
} }
// parse values // parse values
std::string key; string_t key;
BasicJsonType value; BasicJsonType value;
while (true) while (true)
{ {

View file

@ -9,6 +9,7 @@ CPPFLAGS += -I ../single_include -I . -I thirdparty/catch -I thirdparty/fifo_map
SOURCES = src/unit.cpp \ SOURCES = src/unit.cpp \
src/unit-algorithms.cpp \ src/unit-algorithms.cpp \
src/unit-allocator.cpp \ src/unit-allocator.cpp \
src/unit-alt-string.cpp \
src/unit-capacity.cpp \ src/unit-capacity.cpp \
src/unit-cbor.cpp \ src/unit-cbor.cpp \
src/unit-class_const_iterator.cpp \ src/unit-class_const_iterator.cpp \

View file

@ -42,7 +42,7 @@ class alt_string
using value_type = std::string::value_type; using value_type = std::string::value_type;
alt_string(const char* str): str_impl(str) {} alt_string(const char* str): str_impl(str) {}
alt_string(const char* str, size_t count): str_impl(str, count) {} alt_string(const char* str, std::size_t count): str_impl(str, count) {}
alt_string(size_t count, char chr): str_impl(count, chr) {} alt_string(size_t count, char chr): str_impl(count, chr) {}
alt_string() = default; alt_string() = default;
@ -70,17 +70,17 @@ class alt_string
return str_impl != op; return str_impl != op;
} }
size_t size() const noexcept std::size_t size() const noexcept
{ {
return str_impl.size(); return str_impl.size();
} }
void resize (size_t n) void resize (std::size_t n)
{ {
str_impl.resize(n); str_impl.resize(n);
} }
void resize (size_t n, char c) void resize (std::size_t n, char c)
{ {
str_impl.resize(n, c); str_impl.resize(n, c);
} }
@ -101,12 +101,12 @@ class alt_string
return str_impl.c_str(); return str_impl.c_str();
} }
char& operator[](int index) char& operator[](std::size_t index)
{ {
return str_impl[index]; return str_impl[index];
} }
const char& operator[](int index) const const char& operator[](std::size_t index) const
{ {
return str_impl[index]; return str_impl[index];
} }
@ -121,6 +121,16 @@ class alt_string
return str_impl.back(); return str_impl.back();
} }
void clear()
{
str_impl.clear();
}
const value_type* data()
{
return str_impl.data();
}
private: private:
std::string str_impl; std::string str_impl;
}; };
@ -192,4 +202,11 @@ TEST_CASE("alternative string type")
CHECK(dump == R"({"list":[1,0,2]})"); CHECK(dump == R"({"list":[1,0,2]})");
} }
} }
SECTION("parse")
{
auto doc = alt_json::parse("{\"foo\": \"bar\"}");
alt_string dump = doc.dump();
CHECK(dump == R"({"foo":"bar"})");
}
} }