diff --git a/src/json.hpp b/src/json.hpp
index 73eb7e59..54ee2ebd 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -416,12 +416,12 @@ class basic_json
         // the initializer list could describe an object
         bool is_object = true;
 
-        // check if each element is an array with two elements whose first
-        // element is a string
+        // check if each element is an array with two elements whose first element
+        // is a string
         for (const auto& element : init)
         {
-            if ((element.m_type != value_t::array or element.size() != 2
-                    or element[0].m_type != value_t::string))
+            if (element.m_type != value_t::array or element.size() != 2
+                    or element[0].m_type != value_t::string)
             {
                 // we found an element that makes it impossible to use the
                 // initializer list as object
@@ -754,12 +754,6 @@ class basic_json
         return m_type;
     }
 
-    /// return the type of the object (implicit)
-    inline operator value_t() const noexcept
-    {
-        return m_type;
-    }
-
     // return whether value is null
     inline bool is_null() const noexcept
     {
@@ -796,6 +790,12 @@ class basic_json
         return m_type == value_t::string;
     }
 
+    /// return the type of the object (implicit)
+    inline operator value_t() const noexcept
+    {
+        return m_type;
+    }
+
   private:
     //////////////////////
     // value conversion //
@@ -1079,7 +1079,6 @@ class basic_json
             throw std::runtime_error("cannot use [] with " + type_name());
         }
 
