From 023105929064820e58a50242aeaa16845ce9988b Mon Sep 17 00:00:00 2001
From: Antonio Borondo <antonio.borondo@gonitro.com>
Date: Wed, 3 Oct 2018 11:13:35 +0100
Subject: [PATCH 1/6] Fix warning

---
 .../nlohmann/detail/input/input_adapters.hpp  | 21 ++++++++++++-------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp
index c2a20ab7..40560ca1 100644
--- a/include/nlohmann/detail/input/input_adapters.hpp
+++ b/include/nlohmann/detail/input/input_adapters.hpp
@@ -126,14 +126,7 @@ class wide_string_input_adapter : public input_adapter_protocol
         // check if buffer needs to be filled
         if (utf8_bytes_index == utf8_bytes_filled)
         {
-            if (sizeof(typename WideStringType::value_type) == 2)
-            {
-                fill_buffer_utf16();
-            }
-            else
-            {
-                fill_buffer_utf32();
-            }
+            fill_buffer(sizeof(typename WideStringType::value_type));
 
             assert(utf8_bytes_filled > 0);
             assert(utf8_bytes_index == 0);
@@ -146,6 +139,18 @@ class wide_string_input_adapter : public input_adapter_protocol
     }
 
   private:
+    void fill_buffer(size_t size)
+    {
+        if (2 == size)
+        {
+            fill_buffer_utf16();
+        }
+        else
+        {
+            fill_buffer_utf32();
+        }
+    }
+    
     void fill_buffer_utf16()
     {
         utf8_bytes_index = 0;

From ad3c216bb5451b23af7cf356ef19c600422af5dc Mon Sep 17 00:00:00 2001
From: Antonio Borondo <antonio.borondo@gonitro.com>
Date: Wed, 3 Oct 2018 10:56:46 +0100
Subject: [PATCH 2/6] Generate header

---
 single_include/nlohmann/json.hpp | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index c8b0cc9e..7af55b3a 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -2004,14 +2004,7 @@ class wide_string_input_adapter : public input_adapter_protocol
         // check if buffer needs to be filled
         if (utf8_bytes_index == utf8_bytes_filled)
         {
-            if (sizeof(typename WideStringType::value_type) == 2)
-            {
-                fill_buffer_utf16();
-            }
-            else
-            {
-                fill_buffer_utf32();
-            }
+            fill_buffer(sizeof(typename WideStringType::value_type));
 
             assert(utf8_bytes_filled > 0);
             assert(utf8_bytes_index == 0);
@@ -2024,6 +2017,18 @@ class wide_string_input_adapter : public input_adapter_protocol
     }
 
   private:
+    void fill_buffer(size_t size)
+    {
+        if (2 == size)
+        {
+            fill_buffer_utf16();
+        }
+        else
+        {
+            fill_buffer_utf32();
+        }
+    }
+
     void fill_buffer_utf16()
     {
         utf8_bytes_index = 0;

From 8d1585f065c9b7e8e329339063201ca22901aff5 Mon Sep 17 00:00:00 2001
From: Antonio Borondo <antonio.borondo@gonitro.com>
Date: Wed, 3 Oct 2018 11:44:02 +0100
Subject: [PATCH 3/6] Change implementation to use templates

---
 .../nlohmann/detail/input/input_adapters.hpp  | 20 +++++++++----------
 single_include/nlohmann/json.hpp              | 20 +++++++++----------
 2 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp
index 40560ca1..f8155faa 100644
--- a/include/nlohmann/detail/input/input_adapters.hpp
+++ b/include/nlohmann/detail/input/input_adapters.hpp
@@ -126,7 +126,7 @@ class wide_string_input_adapter : public input_adapter_protocol
         // check if buffer needs to be filled
         if (utf8_bytes_index == utf8_bytes_filled)
         {
-            fill_buffer(sizeof(typename WideStringType::value_type));
+            fill_buffer<sizeof(typename WideStringType::value_type)>();
 
             assert(utf8_bytes_filled > 0);
             assert(utf8_bytes_index == 0);
@@ -139,16 +139,16 @@ class wide_string_input_adapter : public input_adapter_protocol
     }
 
   private:
-    void fill_buffer(size_t size)
+    template<size_t T>
+    void fill_buffer()
     {
-        if (2 == size)
-        {
-            fill_buffer_utf16();
-        }
-        else
-        {
-            fill_buffer_utf32();
-        }
+        fill_buffer_utf32();
+    }
+
+    template<>
+    void fill_buffer<2>()
+    {
+        fill_buffer_utf16();
     }
     
     void fill_buffer_utf16()
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index 7af55b3a..c19ee6c9 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -2004,7 +2004,7 @@ class wide_string_input_adapter : public input_adapter_protocol
         // check if buffer needs to be filled
         if (utf8_bytes_index == utf8_bytes_filled)
         {
-            fill_buffer(sizeof(typename WideStringType::value_type));
+            fill_buffer<sizeof(typename WideStringType::value_type)>();
 
             assert(utf8_bytes_filled > 0);
             assert(utf8_bytes_index == 0);
@@ -2017,18 +2017,18 @@ class wide_string_input_adapter : public input_adapter_protocol
     }
 
   private:
-    void fill_buffer(size_t size)
+    template<size_t T>
+    void fill_buffer()
     {
-        if (2 == size)
-        {
-            fill_buffer_utf16();
-        }
-        else
-        {
-            fill_buffer_utf32();
-        }
+        fill_buffer_utf32();
     }
 
+    template<>
+    void fill_buffer<2>()
+    {
+        fill_buffer_utf16();
+    }
+    
     void fill_buffer_utf16()
     {
         utf8_bytes_index = 0;

From 9ba3f79667baa3f1afacb09cdcf1cb0275b8f411 Mon Sep 17 00:00:00 2001
From: Antonio Borondo <antonio.borondo@gonitro.com>
Date: Wed, 3 Oct 2018 12:26:24 +0100
Subject: [PATCH 4/6] Fix error: explicit specialization in non-namespace scope

---
 .../nlohmann/detail/input/input_adapters.hpp  | 234 +++++++++---------
 single_include/nlohmann/json.hpp              | 234 +++++++++---------
 2 files changed, 240 insertions(+), 228 deletions(-)

diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp
index f8155faa..51d2a373 100644
--- a/include/nlohmann/detail/input/input_adapters.hpp
+++ b/include/nlohmann/detail/input/input_adapters.hpp
@@ -142,122 +142,9 @@ class wide_string_input_adapter : public input_adapter_protocol
     template<size_t T>
     void fill_buffer()
     {
-        fill_buffer_utf32();
-    }
-
-    template<>
-    void fill_buffer<2>()
-    {
-        fill_buffer_utf16();
+        wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
     }
     
-    void fill_buffer_utf16()
-    {
-        utf8_bytes_index = 0;
-
-        if (current_wchar == str.size())
-        {
-            utf8_bytes[0] = std::char_traits<char>::eof();
-            utf8_bytes_filled = 1;
-        }
-        else
-        {
-            // get the current character
-            const int wc = static_cast<int>(str[current_wchar++]);
-
-            // UTF-16 to UTF-8 encoding
-            if (wc < 0x80)
-            {
-                utf8_bytes[0] = wc;
-                utf8_bytes_filled = 1;
-            }
-            else if (wc <= 0x7FF)
-            {
-                utf8_bytes[0] = 0xC0 | ((wc >> 6));
-                utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 2;
-            }
-            else if (0xD800 > wc or wc >= 0xE000)
-            {
-                utf8_bytes[0] = 0xE0 | ((wc >> 12));
-                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 3;
-            }
-            else
-            {
-                if (current_wchar < str.size())
-                {
-                    const int wc2 = static_cast<int>(str[current_wchar++]);
-                    const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
-                    utf8_bytes[0] = 0xf0 | (charcode >> 18);
-                    utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
-                    utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
-                    utf8_bytes[3] = 0x80 | (charcode & 0x3F);
-                    utf8_bytes_filled = 4;
-                }
-                else
-                {
-                    // unknown character
-                    ++current_wchar;
-                    utf8_bytes[0] = wc;
-                    utf8_bytes_filled = 1;
-                }
-            }
-        }
-    }
-
-    void fill_buffer_utf32()
-    {
-        utf8_bytes_index = 0;
-
-        if (current_wchar == str.size())
-        {
-            utf8_bytes[0] = std::char_traits<char>::eof();
-            utf8_bytes_filled = 1;
-        }
-        else
-        {
-            // get the current character
-            const int wc = static_cast<int>(str[current_wchar++]);
-
-            // UTF-32 to UTF-8 encoding
-            if (wc < 0x80)
-            {
-                utf8_bytes[0] = wc;
-                utf8_bytes_filled = 1;
-            }
-            else if (wc <= 0x7FF)
-            {
-                utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
-                utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 2;
-            }
-            else if (wc <= 0xFFFF)
-            {
-                utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
-                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 3;
-            }
-            else if (wc <= 0x10FFFF)
-            {
-                utf8_bytes[0] = 0xF0 | ((wc >> 18 ) & 0x07);
-                utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
-                utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
-                utf8_bytes[3] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 4;
-            }
-            else
-            {
-                // unknown character
-                utf8_bytes[0] = wc;
-                utf8_bytes_filled = 1;
-            }
-        }
-    }
-
-  private:
     /// the wstring to process
     const WideStringType& str;
 
@@ -273,6 +160,125 @@ class wide_string_input_adapter : public input_adapter_protocol
     std::size_t utf8_bytes_filled = 0;
 };
 
+namespace
+{
+    template<typename WideStringType, size_t T>
+    struct wide_string_input_helper
+    {
+        // UTF-32
+        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
+        {
+            utf8_bytes_index = 0;
+
+            if (current_wchar == str.size())
+            {
+                utf8_bytes[0] = std::char_traits<char>::eof();
+                utf8_bytes_filled = 1;
+            }
+            else
+            {
+                // get the current character
+                const int wc = static_cast<int>(str[current_wchar++]);
+
+                // UTF-32 to UTF-8 encoding
+                if (wc < 0x80)
+                {
+                    utf8_bytes[0] = wc;
+                    utf8_bytes_filled = 1;
+                }
+                else if (wc <= 0x7FF)
+                {
+                    utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
+                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 2;
+                }
+                else if (wc <= 0xFFFF)
+                {
+                    utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
+                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 3;
+                }
+                else if (wc <= 0x10FFFF)
+                {
+                    utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
+                    utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
+                    utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
+                    utf8_bytes[3] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 4;
+                }
+                else
+                {
+                    // unknown character
+                    utf8_bytes[0] = wc;
+                    utf8_bytes_filled = 1;
+                }
+            }
+        }
+    };
+
+    template<typename WideStringType>
+    struct wide_string_input_helper<WideStringType, 2>
+    {
+        // UTF-16
+        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
+        {
+            utf8_bytes_index = 0;
+
+            if (current_wchar == str.size())
+            {
+                utf8_bytes[0] = std::char_traits<char>::eof();
+                utf8_bytes_filled = 1;
+            }
+            else
+            {
+                // get the current character
+                const int wc = static_cast<int>(str[current_wchar++]);
+
+                // UTF-16 to UTF-8 encoding
+                if (wc < 0x80)
+                {
+                    utf8_bytes[0] = wc;
+                    utf8_bytes_filled = 1;
+                }
+                else if (wc <= 0x7FF)
+                {
+                    utf8_bytes[0] = 0xC0 | ((wc >> 6));
+                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 2;
+                }
+                else if (0xD800 > wc or wc >= 0xE000)
+                {
+                    utf8_bytes[0] = 0xE0 | ((wc >> 12));
+                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 3;
+                }
+                else
+                {
+                    if (current_wchar < str.size())
+                    {
+                        const int wc2 = static_cast<int>(str[current_wchar++]);
+                        const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
+                        utf8_bytes[0] = 0xf0 | (charcode >> 18);
+                        utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
+                        utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
+                        utf8_bytes[3] = 0x80 | (charcode & 0x3F);
+                        utf8_bytes_filled = 4;
+                    }
+                    else
+                    {
+                        // unknown character
+                        ++current_wchar;
+                        utf8_bytes[0] = wc;
+                        utf8_bytes_filled = 1;
+                    }
+                }
+            }
+        }
+    };
+}
+
 class input_adapter
 {
   public:
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index c19ee6c9..c9132fa2 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -2020,122 +2020,9 @@ class wide_string_input_adapter : public input_adapter_protocol
     template<size_t T>
     void fill_buffer()
     {
-        fill_buffer_utf32();
-    }
-
-    template<>
-    void fill_buffer<2>()
-    {
-        fill_buffer_utf16();
+        wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
     }
     
-    void fill_buffer_utf16()
-    {
-        utf8_bytes_index = 0;
-
-        if (current_wchar == str.size())
-        {
-            utf8_bytes[0] = std::char_traits<char>::eof();
-            utf8_bytes_filled = 1;
-        }
-        else
-        {
-            // get the current character
-            const int wc = static_cast<int>(str[current_wchar++]);
-
-            // UTF-16 to UTF-8 encoding
-            if (wc < 0x80)
-            {
-                utf8_bytes[0] = wc;
-                utf8_bytes_filled = 1;
-            }
-            else if (wc <= 0x7FF)
-            {
-                utf8_bytes[0] = 0xC0 | ((wc >> 6));
-                utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 2;
-            }
-            else if (0xD800 > wc or wc >= 0xE000)
-            {
-                utf8_bytes[0] = 0xE0 | ((wc >> 12));
-                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 3;
-            }
-            else
-            {
-                if (current_wchar < str.size())
-                {
-                    const int wc2 = static_cast<int>(str[current_wchar++]);
-                    const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
-                    utf8_bytes[0] = 0xf0 | (charcode >> 18);
-                    utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
-                    utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
-                    utf8_bytes[3] = 0x80 | (charcode & 0x3F);
-                    utf8_bytes_filled = 4;
-                }
-                else
-                {
-                    // unknown character
-                    ++current_wchar;
-                    utf8_bytes[0] = wc;
-                    utf8_bytes_filled = 1;
-                }
-            }
-        }
-    }
-
-    void fill_buffer_utf32()
-    {
-        utf8_bytes_index = 0;
-
-        if (current_wchar == str.size())
-        {
-            utf8_bytes[0] = std::char_traits<char>::eof();
-            utf8_bytes_filled = 1;
-        }
-        else
-        {
-            // get the current character
-            const int wc = static_cast<int>(str[current_wchar++]);
-
-            // UTF-32 to UTF-8 encoding
-            if (wc < 0x80)
-            {
-                utf8_bytes[0] = wc;
-                utf8_bytes_filled = 1;
-            }
-            else if (wc <= 0x7FF)
-            {
-                utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
-                utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 2;
-            }
-            else if (wc <= 0xFFFF)
-            {
-                utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
-                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 3;
-            }
-            else if (wc <= 0x10FFFF)
-            {
-                utf8_bytes[0] = 0xF0 | ((wc >> 18 ) & 0x07);
-                utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
-                utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
-                utf8_bytes[3] = 0x80 | (wc & 0x3F);
-                utf8_bytes_filled = 4;
-            }
-            else
-            {
-                // unknown character
-                utf8_bytes[0] = wc;
-                utf8_bytes_filled = 1;
-            }
-        }
-    }
-
-  private:
     /// the wstring to process
     const WideStringType& str;
 
@@ -2151,6 +2038,125 @@ class wide_string_input_adapter : public input_adapter_protocol
     std::size_t utf8_bytes_filled = 0;
 };
 
+namespace
+{
+    template<typename WideStringType, size_t T>
+    struct wide_string_input_helper
+    {
+        // UTF-32
+        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
+        {
+            utf8_bytes_index = 0;
+
+            if (current_wchar == str.size())
+            {
+                utf8_bytes[0] = std::char_traits<char>::eof();
+                utf8_bytes_filled = 1;
+            }
+            else
+            {
+                // get the current character
+                const int wc = static_cast<int>(str[current_wchar++]);
+
+                // UTF-32 to UTF-8 encoding
+                if (wc < 0x80)
+                {
+                    utf8_bytes[0] = wc;
+                    utf8_bytes_filled = 1;
+                }
+                else if (wc <= 0x7FF)
+                {
+                    utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
+                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 2;
+                }
+                else if (wc <= 0xFFFF)
+                {
+                    utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
+                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 3;
+                }
+                else if (wc <= 0x10FFFF)
+                {
+                    utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
+                    utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
+                    utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
+                    utf8_bytes[3] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 4;
+                }
+                else
+                {
+                    // unknown character
+                    utf8_bytes[0] = wc;
+                    utf8_bytes_filled = 1;
+                }
+            }
+        }
+    };
+
+    template<typename WideStringType>
+    struct wide_string_input_helper<WideStringType, 2>
+    {
+        // UTF-16
+        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
+        {
+            utf8_bytes_index = 0;
+
+            if (current_wchar == str.size())
+            {
+                utf8_bytes[0] = std::char_traits<char>::eof();
+                utf8_bytes_filled = 1;
+            }
+            else
+            {
+                // get the current character
+                const int wc = static_cast<int>(str[current_wchar++]);
+
+                // UTF-16 to UTF-8 encoding
+                if (wc < 0x80)
+                {
+                    utf8_bytes[0] = wc;
+                    utf8_bytes_filled = 1;
+                }
+                else if (wc <= 0x7FF)
+                {
+                    utf8_bytes[0] = 0xC0 | ((wc >> 6));
+                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 2;
+                }
+                else if (0xD800 > wc or wc >= 0xE000)
+                {
+                    utf8_bytes[0] = 0xE0 | ((wc >> 12));
+                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                    utf8_bytes_filled = 3;
+                }
+                else
+                {
+                    if (current_wchar < str.size())
+                    {
+                        const int wc2 = static_cast<int>(str[current_wchar++]);
+                        const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
+                        utf8_bytes[0] = 0xf0 | (charcode >> 18);
+                        utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
+                        utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
+                        utf8_bytes[3] = 0x80 | (charcode & 0x3F);
+                        utf8_bytes_filled = 4;
+                    }
+                    else
+                    {
+                        // unknown character
+                        ++current_wchar;
+                        utf8_bytes[0] = wc;
+                        utf8_bytes_filled = 1;
+                    }
+                }
+            }
+        }
+    };
+}
+
 class input_adapter
 {
   public:

From 7c385a4844bb9268163485d3e66d6a23f02b6815 Mon Sep 17 00:00:00 2001
From: Antonio Borondo <antonio.borondo@gonitro.com>
Date: Wed, 3 Oct 2018 12:41:34 +0100
Subject: [PATCH 5/6] Fix error: 'wide_string_input_helper' was not declared in
 this scope

---
 .../nlohmann/detail/input/input_adapters.hpp  | 90 +++++++++---------
 single_include/nlohmann/json.hpp              | 92 ++++++++++---------
 2 files changed, 92 insertions(+), 90 deletions(-)

diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp
index 51d2a373..9b57e210 100644
--- a/include/nlohmann/detail/input/input_adapters.hpp
+++ b/include/nlohmann/detail/input/input_adapters.hpp
@@ -115,51 +115,6 @@ class input_buffer_adapter : public input_adapter_protocol
     const char* const limit;
 };
 
-template<typename WideStringType>
-class wide_string_input_adapter : public input_adapter_protocol
-{
-  public:
-    explicit wide_string_input_adapter(const WideStringType& w) : str(w) {}
-
-    std::char_traits<char>::int_type get_character() noexcept override
-    {
-        // check if buffer needs to be filled
-        if (utf8_bytes_index == utf8_bytes_filled)
-        {
-            fill_buffer<sizeof(typename WideStringType::value_type)>();
-
-            assert(utf8_bytes_filled > 0);
-            assert(utf8_bytes_index == 0);
-        }
-
-        // use buffer
-        assert(utf8_bytes_filled > 0);
-        assert(utf8_bytes_index < utf8_bytes_filled);
-        return utf8_bytes[utf8_bytes_index++];
-    }
-
-  private:
-    template<size_t T>
-    void fill_buffer()
-    {
-        wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
-    }
-    
-    /// the wstring to process
-    const WideStringType& str;
-
-    /// index of the current wchar in str
-    std::size_t current_wchar = 0;
-
-    /// a buffer for UTF-8 bytes
-    std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
-
-    /// index to the utf8_codes array for the next valid byte
-    std::size_t utf8_bytes_index = 0;
-    /// number of valid bytes in the utf8_codes array
-    std::size_t utf8_bytes_filled = 0;
-};
-
 namespace
 {
     template<typename WideStringType, size_t T>
@@ -279,6 +234,51 @@ namespace
     };
 }
 
+template<typename WideStringType>
+class wide_string_input_adapter : public input_adapter_protocol
+{
+  public:
+    explicit wide_string_input_adapter(const WideStringType& w) : str(w) {}
+
+    std::char_traits<char>::int_type get_character() noexcept override
+    {
+        // check if buffer needs to be filled
+        if (utf8_bytes_index == utf8_bytes_filled)
+        {
+            fill_buffer<sizeof(typename WideStringType::value_type)>();
+
+            assert(utf8_bytes_filled > 0);
+            assert(utf8_bytes_index == 0);
+        }
+
+        // use buffer
+        assert(utf8_bytes_filled > 0);
+        assert(utf8_bytes_index < utf8_bytes_filled);
+        return utf8_bytes[utf8_bytes_index++];
+    }
+
+  private:
+    template<size_t T>
+    void fill_buffer()
+    {
+        wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
+    }
+    
+    /// the wstring to process
+    const WideStringType& str;
+
+    /// index of the current wchar in str
+    std::size_t current_wchar = 0;
+
+    /// a buffer for UTF-8 bytes
+    std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
+
+    /// index to the utf8_codes array for the next valid byte
+    std::size_t utf8_bytes_index = 0;
+    /// number of valid bytes in the utf8_codes array
+    std::size_t utf8_bytes_filled = 0;
+};
+
 class input_adapter
 {
   public:
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index c9132fa2..7e8d707e 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -1993,51 +1993,6 @@ class input_buffer_adapter : public input_adapter_protocol
     const char* const limit;
 };
 
-template<typename WideStringType>
-class wide_string_input_adapter : public input_adapter_protocol
-{
-  public:
-    explicit wide_string_input_adapter(const WideStringType& w) : str(w) {}
-
-    std::char_traits<char>::int_type get_character() noexcept override
-    {
-        // check if buffer needs to be filled
-        if (utf8_bytes_index == utf8_bytes_filled)
-        {
-            fill_buffer<sizeof(typename WideStringType::value_type)>();
-
-            assert(utf8_bytes_filled > 0);
-            assert(utf8_bytes_index == 0);
-        }
-
-        // use buffer
-        assert(utf8_bytes_filled > 0);
-        assert(utf8_bytes_index < utf8_bytes_filled);
-        return utf8_bytes[utf8_bytes_index++];
-    }
-
-  private:
-    template<size_t T>
-    void fill_buffer()
-    {
-        wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
-    }
-    
-    /// the wstring to process
-    const WideStringType& str;
-
-    /// index of the current wchar in str
-    std::size_t current_wchar = 0;
-
-    /// a buffer for UTF-8 bytes
-    std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
-
-    /// index to the utf8_codes array for the next valid byte
-    std::size_t utf8_bytes_index = 0;
-    /// number of valid bytes in the utf8_codes array
-    std::size_t utf8_bytes_filled = 0;
-};
-
 namespace
 {
     template<typename WideStringType, size_t T>
@@ -2157,6 +2112,53 @@ namespace
     };
 }
 
