Mercurial > minori
comparison dep/toml11/toml/literal.hpp @ 318:3b355fa948c7
config: use TOML instead of INI
unfortunately, INI is not enough, and causes some paths including
semicolons to break with our current storage of the library folders.
so, I decided to switch to TOML which does support real arrays...
| author | Paper <paper@paper.us.eu.org> |
|---|---|
| date | Wed, 12 Jun 2024 05:25:41 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 317:b1f4d1867ab1 | 318:3b355fa948c7 |
|---|---|
| 1 // Copyright Toru Niina 2019. | |
| 2 // Distributed under the MIT License. | |
| 3 #ifndef TOML11_LITERAL_HPP | |
| 4 #define TOML11_LITERAL_HPP | |
| 5 #include "parser.hpp" | |
| 6 | |
| 7 namespace toml | |
| 8 { | |
| 9 inline namespace literals | |
| 10 { | |
| 11 inline namespace toml_literals | |
| 12 { | |
| 13 | |
| 14 // implementation | |
| 15 inline ::toml::basic_value<TOML11_DEFAULT_COMMENT_STRATEGY, std::unordered_map, std::vector> | |
| 16 literal_internal_impl(::toml::detail::location loc) | |
| 17 { | |
| 18 using value_type = ::toml::basic_value< | |
| 19 TOML11_DEFAULT_COMMENT_STRATEGY, std::unordered_map, std::vector>; | |
| 20 // if there are some comments or empty lines, skip them. | |
| 21 using skip_line = ::toml::detail::repeat<toml::detail::sequence< | |
| 22 ::toml::detail::maybe<::toml::detail::lex_ws>, | |
| 23 ::toml::detail::maybe<::toml::detail::lex_comment>, | |
| 24 ::toml::detail::lex_newline | |
| 25 >, ::toml::detail::at_least<1>>; | |
| 26 skip_line::invoke(loc); | |
| 27 | |
| 28 // if there are some whitespaces before a value, skip them. | |
| 29 using skip_ws = ::toml::detail::repeat< | |
| 30 ::toml::detail::lex_ws, ::toml::detail::at_least<1>>; | |
| 31 skip_ws::invoke(loc); | |
| 32 | |
| 33 // to distinguish arrays and tables, first check it is a table or not. | |
| 34 // | |
| 35 // "[1,2,3]"_toml; // this is an array | |
| 36 // "[table]"_toml; // a table that has an empty table named "table" inside. | |
| 37 // "[[1,2,3]]"_toml; // this is an array of arrays | |
| 38 // "[[table]]"_toml; // this is a table that has an array of tables inside. | |
| 39 // | |
| 40 // "[[1]]"_toml; // this can be both... (currently it becomes a table) | |
| 41 // "1 = [{}]"_toml; // this is a table that has an array of table named 1. | |
| 42 // "[[1,]]"_toml; // this is an array of arrays. | |
| 43 // "[[1],]"_toml; // this also. | |
| 44 | |
| 45 const auto the_front = loc.iter(); | |
| 46 | |
| 47 const bool is_table_key = ::toml::detail::lex_std_table::invoke(loc); | |
| 48 loc.reset(the_front); | |
| 49 | |
| 50 const bool is_aots_key = ::toml::detail::lex_array_table::invoke(loc); | |
| 51 loc.reset(the_front); | |
| 52 | |
| 53 // If it is neither a table-key or a array-of-table-key, it may be a value. | |
| 54 if(!is_table_key && !is_aots_key) | |
| 55 { | |
| 56 if(auto data = ::toml::detail::parse_value<value_type>(loc, 0)) | |
| 57 { | |
| 58 return data.unwrap(); | |
| 59 } | |
| 60 } | |
| 61 | |
| 62 // Note that still it can be a table, because the literal might be something | |
| 63 // like the following. | |
| 64 // ```cpp | |
| 65 // R"( // c++11 raw string literals | |
| 66 // key = "value" | |
| 67 // int = 42 | |
| 68 // )"_toml; | |
| 69 // ``` | |
| 70 // It is a valid toml file. | |
| 71 // It should be parsed as if we parse a file with this content. | |
| 72 | |
| 73 if(auto data = ::toml::detail::parse_toml_file<value_type>(loc)) | |
| 74 { | |
| 75 return data.unwrap(); | |
| 76 } | |
| 77 else // none of them. | |
| 78 { | |
| 79 throw ::toml::syntax_error(data.unwrap_err(), source_location(loc)); | |
| 80 } | |
| 81 | |
| 82 } | |
| 83 | |
| 84 inline ::toml::basic_value<TOML11_DEFAULT_COMMENT_STRATEGY, std::unordered_map, std::vector> | |
| 85 operator"" _toml(const char* str, std::size_t len) | |
| 86 { | |
| 87 ::toml::detail::location loc( | |
| 88 std::string("TOML literal encoded in a C++ code"), | |
| 89 std::vector<char>(str, str + len)); | |
| 90 // literal length does not include the null character at the end. | |
| 91 return literal_internal_impl(std::move(loc)); | |
| 92 } | |
| 93 | |
| 94 // value of __cplusplus in C++2a/20 mode is not fixed yet along compilers. | |
| 95 // So here we use the feature test macro for `char8_t` itself. | |
| 96 #if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L | |
| 97 // value of u8"" literal has been changed from char to char8_t and char8_t is | |
| 98 // NOT compatible to char | |
| 99 inline ::toml::basic_value<TOML11_DEFAULT_COMMENT_STRATEGY, std::unordered_map, std::vector> | |
| 100 operator"" _toml(const char8_t* str, std::size_t len) | |
| 101 { | |
| 102 ::toml::detail::location loc( | |
| 103 std::string("TOML literal encoded in a C++ code"), | |
| 104 std::vector<char>(reinterpret_cast<const char*>(str), | |
| 105 reinterpret_cast<const char*>(str) + len)); | |
| 106 return literal_internal_impl(std::move(loc)); | |
| 107 } | |
| 108 #endif | |
| 109 | |
| 110 } // toml_literals | |
| 111 } // literals | |
| 112 } // toml | |
| 113 #endif//TOML11_LITERAL_HPP |
