Mercurial > minori
comparison dep/toml11/toml/utility.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 2017. | |
| 2 // Distributed under the MIT License. | |
| 3 #ifndef TOML11_UTILITY_HPP | |
| 4 #define TOML11_UTILITY_HPP | |
| 5 #include <memory> | |
| 6 #include <sstream> | |
| 7 #include <utility> | |
| 8 | |
| 9 #include "traits.hpp" | |
| 10 #include "version.hpp" | |
| 11 | |
| 12 #if TOML11_CPLUSPLUS_STANDARD_VERSION >= 201402L | |
| 13 # define TOML11_MARK_AS_DEPRECATED(msg) [[deprecated(msg)]] | |
| 14 #elif defined(__GNUC__) | |
| 15 # define TOML11_MARK_AS_DEPRECATED(msg) __attribute__((deprecated(msg))) | |
| 16 #elif defined(_MSC_VER) | |
| 17 # define TOML11_MARK_AS_DEPRECATED(msg) __declspec(deprecated(msg)) | |
| 18 #else | |
| 19 # define TOML11_MARK_AS_DEPRECATED | |
| 20 #endif | |
| 21 | |
| 22 namespace toml | |
| 23 { | |
| 24 | |
| 25 #if TOML11_CPLUSPLUS_STANDARD_VERSION >= 201402L | |
| 26 | |
| 27 using std::make_unique; | |
| 28 | |
| 29 #else | |
| 30 | |
| 31 template<typename T, typename ... Ts> | |
| 32 inline std::unique_ptr<T> make_unique(Ts&& ... args) | |
| 33 { | |
| 34 return std::unique_ptr<T>(new T(std::forward<Ts>(args)...)); | |
| 35 } | |
| 36 | |
| 37 #endif // TOML11_CPLUSPLUS_STANDARD_VERSION >= 2014 | |
| 38 | |
| 39 namespace detail | |
| 40 { | |
| 41 template<typename Container> | |
| 42 void try_reserve_impl(Container& container, std::size_t N, std::true_type) | |
| 43 { | |
| 44 container.reserve(N); | |
| 45 return; | |
| 46 } | |
| 47 template<typename Container> | |
| 48 void try_reserve_impl(Container&, std::size_t, std::false_type) noexcept | |
| 49 { | |
| 50 return; | |
| 51 } | |
| 52 } // detail | |
| 53 | |
| 54 template<typename Container> | |
| 55 void try_reserve(Container& container, std::size_t N) | |
| 56 { | |
| 57 if(N <= container.size()) {return;} | |
| 58 detail::try_reserve_impl(container, N, detail::has_reserve_method<Container>{}); | |
| 59 return; | |
| 60 } | |
| 61 | |
| 62 namespace detail | |
| 63 { | |
| 64 inline std::string concat_to_string_impl(std::ostringstream& oss) | |
| 65 { | |
| 66 return oss.str(); | |
| 67 } | |
| 68 template<typename T, typename ... Ts> | |
| 69 std::string concat_to_string_impl(std::ostringstream& oss, T&& head, Ts&& ... tail) | |
| 70 { | |
| 71 oss << std::forward<T>(head); | |
| 72 return concat_to_string_impl(oss, std::forward<Ts>(tail) ... ); | |
| 73 } | |
| 74 } // detail | |
| 75 | |
| 76 template<typename ... Ts> | |
| 77 std::string concat_to_string(Ts&& ... args) | |
| 78 { | |
| 79 std::ostringstream oss; | |
| 80 oss << std::boolalpha << std::fixed; | |
| 81 return detail::concat_to_string_impl(oss, std::forward<Ts>(args) ...); | |
| 82 } | |
| 83 | |
| 84 template<typename T> | |
| 85 T from_string(const std::string& str, T opt) | |
| 86 { | |
| 87 T v(opt); | |
| 88 std::istringstream iss(str); | |
| 89 iss >> v; | |
| 90 return v; | |
| 91 } | |
| 92 | |
| 93 namespace detail | |
| 94 { | |
| 95 #if TOML11_CPLUSPLUS_STANDARD_VERSION >= 201402L | |
| 96 template<typename T> | |
| 97 decltype(auto) last_one(T&& tail) noexcept | |
| 98 { | |
| 99 return std::forward<T>(tail); | |
| 100 } | |
| 101 | |
| 102 template<typename T, typename ... Ts> | |
| 103 decltype(auto) last_one(T&& /*head*/, Ts&& ... tail) noexcept | |
| 104 { | |
| 105 return last_one(std::forward<Ts>(tail)...); | |
| 106 } | |
| 107 #else // C++11 | |
| 108 // The following code | |
| 109 // ```cpp | |
| 110 // 1 | template<typename T, typename ... Ts> | |
| 111 // 2 | auto last_one(T&& /*head*/, Ts&& ... tail) | |
| 112 // 3 | -> decltype(last_one(std::forward<Ts>(tail)...)) | |
| 113 // 4 | { | |
| 114 // 5 | return last_one(std::forward<Ts>(tail)...); | |
| 115 // 6 | } | |
| 116 // ``` | |
| 117 // does not work because the function `last_one(...)` is not yet defined at | |
| 118 // line #3, so `decltype()` cannot deduce the type returned from `last_one`. | |
| 119 // So we need to determine return type in a different way, like a meta func. | |
| 120 | |
| 121 template<typename T, typename ... Ts> | |
| 122 struct last_one_in_pack | |
| 123 { | |
| 124 using type = typename last_one_in_pack<Ts...>::type; | |
| 125 }; | |
| 126 template<typename T> | |
| 127 struct last_one_in_pack<T> | |
| 128 { | |
| 129 using type = T; | |
| 130 }; | |
| 131 template<typename ... Ts> | |
| 132 using last_one_in_pack_t = typename last_one_in_pack<Ts...>::type; | |
| 133 | |
| 134 template<typename T> | |
| 135 T&& last_one(T&& tail) noexcept | |
| 136 { | |
| 137 return std::forward<T>(tail); | |
| 138 } | |
| 139 template<typename T, typename ... Ts> | |
| 140 enable_if_t<(sizeof...(Ts) > 0), last_one_in_pack_t<Ts&& ...>> | |
| 141 last_one(T&& /*head*/, Ts&& ... tail) | |
| 142 { | |
| 143 return last_one(std::forward<Ts>(tail)...); | |
| 144 } | |
| 145 | |
| 146 #endif | |
| 147 } // detail | |
| 148 | |
| 149 }// toml | |
| 150 #endif // TOML11_UTILITY |