+template<typename WideStringType>
+class wide_string_input_adapter : public input_adapter_protocol
+{
+  public:
+    explicit wide_string_input_adapter(const WideStringType& w) : str(w) {}
+
+    std::char_traits<char>::int_type get_character() noexcept override
+    {
+        // check if buffer needs to be filled
+        if (utf8_bytes_index == utf8_bytes_filled)
+        {
+            fill_buffer<sizeof(typename WideStringType::value_type)>();
+
+            assert(utf8_bytes_filled > 0);
+            assert(utf8_bytes_index == 0);
+        }
+
+        // use buffer
+        assert(utf8_bytes_filled > 0);
+        assert(utf8_bytes_index < utf8_bytes_filled);
+        return utf8_bytes[utf8_bytes_index++];
+    }
+
+  private:
+    template<size_t T>
+    void fill_buffer()
+    {
+        wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
+    }
+    
+    /// the wstring to process
+    const WideStringType& str;
+
+    /// index of the current wchar in str
+    std::size_t current_wchar = 0;
+
+    /// a buffer for UTF-8 bytes
+    std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
+
+    /// index to the utf8_codes array for the next valid byte
+    std::size_t utf8_bytes_index = 0;
+    /// number of valid bytes in the utf8_codes array
+    std::size_t utf8_bytes_filled = 0;
+};
+
+
+
 class input_adapter
 {
   public:

From b6fdad9acde3c6e02b551ee1b7629c91f33d11e5 Mon Sep 17 00:00:00 2001
From: Antonio Borondo <antonio.borondo@gonitro.com>
Date: Wed, 3 Oct 2018 13:51:49 +0100
Subject: [PATCH 6/6] Remove anonymous namespace

---
 .../nlohmann/detail/input/input_adapters.hpp  | 193 +++++++++---------
 single_include/nlohmann/json.hpp              | 193 +++++++++---------
 2 files changed, 190 insertions(+), 196 deletions(-)

diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp
index 9b57e210..bf069e83 100644
--- a/include/nlohmann/detail/input/input_adapters.hpp
+++ b/include/nlohmann/detail/input/input_adapters.hpp
@@ -115,124 +115,121 @@ class input_buffer_adapter : public input_adapter_protocol
     const char* const limit;
 };
 