-        // fill gaps with null values
         for (size_t i = m_value.array->size(); i <= idx; ++i)
         {
             m_value.array->push_back(basic_json());
@@ -1517,7 +1516,6 @@ class basic_json
         {
             case (value_t::null):
             {
-                // null values are empty
                 return true;
             }
 
@@ -1549,7 +1547,6 @@ class basic_json
         {
             case (value_t::null):
             {
-                // null values are empty
                 return 0;
             }
 
@@ -1581,7 +1578,6 @@ class basic_json
         {
             case (value_t::null):
             {
-                // null values are empty
                 return 0;
             }
 
@@ -3562,369 +3558,758 @@ class basic_json
             // remember the begin of the token
             m_start = m_cursor;
 
-            
-    {
-        lexer_char_t yych;
-        unsigned int yyaccept = 0;
-        static const unsigned char yybm[] = {
-              0,  64,  64,  64,  64,  64,  64,  64, 
-             64,  96,  96,  64,  64,  96,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             96,  64,   0,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-            192, 192, 192, 192, 192, 192, 192, 192, 
-            192, 192,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,   0,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-             64,  64,  64,  64,  64,  64,  64,  64, 
-        };
 
-        if ((m_limit - m_cursor) < 5) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= '9') {
-            if (yych <= ' ') {
-                if (yych <= '\n') {
-                    if (yych <= 0x00) goto basic_json_parser_27;
-                    if (yych <= 0x08) goto basic_json_parser_29;
-                    if (yych >= '\n') goto basic_json_parser_4;
-                } else {
-                    if (yych == '\r') goto basic_json_parser_2;
-                    if (yych <= 0x1F) goto basic_json_parser_29;
+            {
+                lexer_char_t yych;
+                unsigned int yyaccept = 0;
+                static const unsigned char yybm[] =
+                {
+                    0,  64,  64,  64,  64,  64,  64,  64,
+                    64,  96,  96,  64,  64,  96,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    96,  64,   0,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    192, 192, 192, 192, 192, 192, 192, 192,
+                    192, 192,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,   0,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                    64,  64,  64,  64,  64,  64,  64,  64,
+                };
+
+                if ((m_limit - m_cursor) < 5)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= '9')
+                {
+                    if (yych <= ' ')
+                    {
+                        if (yych <= '\n')
+                        {
+                            if (yych <= 0x00)
+                            {
+                                goto basic_json_parser_27;
+                            }
+                            if (yych <= 0x08)
+                            {
+                                goto basic_json_parser_29;
+                            }
+                            if (yych >= '\n')
+                            {
+                                goto basic_json_parser_4;
+                            }
+                        }
+                        else
+                        {
+                            if (yych == '\r')
+                            {
+                                goto basic_json_parser_2;
+                            }
+                            if (yych <= 0x1F)
+                            {
+                                goto basic_json_parser_29;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        if (yych <= ',')
+                        {
+                            if (yych == '"')
+                            {
+                                goto basic_json_parser_26;
+                            }
+                            if (yych <= '+')
+                            {
+                                goto basic_json_parser_29;
+                            }
+                            goto basic_json_parser_14;
+                        }
+                        else
+                        {
+                            if (yych <= '-')
+                            {
+                                goto basic_json_parser_22;
+                            }
+                            if (yych <= '/')
+                            {
+                                goto basic_json_parser_29;
+                            }
+                            if (yych <= '0')
+                            {
+                                goto basic_json_parser_23;
+                            }
+                            goto basic_json_parser_25;
+                        }
+                    }
                 }
-            } else {
-                if (yych <= ',') {
-                    if (yych == '"') goto basic_json_parser_26;
-                    if (yych <= '+') goto basic_json_parser_29;
-                    goto basic_json_parser_14;
-                } else {
-                    if (yych <= '-') goto basic_json_parser_22;
-                    if (yych <= '/') goto basic_json_parser_29;
-                    if (yych <= '0') goto basic_json_parser_23;
-                    goto basic_json_parser_25;
+                else
+                {
+                    if (yych <= 'm')
+                    {
+                        if (yych <= '\\')
+                        {
+                            if (yych <= ':')
+                            {
+                                goto basic_json_parser_16;
+                            }
+                            if (yych == '[')
+                            {
+                                goto basic_json_parser_6;
+                            }
+                            goto basic_json_parser_29;
+                        }
+                        else
+                        {
+                            if (yych <= ']')
+                            {
+                                goto basic_json_parser_8;
+                            }
+                            if (yych == 'f')
+                            {
+                                goto basic_json_parser_21;
+                            }
+                            goto basic_json_parser_29;
+                        }
+                    }
+                    else
+                    {
+                        if (yych <= 'z')
+                        {
+                            if (yych <= 'n')
+                            {
+                                goto basic_json_parser_18;
+                            }
+                            if (yych == 't')
+                            {
+                                goto basic_json_parser_20;
+                            }
+                            goto basic_json_parser_29;
+                        }
+                        else
+                        {
+                            if (yych <= '{')
+                            {
+                                goto basic_json_parser_10;
+                            }
+                            if (yych == '}')
+                            {
+                                goto basic_json_parser_12;
+                            }
+                            goto basic_json_parser_29;
+                        }
+                    }
                 }
-            }
-        } else {
-            if (yych <= 'm') {
-                if (yych <= '\\') {
-                    if (yych <= ':') goto basic_json_parser_16;
-                    if (yych == '[') goto basic_json_parser_6;
-                    goto basic_json_parser_29;
-                } else {
-                    if (yych <= ']') goto basic_json_parser_8;
-                    if (yych == 'f') goto basic_json_parser_21;
-                    goto basic_json_parser_29;
-                }
-            } else {
-                if (yych <= 'z') {
-                    if (yych <= 'n') goto basic_json_parser_18;
-                    if (yych == 't') goto basic_json_parser_20;
-                    goto basic_json_parser_29;
-                } else {
-                    if (yych <= '{') goto basic_json_parser_10;
-                    if (yych == '}') goto basic_json_parser_12;
-                    goto basic_json_parser_29;
-                }
-            }
-        }
 basic_json_parser_2:
-        ++m_cursor;
-        yych = *m_cursor;
-        goto basic_json_parser_5;
+                ++m_cursor;
+                yych = *m_cursor;
+                goto basic_json_parser_5;
 basic_json_parser_3:
-        { return scan(); }
+                {
+                    return scan();
+                }
 basic_json_parser_4:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
 basic_json_parser_5:
-        if (yybm[0+yych] & 32) {
-            goto basic_json_parser_4;
-        }
-        goto basic_json_parser_3;
+                if (yybm[0 + yych] & 32)
+                {
+                    goto basic_json_parser_4;
+                }
+                goto basic_json_parser_3;
 basic_json_parser_6:
-        ++m_cursor;
-        { return token_type::begin_array; }
+                ++m_cursor;
+                {
+                    return token_type::begin_array;
+                }
 basic_json_parser_8:
-        ++m_cursor;
-        { return token_type::end_array; }
+                ++m_cursor;
+                {
+                    return token_type::end_array;
+                }
 basic_json_parser_10:
-        ++m_cursor;
-        { return token_type::begin_object; }
+                ++m_cursor;
+                {
+                    return token_type::begin_object;
+                }
 basic_json_parser_12:
-        ++m_cursor;
-        { return token_type::end_object; }
+                ++m_cursor;
+                {
+                    return token_type::end_object;
+                }
 basic_json_parser_14:
-        ++m_cursor;
-        { return token_type::value_separator; }
+                ++m_cursor;
+                {
+                    return token_type::value_separator;
+                }
 basic_json_parser_16:
-        ++m_cursor;
-        { return token_type::name_separator; }
+                ++m_cursor;
+                {
+                    return token_type::name_separator;
+                }
 basic_json_parser_18:
-        yyaccept = 0;
-        yych = *(m_marker = ++m_cursor);
-        if (yych == 'u') goto basic_json_parser_59;
+                yyaccept = 0;
+                yych = *(m_marker = ++m_cursor);
+                if (yych == 'u')
+                {
+                    goto basic_json_parser_59;
+                }
 basic_json_parser_19:
-        { return token_type::parse_error; }
+                {
+                    return token_type::parse_error;
+                }
 basic_json_parser_20:
-        yyaccept = 0;
-        yych = *(m_marker = ++m_cursor);
-        if (yych == 'r') goto basic_json_parser_55;
-        goto basic_json_parser_19;
+                yyaccept = 0;
+                yych = *(m_marker = ++m_cursor);
+                if (yych == 'r')
+                {
+                    goto basic_json_parser_55;
+                }
+                goto basic_json_parser_19;
 basic_json_parser_21:
-        yyaccept = 0;
-        yych = *(m_marker = ++m_cursor);
-        if (yych == 'a') goto basic_json_parser_50;
-        goto basic_json_parser_19;
+                yyaccept = 0;
+                yych = *(m_marker = ++m_cursor);
+                if (yych == 'a')
+                {
+                    goto basic_json_parser_50;
+                }
+                goto basic_json_parser_19;
 basic_json_parser_22:
-        yych = *++m_cursor;
-        if (yych <= '/') goto basic_json_parser_19;
-        if (yych <= '0') goto basic_json_parser_49;
-        if (yych <= '9') goto basic_json_parser_40;
-        goto basic_json_parser_19;
+                yych = *++m_cursor;
+                if (yych <= '/')
+                {
+                    goto basic_json_parser_19;
+                }
+                if (yych <= '0')
+                {
+                    goto basic_json_parser_49;
+                }
+                if (yych <= '9')
+                {
+                    goto basic_json_parser_40;
+                }
+                goto basic_json_parser_19;
 basic_json_parser_23:
-        yyaccept = 1;
-        yych = *(m_marker = ++m_cursor);
-        if (yych <= 'D') {
-            if (yych == '.') goto basic_json_parser_42;
-        } else {
-            if (yych <= 'E') goto basic_json_parser_43;
-            if (yych == 'e') goto basic_json_parser_43;
-        }
+                yyaccept = 1;
+                yych = *(m_marker = ++m_cursor);
+                if (yych <= 'D')
+                {
+                    if (yych == '.')
+                    {
+                        goto basic_json_parser_42;
+                    }
+                }
+                else
+                {
+                    if (yych <= 'E')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                    if (yych == 'e')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                }
 basic_json_parser_24:
-        { return token_type::value_number; }
+                {
+                    return token_type::value_number;
+                }
 basic_json_parser_25:
-        yyaccept = 1;
-        yych = *(m_marker = ++m_cursor);
-        goto basic_json_parser_41;
+                yyaccept = 1;
+                yych = *(m_marker = ++m_cursor);
+                goto basic_json_parser_41;
 basic_json_parser_26:
-        yyaccept = 0;
-        yych = *(m_marker = ++m_cursor);
-        if (yych <= 0x00) goto basic_json_parser_19;
-        goto basic_json_parser_31;
+                yyaccept = 0;
+                yych = *(m_marker = ++m_cursor);
+                if (yych <= 0x00)
+                {
+                    goto basic_json_parser_19;
+                }
+                goto basic_json_parser_31;
 basic_json_parser_27:
-        ++m_cursor;
-        { return token_type::end_of_input; }
+                ++m_cursor;
+                {
+                    return token_type::end_of_input;
+                }
 basic_json_parser_29:
-        yych = *++m_cursor;
-        goto basic_json_parser_19;
+                yych = *++m_cursor;
+                goto basic_json_parser_19;
 basic_json_parser_30:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
 basic_json_parser_31:
-        if (yybm[0+yych] & 64) {
-            goto basic_json_parser_30;
-        }
-        if (yych <= 0x00) goto basic_json_parser_32;
-        if (yych <= '"') goto basic_json_parser_34;
-        goto basic_json_parser_33;
-basic_json_parser_32:
-        m_cursor = m_marker;
-        if (yyaccept == 0) {
-            goto basic_json_parser_19;
-        } else {
-            goto basic_json_parser_24;
-        }
-basic_json_parser_33:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= 'e') {
-            if (yych <= '/') {
-                if (yych == '"') goto basic_json_parser_30;
-                if (yych <= '.') goto basic_json_parser_32;
-                goto basic_json_parser_30;
-            } else {
-                if (yych <= '\\') {
-                    if (yych <= '[') goto basic_json_parser_32;
+                if (yybm[0 + yych] & 64)
+                {
                     goto basic_json_parser_30;
-                } else {
-                    if (yych == 'b') goto basic_json_parser_30;
+                }
+                if (yych <= 0x00)
+                {
                     goto basic_json_parser_32;
                 }
-            }
-        } else {
-            if (yych <= 'q') {
-                if (yych <= 'f') goto basic_json_parser_30;
-                if (yych == 'n') goto basic_json_parser_30;
-                goto basic_json_parser_32;
-            } else {
-                if (yych <= 's') {
-                    if (yych <= 'r') goto basic_json_parser_30;
-                    goto basic_json_parser_32;
-                } else {
-                    if (yych <= 't') goto basic_json_parser_30;
-                    if (yych <= 'u') goto basic_json_parser_36;
-                    goto basic_json_parser_32;
+                if (yych <= '"')
+                {
+                    goto basic_json_parser_34;
+                }
+                goto basic_json_parser_33;
+basic_json_parser_32:
+                m_cursor = m_marker;
+                if (yyaccept == 0)
+                {
+                    goto basic_json_parser_19;
+                }
+                else
+                {
+                    goto basic_json_parser_24;
+                }
+basic_json_parser_33:
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= 'e')
+                {
+                    if (yych <= '/')
+                    {
+                        if (yych == '"')
+                        {
+                            goto basic_json_parser_30;
+                        }
+                        if (yych <= '.')
+                        {
+                            goto basic_json_parser_32;
+                        }
+                        goto basic_json_parser_30;
+                    }
+                    else
+                    {
+                        if (yych <= '\\')
+                        {
+                            if (yych <= '[')
+                            {
+                                goto basic_json_parser_32;
+                            }
+                            goto basic_json_parser_30;
+                        }
+                        else
+                        {
+                            if (yych == 'b')
+                            {
+                                goto basic_json_parser_30;
+                            }
+                            goto basic_json_parser_32;
+                        }
+                    }
+                }
+                else
+                {
+                    if (yych <= 'q')
+                    {
+                        if (yych <= 'f')
+                        {
+                            goto basic_json_parser_30;
+                        }
+                        if (yych == 'n')
+                        {
+                            goto basic_json_parser_30;
+                        }
+                        goto basic_json_parser_32;
+                    }
+                    else
+                    {
+                        if (yych <= 's')
+                        {
+                            if (yych <= 'r')
+                            {
+                                goto basic_json_parser_30;
+                            }
+                            goto basic_json_parser_32;
+                        }
+                        else
+                        {
+                            if (yych <= 't')
+                            {
+                                goto basic_json_parser_30;
+                            }
+                            if (yych <= 'u')
+                            {
+                                goto basic_json_parser_36;
+                            }
+                            goto basic_json_parser_32;
+                        }
+                    }
                 }
-            }
-        }
 basic_json_parser_34:
-        ++m_cursor;
-        { return token_type::value_string; }
+                ++m_cursor;
+                {
+                    return token_type::value_string;
+                }
 basic_json_parser_36:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= '@') {
-            if (yych <= '/') goto basic_json_parser_32;
-            if (yych >= ':') goto basic_json_parser_32;
-        } else {
-            if (yych <= 'F') goto basic_json_parser_37;
-            if (yych <= '`') goto basic_json_parser_32;
-            if (yych >= 'g') goto basic_json_parser_32;
-        }
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= '@')
+                {
+                    if (yych <= '/')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych >= ':')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                }
+                else
+                {
+                    if (yych <= 'F')
+                    {
+                        goto basic_json_parser_37;
+                    }
+                    if (yych <= '`')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych >= 'g')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                }
 basic_json_parser_37:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= '@') {
-            if (yych <= '/') goto basic_json_parser_32;
-            if (yych >= ':') goto basic_json_parser_32;
-        } else {
-            if (yych <= 'F') goto basic_json_parser_38;
-            if (yych <= '`') goto basic_json_parser_32;
-            if (yych >= 'g') goto basic_json_parser_32;
-        }
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= '@')
+                {
+                    if (yych <= '/')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych >= ':')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                }
+                else
+                {
+                    if (yych <= 'F')
+                    {
+                        goto basic_json_parser_38;
+                    }
+                    if (yych <= '`')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych >= 'g')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                }
 basic_json_parser_38:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= '@') {
-            if (yych <= '/') goto basic_json_parser_32;
-            if (yych >= ':') goto basic_json_parser_32;
-        } else {
-            if (yych <= 'F') goto basic_json_parser_39;
-            if (yych <= '`') goto basic_json_parser_32;
-            if (yych >= 'g') goto basic_json_parser_32;
-        }
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= '@')
+                {
+                    if (yych <= '/')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych >= ':')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                }
+                else
+                {
+                    if (yych <= 'F')
+                    {
+                        goto basic_json_parser_39;
+                    }
+                    if (yych <= '`')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych >= 'g')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                }
 basic_json_parser_39:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= '@') {
-            if (yych <= '/') goto basic_json_parser_32;
-            if (yych <= '9') goto basic_json_parser_30;
-            goto basic_json_parser_32;
-        } else {
-            if (yych <= 'F') goto basic_json_parser_30;
-            if (yych <= '`') goto basic_json_parser_32;
-            if (yych <= 'f') goto basic_json_parser_30;
-            goto basic_json_parser_32;
-        }
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= '@')
+                {
+                    if (yych <= '/')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych <= '9')
+                    {
+                        goto basic_json_parser_30;
+                    }
+                    goto basic_json_parser_32;
+                }
+                else
+                {
+                    if (yych <= 'F')
+                    {
+                        goto basic_json_parser_30;
+                    }
+                    if (yych <= '`')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych <= 'f')
+                    {
+                        goto basic_json_parser_30;
+                    }
+                    goto basic_json_parser_32;
+                }
 basic_json_parser_40:
