Merge pull request #1009 from nlohmann/user_string_parser
Allowing for user-defined string type in lexer/parser
diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp
index ea11609..98cc1b6 100644
--- a/include/nlohmann/detail/input/lexer.hpp
+++ b/include/nlohmann/detail/input/lexer.hpp
@@ -32,6 +32,7 @@
using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
+ using string_t = typename BasicJsonType::string_t;
public:
/// token types for the parser
@@ -1130,7 +1131,7 @@
}
/// return current string value (implicitly resets the token; useful only once)
- std::string&& move_string()
+ string_t&& move_string()
{
return std::move(token_buffer);
}
@@ -1260,7 +1261,7 @@
std::vector<char> token_string {};
/// buffer for variable-length tokens (numbers, strings)
- std::string token_buffer {};
+ string_t token_buffer {};
/// a description of occurred lexer errors
const char* error_message = "";
diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp
index 58d42bb..e58aaaf 100644
--- a/include/nlohmann/detail/input/parser.hpp
+++ b/include/nlohmann/detail/input/parser.hpp
@@ -32,6 +32,7 @@
using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
+ using string_t = typename BasicJsonType::string_t;
using lexer_t = lexer<BasicJsonType>;
using token_type = typename lexer_t::token_type;
@@ -175,7 +176,7 @@
}
// parse values
- std::string key;
+ string_t key;
BasicJsonType value;
while (true)
{
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index 4713d4d..436ea89 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -1871,6 +1871,7 @@
using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
+ using string_t = typename BasicJsonType::string_t;
public:
/// token types for the parser
@@ -2969,7 +2970,7 @@
}
/// return current string value (implicitly resets the token; useful only once)
- std::string&& move_string()
+ string_t&& move_string()
{
return std::move(token_buffer);
}
@@ -3099,7 +3100,7 @@
std::vector<char> token_string {};
/// buffer for variable-length tokens (numbers, strings)
- std::string token_buffer {};
+ string_t token_buffer {};
/// a description of occurred lexer errors
const char* error_message = "";
@@ -3155,6 +3156,7 @@
using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
+ using string_t = typename BasicJsonType::string_t;
using lexer_t = lexer<BasicJsonType>;
using token_type = typename lexer_t::token_type;
@@ -3298,7 +3300,7 @@
}
// parse values
- std::string key;
+ string_t key;
BasicJsonType value;
while (true)
{
diff --git a/test/Makefile b/test/Makefile
index 51edae6..f373451 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -9,6 +9,7 @@
SOURCES = src/unit.cpp \
src/unit-algorithms.cpp \
src/unit-allocator.cpp \
+ src/unit-alt-string.cpp \
src/unit-capacity.cpp \
src/unit-cbor.cpp \
src/unit-class_const_iterator.cpp \
diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp
index 3f8b8c9..30159fc 100644
--- a/test/src/unit-alt-string.cpp
+++ b/test/src/unit-alt-string.cpp
@@ -42,7 +42,7 @@
using value_type = std::string::value_type;
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() = default;
@@ -70,17 +70,17 @@
return str_impl != op;
}
- size_t size() const noexcept
+ std::size_t size() const noexcept
{
return str_impl.size();
}
- void resize (size_t n)
+ void resize (std::size_t 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);
}
@@ -101,12 +101,12 @@
return str_impl.c_str();
}
- char& operator[](int index)
+ char& operator[](std::size_t index)
{
return str_impl[index];
}
- const char& operator[](int index) const
+ const char& operator[](std::size_t index) const
{
return str_impl[index];
}
@@ -121,6 +121,16 @@
return str_impl.back();
}
+ void clear()
+ {
+ str_impl.clear();
+ }
+
+ const value_type* data()
+ {
+ return str_impl.data();
+ }
+
private:
std::string str_impl;
};
@@ -192,4 +202,11 @@
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"})");
+ }
}