-namespace
+template<typename WideStringType, size_t T>
+struct wide_string_input_helper
 {
-    template<typename WideStringType, size_t T>
-    struct wide_string_input_helper
+    // UTF-32
+    static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
     {
-        // UTF-32
-        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
-        {
-            utf8_bytes_index = 0;
+        utf8_bytes_index = 0;
 
-            if (current_wchar == str.size())
+        if (current_wchar == str.size())
+        {
+            utf8_bytes[0] = std::char_traits<char>::eof();
+            utf8_bytes_filled = 1;
+        }
+        else
+        {
+            // get the current character
+            const int wc = static_cast<int>(str[current_wchar++]);
+
+            // UTF-32 to UTF-8 encoding
+            if (wc < 0x80)
             {
-                utf8_bytes[0] = std::char_traits<char>::eof();
+                utf8_bytes[0] = wc;
                 utf8_bytes_filled = 1;
             }
+            else if (wc <= 0x7FF)
+            {
+                utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
+                utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 2;
+            }
+            else if (wc <= 0xFFFF)
+            {
+                utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
+                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 3;
+            }
+            else if (wc <= 0x10FFFF)
+            {
+                utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
+                utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
+                utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
+                utf8_bytes[3] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 4;
+            }
             else
             {
-                // get the current character
-                const int wc = static_cast<int>(str[current_wchar++]);
+                // unknown character
+                utf8_bytes[0] = wc;
+                utf8_bytes_filled = 1;
+            }
+        }
+    }
+};
 
-                // UTF-32 to UTF-8 encoding
-                if (wc < 0x80)
+template<typename WideStringType>
+struct wide_string_input_helper<WideStringType, 2>
+{
+    // UTF-16
+    static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
+    {
+        utf8_bytes_index = 0;
+
+        if (current_wchar == str.size())
+        {
+            utf8_bytes[0] = std::char_traits<char>::eof();
+            utf8_bytes_filled = 1;
+        }
+        else
+        {
+            // get the current character
+            const int wc = static_cast<int>(str[current_wchar++]);
+
+            // UTF-16 to UTF-8 encoding
+            if (wc < 0x80)
+            {
+                utf8_bytes[0] = wc;
+                utf8_bytes_filled = 1;
+            }
+            else if (wc <= 0x7FF)
+            {
+                utf8_bytes[0] = 0xC0 | ((wc >> 6));
+                utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 2;
+            }
+            else if (0xD800 > wc or wc >= 0xE000)
+            {
+                utf8_bytes[0] = 0xE0 | ((wc >> 12));
+                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 3;
+            }
+            else
+            {
+                if (current_wchar < str.size())
                 {
-                    utf8_bytes[0] = wc;
-                    utf8_bytes_filled = 1;
-                }
-                else if (wc <= 0x7FF)
-                {
-                    utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
-                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 2;
-                }
-                else if (wc <= 0xFFFF)
-                {
-                    utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
-                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 3;
-                }
-                else if (wc <= 0x10FFFF)
-                {
-                    utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
-                    utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
-                    utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
-                    utf8_bytes[3] = 0x80 | (wc & 0x3F);
+                    const int wc2 = static_cast<int>(str[current_wchar++]);
+                    const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
+                    utf8_bytes[0] = 0xf0 | (charcode >> 18);
+                    utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
+                    utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
+                    utf8_bytes[3] = 0x80 | (charcode & 0x3F);
                     utf8_bytes_filled = 4;
                 }
                 else
                 {
                     // unknown character
+                    ++current_wchar;
                     utf8_bytes[0] = wc;
                     utf8_bytes_filled = 1;
                 }
             }
         }
-    };
-
-    template<typename WideStringType>
-    struct wide_string_input_helper<WideStringType, 2>
-    {
-        // UTF-16
-        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
-        {
-            utf8_bytes_index = 0;
-
-            if (current_wchar == str.size())
-            {
-                utf8_bytes[0] = std::char_traits<char>::eof();
-                utf8_bytes_filled = 1;
-            }
-            else
-            {
-                // get the current character
-                const int wc = static_cast<int>(str[current_wchar++]);
-
-                // UTF-16 to UTF-8 encoding
-                if (wc < 0x80)
-                {
-                    utf8_bytes[0] = wc;
-                    utf8_bytes_filled = 1;
-                }
-                else if (wc <= 0x7FF)
-                {
-                    utf8_bytes[0] = 0xC0 | ((wc >> 6));
-                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 2;
-                }
-                else if (0xD800 > wc or wc >= 0xE000)
-                {
-                    utf8_bytes[0] = 0xE0 | ((wc >> 12));
-                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 3;
-                }
-                else
-                {
-                    if (current_wchar < str.size())
-                    {
-                        const int wc2 = static_cast<int>(str[current_wchar++]);
-                        const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
-                        utf8_bytes[0] = 0xf0 | (charcode >> 18);
-                        utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
-                        utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
-                        utf8_bytes[3] = 0x80 | (charcode & 0x3F);
-                        utf8_bytes_filled = 4;
-                    }
-                    else
-                    {
-                        // unknown character
-                        ++current_wchar;
-                        utf8_bytes[0] = wc;
-                        utf8_bytes_filled = 1;
-                    }
-                }
-            }
-        }
-    };
-}
+    }
+};
 
 template<typename WideStringType>
 class wide_string_input_adapter : public input_adapter_protocol
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index 7e8d707e..d276a673 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -1993,124 +1993,121 @@ class input_buffer_adapter : public input_adapter_protocol
     const char* const limit;
 };
 