-        yyaccept = 1;
-        m_marker = ++m_cursor;
-        if ((m_limit - m_cursor) < 3) { yyfill(); };
-        yych = *m_cursor;
+                yyaccept = 1;
+                m_marker = ++m_cursor;
+                if ((m_limit - m_cursor) < 3)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
 basic_json_parser_41:
-        if (yybm[0+yych] & 128) {
-            goto basic_json_parser_40;
-        }
-        if (yych <= 'D') {
-            if (yych != '.') goto basic_json_parser_24;
-        } else {
-            if (yych <= 'E') goto basic_json_parser_43;
-            if (yych == 'e') goto basic_json_parser_43;
-            goto basic_json_parser_24;
-        }
+                if (yybm[0 + yych] & 128)
+                {
+                    goto basic_json_parser_40;
+                }
+                if (yych <= 'D')
+                {
+                    if (yych != '.')
+                    {
+                        goto basic_json_parser_24;
+                    }
+                }
+                else
+                {
+                    if (yych <= 'E')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                    if (yych == 'e')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                    goto basic_json_parser_24;
+                }
 basic_json_parser_42:
-        yych = *++m_cursor;
-        if (yych <= '/') goto basic_json_parser_32;
-        if (yych <= '9') goto basic_json_parser_47;
-        goto basic_json_parser_32;
+                yych = *++m_cursor;
+                if (yych <= '/')
+                {
+                    goto basic_json_parser_32;
+                }
+                if (yych <= '9')
+                {
+                    goto basic_json_parser_47;
+                }
+                goto basic_json_parser_32;
 basic_json_parser_43:
