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"})");
+    }
 }