-namespace
+template<typename WideStringType, size_t T>
+struct wide_string_input_helper
 {
-    template<typename WideStringType, size_t T>
-    struct wide_string_input_helper
+    // UTF-32
+    static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
     {
-        // UTF-32
-        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
-        {
-            utf8_bytes_index = 0;
+        utf8_bytes_index = 0;
 
-            if (current_wchar == str.size())
+        if (current_wchar == str.size())
+        {
+            utf8_bytes[0] = std::char_traits<char>::eof();
+            utf8_bytes_filled = 1;
+        }
+        else
+        {
+            // get the current character
+            const int wc = static_cast<int>(str[current_wchar++]);
+
+            // UTF-32 to UTF-8 encoding
+            if (wc < 0x80)
             {
-                utf8_bytes[0] = std::char_traits<char>::eof();
+                utf8_bytes[0] = wc;
                 utf8_bytes_filled = 1;
             }
+            else if (wc <= 0x7FF)
+            {
+                utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
+                utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 2;
+            }
+            else if (wc <= 0xFFFF)
+            {
+                utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
+                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 3;
+            }
+            else if (wc <= 0x10FFFF)
+            {
+                utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
+                utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
+                utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
+                utf8_bytes[3] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 4;
+            }
             else
             {
-                // get the current character
-                const int wc = static_cast<int>(str[current_wchar++]);
+                // unknown character
+                utf8_bytes[0] = wc;
+                utf8_bytes_filled = 1;
+            }
+        }
+    }
+};
 
-                // UTF-32 to UTF-8 encoding
-                if (wc < 0x80)
+template<typename WideStringType>
+struct wide_string_input_helper<WideStringType, 2>
+{
+    // UTF-16
+    static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
+    {
+        utf8_bytes_index = 0;
+
+        if (current_wchar == str.size())
+        {
+            utf8_bytes[0] = std::char_traits<char>::eof();
+            utf8_bytes_filled = 1;
+        }
+        else
+        {
+            // get the current character
+            const int wc = static_cast<int>(str[current_wchar++]);
+
+            // UTF-16 to UTF-8 encoding
+            if (wc < 0x80)
+            {
+                utf8_bytes[0] = wc;
+                utf8_bytes_filled = 1;
+            }
+            else if (wc <= 0x7FF)
+            {
+                utf8_bytes[0] = 0xC0 | ((wc >> 6));
+                utf8_bytes[1] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 2;
+            }
+            else if (0xD800 > wc or wc >= 0xE000)
+            {
+                utf8_bytes[0] = 0xE0 | ((wc >> 12));
+                utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
+                utf8_bytes[2] = 0x80 | (wc & 0x3F);
+                utf8_bytes_filled = 3;
+            }
+            else
+            {
+                if (current_wchar < str.size())
                 {
-                    utf8_bytes[0] = wc;
-                    utf8_bytes_filled = 1;
-                }
-                else if (wc <= 0x7FF)
-                {
-                    utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
-                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 2;
-                }
-                else if (wc <= 0xFFFF)
-                {
-                    utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
-                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 3;
-                }
-                else if (wc <= 0x10FFFF)
-                {
-                    utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
-                    utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
-                    utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
-                    utf8_bytes[3] = 0x80 | (wc & 0x3F);
+                    const int wc2 = static_cast<int>(str[current_wchar++]);
+                    const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
+                    utf8_bytes[0] = 0xf0 | (charcode >> 18);
+                    utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
+                    utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
+                    utf8_bytes[3] = 0x80 | (charcode & 0x3F);
                     utf8_bytes_filled = 4;
                 }
                 else
                 {
                     // unknown character
+                    ++current_wchar;
                     utf8_bytes[0] = wc;
                     utf8_bytes_filled = 1;
                 }
             }
         }
-    };
-
-    template<typename WideStringType>
-    struct wide_string_input_helper<WideStringType, 2>
-    {
-        // UTF-16
-        static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
-        {
-            utf8_bytes_index = 0;
-
-            if (current_wchar == str.size())
-            {
-                utf8_bytes[0] = std::char_traits<char>::eof();
-                utf8_bytes_filled = 1;
-            }
-            else
-            {
-                // get the current character
-                const int wc = static_cast<int>(str[current_wchar++]);
-
-                // UTF-16 to UTF-8 encoding
-                if (wc < 0x80)
-                {
-                    utf8_bytes[0] = wc;
-                    utf8_bytes_filled = 1;
-                }
-                else if (wc <= 0x7FF)
-                {
-                    utf8_bytes[0] = 0xC0 | ((wc >> 6));
-                    utf8_bytes[1] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 2;
-                }
-                else if (0xD800 > wc or wc >= 0xE000)
-                {
-                    utf8_bytes[0] = 0xE0 | ((wc >> 12));
-                    utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
-                    utf8_bytes[2] = 0x80 | (wc & 0x3F);
-                    utf8_bytes_filled = 3;
-                }
-                else
-                {
-                    if (current_wchar < str.size())
-                    {
-                        const int wc2 = static_cast<int>(str[current_wchar++]);
-                        const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
-                        utf8_bytes[0] = 0xf0 | (charcode >> 18);
-                        utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
-                        utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
-                        utf8_bytes[3] = 0x80 | (charcode & 0x3F);
-                        utf8_bytes_filled = 4;
-                    }
-                    else
-                    {
-                        // unknown character
-                        ++current_wchar;
-                        utf8_bytes[0] = wc;
-                        utf8_bytes_filled = 1;
-                    }
-                }
-            }
-        }
-    };
-}
+    }
+};
 
 template<typename WideStringType>
 class wide_string_input_adapter : public input_adapter_protocol