-        yych = *++m_cursor;
-        if (yych <= ',') {
-            if (yych != '+') goto basic_json_parser_32;
-        } else {
-            if (yych <= '-') goto basic_json_parser_44;
-            if (yych <= '/') goto basic_json_parser_32;
-            if (yych <= '9') goto basic_json_parser_45;
-            goto basic_json_parser_32;
-        }
+                yych = *++m_cursor;
+                if (yych <= ',')
+                {
+                    if (yych != '+')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                }
+                else
+                {
+                    if (yych <= '-')
+                    {
+                        goto basic_json_parser_44;
+                    }
+                    if (yych <= '/')
+                    {
+                        goto basic_json_parser_32;
+                    }
+                    if (yych <= '9')
+                    {
+                        goto basic_json_parser_45;
+                    }
+                    goto basic_json_parser_32;
+                }
 basic_json_parser_44:
-        yych = *++m_cursor;
-        if (yych <= '/') goto basic_json_parser_32;
-        if (yych >= ':') goto basic_json_parser_32;
+                yych = *++m_cursor;
+                if (yych <= '/')
+                {
+                    goto basic_json_parser_32;
+                }
+                if (yych >= ':')
+                {
+                    goto basic_json_parser_32;
+                }
 basic_json_parser_45:
-        ++m_cursor;
-        if (m_limit <= m_cursor) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= '/') goto basic_json_parser_24;
-        if (yych <= '9') goto basic_json_parser_45;
-        goto basic_json_parser_24;
+                ++m_cursor;
+                if (m_limit <= m_cursor)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= '/')
+                {
+                    goto basic_json_parser_24;
+                }
+                if (yych <= '9')
+                {
+                    goto basic_json_parser_45;
+                }
+                goto basic_json_parser_24;
 basic_json_parser_47:
-        yyaccept = 1;
-        m_marker = ++m_cursor;
-        if ((m_limit - m_cursor) < 3) { yyfill(); };
-        yych = *m_cursor;
-        if (yych <= 'D') {
-            if (yych <= '/') goto basic_json_parser_24;
-            if (yych <= '9') goto basic_json_parser_47;
-            goto basic_json_parser_24;
-        } else {
-            if (yych <= 'E') goto basic_json_parser_43;
-            if (yych == 'e') goto basic_json_parser_43;
-            goto basic_json_parser_24;
-        }
+                yyaccept = 1;
+                m_marker = ++m_cursor;
+                if ((m_limit - m_cursor) < 3)
+                {
+                    yyfill();
+                };
+                yych = *m_cursor;
+                if (yych <= 'D')
+                {
+                    if (yych <= '/')
+                    {
+                        goto basic_json_parser_24;
+                    }
+                    if (yych <= '9')
+                    {
+                        goto basic_json_parser_47;
+                    }
+                    goto basic_json_parser_24;
+                }
+                else
+                {
+                    if (yych <= 'E')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                    if (yych == 'e')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                    goto basic_json_parser_24;
+                }
 basic_json_parser_49:
-        yyaccept = 1;
-        yych = *(m_marker = ++m_cursor);
-        if (yych <= 'D') {
-            if (yych == '.') goto basic_json_parser_42;
-            goto basic_json_parser_24;
-        } else {
-            if (yych <= 'E') goto basic_json_parser_43;
-            if (yych == 'e') goto basic_json_parser_43;
-            goto basic_json_parser_24;
-        }
+                yyaccept = 1;
+                yych = *(m_marker = ++m_cursor);
+                if (yych <= 'D')
+                {
+                    if (yych == '.')
+                    {
+                        goto basic_json_parser_42;
+                    }
+                    goto basic_json_parser_24;
+                }
+                else
+                {
+                    if (yych <= 'E')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                    if (yych == 'e')
+                    {
+                        goto basic_json_parser_43;
+                    }
+                    goto basic_json_parser_24;
+                }
 basic_json_parser_50:
-        yych = *++m_cursor;
-        if (yych != 'l') goto basic_json_parser_32;
-        yych = *++m_cursor;
-        if (yych != 's') goto basic_json_parser_32;
-        yych = *++m_cursor;
-        if (yych != 'e') goto basic_json_parser_32;
-        ++m_cursor;
-        { return token_type::literal_false; }
+                yych = *++m_cursor;
+                if (yych != 'l')
+                {
+                    goto basic_json_parser_32;
+                }
+                yych = *++m_cursor;
+                if (yych != 's')
+                {
+                    goto basic_json_parser_32;
+                }
+                yych = *++m_cursor;
+                if (yych != 'e')
+                {
+                    goto basic_json_parser_32;
+                }
+                ++m_cursor;
+                {
+                    return token_type::literal_false;
+                }
 basic_json_parser_55:
-        yych = *++m_cursor;
-        if (yych != 'u') goto basic_json_parser_32;
-        yych = *++m_cursor;
-        if (yych != 'e') goto basic_json_parser_32;
-        ++m_cursor;
-        { return token_type::literal_true; }
+                yych = *++m_cursor;
+                if (yych != 'u')
+                {
+                    goto basic_json_parser_32;
+                }
+                yych = *++m_cursor;
+                if (yych != 'e')
+                {
+                    goto basic_json_parser_32;
+                }
+                ++m_cursor;
+                {
+                    return token_type::literal_true;
+                }
 basic_json_parser_59:
-        yych = *++m_cursor;
-        if (yych != 'l') goto basic_json_parser_32;
-        yych = *++m_cursor;
-        if (yych != 'l') goto basic_json_parser_32;
-        ++m_cursor;
-        { return token_type::literal_null; }
-    }
+                yych = *++m_cursor;
+                if (yych != 'l')
+                {
+                    goto basic_json_parser_32;
+                }
+                yych = *++m_cursor;
+                if (yych != 'l')
+                {
+                    goto basic_json_parser_32;
+                }
+                ++m_cursor;
+                {
+                    return token_type::literal_null;
+                }
+            }
 
 
         }
@@ -4152,8 +4537,7 @@ basic_json_parser_59:
         /// public parser interface
         inline basic_json parse()
         {
-            basic_json result;
-            parse_internal(result);
+            basic_json result = parse_internal();
 
             expect(lexer::token_type::end_of_input);
 
@@ -4162,17 +4546,14 @@ basic_json_parser_59:
 
       private:
         /// the actual parser
-        inline void parse_internal(basic_json& pos)
+        inline basic_json parse_internal()
         {
             switch (last_token)
             {
                 case (lexer::token_type::begin_object):
                 {
                     // explicitly set result to object to cope with {}
-                    pos.m_type = value_t::object;
-                    AllocatorType<object_t> alloc;
-                    pos.m_value.object = alloc.allocate(1);
-                    alloc.construct(pos.m_value.object);
+                    basic_json result(value_t::object);
 
                     // read next token
                     get_token();
@@ -4181,7 +4562,7 @@ basic_json_parser_59:
                     if (last_token == lexer::token_type::end_object)
                     {
                         get_token();
-                        return;
+                        return result;
                     }
 
                     // otherwise: parse key-value pairs
@@ -4203,25 +4584,21 @@ basic_json_parser_59:
 
                         // parse and add value
                         get_token();
-                        auto it = pos.m_value.object->emplace(key, nullptr);
-                        parse_internal(it.first->second);
+                        result.m_value.object->emplace(key, parse_internal());
                     }
                     while (last_token == lexer::token_type::value_separator);
 
                     // closing }
                     expect(lexer::token_type::end_object);
-
                     get_token();
-                    return;
+
+                    return result;
                 }
 
                 case (lexer::token_type::begin_array):
                 {
                     // explicitly set result to object to cope with []
-                    pos.m_type = value_t::array;
-                    AllocatorType<array_t> alloc;
-                    pos.m_value.array = alloc.allocate(1);
-                    alloc.construct(pos.m_value.array);
+                    basic_json result(value_t::array);
 
                     // read next token
                     get_token();
@@ -4230,7 +4607,7 @@ basic_json_parser_59:
                     if (last_token == lexer::token_type::end_array)
                     {
                         get_token();
-                        return;
+                        return result;
                     }
 
                     // otherwise: parse values
@@ -4243,51 +4620,40 @@ basic_json_parser_59:
                         }
 
                         // parse and add value
-                        auto it = pos.m_value.array->insert(pos.m_value.array->end(), nullptr);
-                        parse_internal(*it);
+                        result.m_value.array->emplace_back(parse_internal());
                     }
                     while (last_token == lexer::token_type::value_separator);
 
                     // closing ]
                     expect(lexer::token_type::end_array);
-
                     get_token();
-                    return;
+
+                    return result;
                 }
 
                 case (lexer::token_type::literal_null):
                 {
                     get_token();
-                    return;
+                    return basic_json(nullptr);
                 }
 
                 case (lexer::token_type::value_string):
                 {
-                    pos.m_type = value_t::string;
-                    AllocatorType<string_t> alloc;
-                    pos.m_value.string = alloc.allocate(1);
-                    alloc.construct(pos.m_value.string, m_lexer.get_string());
-
+                    const auto s = m_lexer.get_string();
                     get_token();
-                    return;
+                    return basic_json(s);
                 }
 
                 case (lexer::token_type::literal_true):
                 {
-                    pos.m_type = value_t::boolean;
-                    pos.m_value.boolean = true;
-
                     get_token();
-                    return;
+                    return basic_json(true);
                 }
 
                 case (lexer::token_type::literal_false):
                 {
-                    pos.m_type = value_t::boolean;
-                    pos.m_value.boolean = false;
-
                     get_token();
-                    return;
+                    return basic_json(false);
                 }
 
                 case (lexer::token_type::value_number):
@@ -4302,23 +4668,20 @@ basic_json_parser_59:
                                                     m_lexer.get_token() + " is not a number");
                     }
 
+                    get_token();
+
                     // check if conversion loses precision
                     const auto int_val = static_cast<number_integer_t>(float_val);
                     if (approx(float_val, static_cast<number_float_t>(int_val)))
                     {
                         // we basic_json not lose precision -> return int
-                        pos.m_type = value_t::number_integer;
-                        pos.m_value.number_integer = int_val;
+                        return basic_json(int_val);
                     }
                     else
                     {
                         // we would lose precision -> returnfloat
-                        pos.m_type = value_t::number_float;
-                        pos.m_value.number_float = float_val;
+                        return basic_json(float_val);
                     }
-
-                    get_token();
-                    return;
                 }
 
                 default:
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 23d6be70..d3ee8ebb 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -416,12 +416,12 @@ class basic_json
         // the initializer list could describe an object
         bool is_object = true;
 
-        // check if each element is an array with two elements whose first
-        // element is a string
+        // check if each element is an array with two elements whose first element
+        // is a string
         for (const auto& element : init)
         {
-            if ((element.m_type != value_t::array or element.size() != 2
-                    or element[0].m_type != value_t::string))
+            if (element.m_type != value_t::array or element.size() != 2
+                    or element[0].m_type != value_t::string)
             {
                 // we found an element that makes it impossible to use the
                 // initializer list as object
@@ -754,12 +754,6 @@ class basic_json
         return m_type;
     }
 
-    /// return the type of the object (implicit)
-    inline operator value_t() const noexcept
-    {
-        return m_type;
-    }
-
     // return whether value is null
     inline bool is_null() const noexcept
     {
@@ -796,6 +790,12 @@ class basic_json
         return m_type == value_t::string;
     }
 
+    /// return the type of the object (implicit)
+    inline operator value_t() const noexcept
+    {
+        return m_type;
+    }
+
   private:
     //////////////////////
     // value conversion //
@@ -1079,7 +1079,6 @@ class basic_json
             throw std::runtime_error("cannot use [] with " + type_name());
         }
 
-        // fill gaps with null values
         for (size_t i = m_value.array->size(); i <= idx; ++i)
         {
             m_value.array->push_back(basic_json());
@@ -1517,7 +1516,6 @@ class basic_json
         {
             case (value_t::null):
             {
-                // null values are empty
                 return true;
             }
 
@@ -1549,7 +1547,6 @@ class basic_json
         {
             case (value_t::null):
             {
-                // null values are empty
                 return 0;
             }
 
@@ -1581,7 +1578,6 @@ class basic_json
         {
             case (value_t::null):
             {
-                // null values are empty
                 return 0;
             }
 
@@ -3847,8 +3843,7 @@ class basic_json
         /// public parser interface
         inline basic_json parse()
         {
-            basic_json result;
-            parse_internal(result);
+            basic_json result = parse_internal();
 
             expect(lexer::token_type::end_of_input);
 
@@ -3857,17 +3852,14 @@ class basic_json
 
       private:
         /// the actual parser
-        inline void parse_internal(basic_json& pos)
+        inline basic_json parse_internal()
         {
             switch (last_token)
             {
                 case (lexer::token_type::begin_object):
                 {
                     // explicitly set result to object to cope with {}
-                    pos.m_type = value_t::object;
-                    AllocatorType<object_t> alloc;
-                    pos.m_value.object = alloc.allocate(1);
-                    alloc.construct(pos.m_value.object);
+                    basic_json result(value_t::object);
 
                     // read next token
                     get_token();
@@ -3876,7 +3868,7 @@ class basic_json
                     if (last_token == lexer::token_type::end_object)
                     {
                         get_token();
-                        return;
+                        return result;
                     }
 
                     // otherwise: parse key-value pairs
@@ -3898,25 +3890,21 @@ class basic_json
 
                         // parse and add value
                         get_token();
-                        auto it = pos.m_value.object->emplace(key, nullptr);
-                        parse_internal(it.first->second);
+                        result.m_value.object->emplace(key, parse_internal());
                     }
                     while (last_token == lexer::token_type::value_separator);
 
                     // closing }
                     expect(lexer::token_type::end_object);
-
                     get_token();
-                    return;
+
+                    return result;
                 }
 
                 case (lexer::token_type::begin_array):
                 {
                     // explicitly set result to object to cope with []
-                    pos.m_type = value_t::array;
-                    AllocatorType<array_t> alloc;
-                    pos.m_value.array = alloc.allocate(1);
-                    alloc.construct(pos.m_value.array);
+                    basic_json result(value_t::array);
 
                     // read next token
                     get_token();
@@ -3925,7 +3913,7 @@ class basic_json
                     if (last_token == lexer::token_type::end_array)
                     {
                         get_token();
-                        return;
+                        return result;
                     }
 
                     // otherwise: parse values
@@ -3938,51 +3926,40 @@ class basic_json
                         }
 
                         // parse and add value
-                        auto it = pos.m_value.array->insert(pos.m_value.array->end(), nullptr);
-                        parse_internal(*it);
+                        result.m_value.array->emplace_back(parse_internal());
                     }
                     while (last_token == lexer::token_type::value_separator);
 
                     // closing ]
                     expect(lexer::token_type::end_array);
-
                     get_token();
-                    return;
+
+                    return result;
                 }
 
                 case (lexer::token_type::literal_null):
                 {
                     get_token();
-                    return;
+                    return basic_json(nullptr);
                 }
 
                 case (lexer::token_type::value_string):
                 {
-                    pos.m_type = value_t::string;
-                    AllocatorType<string_t> alloc;
-                    pos.m_value.string = alloc.allocate(1);
-                    alloc.construct(pos.m_value.string, m_lexer.get_string());
-
+                    const auto s = m_lexer.get_string();
                     get_token();
-                    return;
+                    return basic_json(s);
                 }
 
                 case (lexer::token_type::literal_true):
                 {
-                    pos.m_type = value_t::boolean;
-                    pos.m_value.boolean = true;
-
                     get_token();
-                    return;
+                    return basic_json(true);
                 }
 
                 case (lexer::token_type::literal_false):
                 {
-                    pos.m_type = value_t::boolean;
-                    pos.m_value.boolean = false;
-
                     get_token();
-                    return;
+                    return basic_json(false);
                 }
 
                 case (lexer::token_type::value_number):
@@ -3997,23 +3974,20 @@ class basic_json
                                                     m_lexer.get_token() + " is not a number");
                     }
 
+                    get_token();
+
                     // check if conversion loses precision
                     const auto int_val = static_cast<number_integer_t>(float_val);
                     if (approx(float_val, static_cast<number_float_t>(int_val)))
                     {
                         // we basic_json not lose precision -> return int
-                        pos.m_type = value_t::number_integer;
-                        pos.m_value.number_integer = int_val;
+                        return basic_json(int_val);
                     }
                     else
                     {
                         // we would lose precision -> returnfloat
-                        pos.m_type = value_t::number_float;
-                        pos.m_value.number_float = float_val;
+                        return basic_json(float_val);
                     }
-
-                    get_token();
-                    return;
                 }
 
                 default: