1 #ifndef TSTRINGS_H_INCLUDED_ 2 #define TSTRINGS_H_INCLUDED_ 4 #define KBLIB_DEF_MACROS 1 5 #include "kblib/kblib.h" 7 #include "cppcoro/generator.hpp" 13 #include <string_view> 14 #include <type_traits> 18 #include "containers.h" 20 #include "floating_array.h" 27 inline std::string compat_filter(std::string_view in) {
30 for (
auto [c, i] : kblib::enumerate(in)) {
36 ret.push_back(in[i - 1]);
40 if (kblib::contains(
"<>{}", c)) {
49 [[nodiscard]]
inline std::string unescape(std::string_view in) {
69 }
else if (c ==
'<' or c ==
'>') {
80 std::pair<int, bool> argsDeclared(std::string_view in);
84 using arg_t = std::variant<std::string, std::vector<std::string>,
const node*,
86 using argslist = std::vector<arg_t>;
88 [[nodiscard]] std::string stringize(
const arg_t& arg);
89 [[nodiscard]] std::string stringize(arg_t&& arg);
93 [[nodiscard]]
virtual arg_t operator()(argslist)
const = 0;
99 [[nodiscard]] arg_t operator()(argslist v)
const override;
107 [[nodiscard]] arg_t operator()(argslist v)
const override;
114 template <
typename T>
116 std::is_convertible<decltype(std::declval<T>()(std::declval<argslist>())),
119 template <
typename T,
typename = std::
void_t<>>
123 public std::false_type {};
125 template <
typename T>
128 template <
typename T>
132 template <
typename Callable,
133 typename std::enable_if_t<helpers::is_transformer_v<Callable>,
int> =
138 [[nodiscard]] arg_t operator()(argslist v)
const override {
139 return c(std::move(v));
146 template <
typename Callable>
147 [[nodiscard]] std::unique_ptr<dynamic_transformer<std::decay_t<Callable>>>
148 make_transformer(Callable&& c) {
149 return std::make_unique<dynamic_transformer<std::decay_t<Callable>>>(
150 std::forward<Callable>(c));
153 enum class op : unsigned char {
164 std::variant<std::monostate, int, std::string, const transformer*>;
170 using bytecodes = boost::container::small_vector<bytecode_op, 16>;
177 int expansionsLimit{};
178 int* expansions{
nullptr};
183 return {c.depthLimit, c.expansionsLimit, c.expansions, c.depth + 1};
189 ArgsType copy(
const ArgsType& special,
const std::vector<std::string>& vals);
191 [[nodiscard]] tmap<std::string, std::unique_ptr<transformer>>
193 [[nodiscard]] std::vector<std::pair<std::string, int>> default_names();
198 tmap<std::string, std::unique_ptr<transformer>> transformers;
199 std::vector<std::pair<std::string, int>> arg_names;
203 : transformers(default_transformers(
this, owner, rng)),
204 arg_names(default_names()) {
205 transformers[
"."] = std::make_unique<Echo>();
209 : transformers(std::move(t)), arg_names(std::move(a)) {
210 transformers[
"."] = std::make_unique<Echo>();
213 [[nodiscard]] bytecodes compile(
const std::string&)
const;
214 [[nodiscard]] cppcoro::generator<std::string>
215 to_bytes_test(std::string_view)
const;
216 [[nodiscard]] std::string eval(
const bytecodes&,
217 const std::vector<std::string>&,
220 std::map<std::string, arg_t> variables;
245 [[nodiscard]]
int special_argument(std::string_view)
const;
246 [[nodiscard]]
int min_argument()
const;
249 [[nodiscard]]
const transformer& lookup(
const std::string& name)
const 251 return *transformers.at(name);
265 [[nodiscard]]
const std::string& reverse_lookup(
const transformer& t)
const 270 bool set(std::string key, std::unique_ptr<transformer> val) {
271 return transformers.emplace(std::move(key), std::move(val)).second;
275 void reset(
const std::string& key, std::unique_ptr<transformer> val) {
278 assert(key !=
"."sv);
279 auto it = transformers.find(key);
282 it->second = std::move(val);
285 void unset(
const std::string& key) {
287 assert(key !=
"."sv);
288 auto it = transformers.find(key);
289 assert(it != transformers.end());
290 transformers.erase(it);
297 [[nodiscard]] std::string to_string(
const bytecode_op& op,
299 [[nodiscard]] std::string to_string(
const op_data& op,
301 [[nodiscard]] std::string serialize(
const bytecode_op& op,
304 #endif // TSTRINGS_H_INCLUDED_ Definition: interpolate.h:167
Definition: tstrings.h:97
Definition: tstrings.h:104
Definition: interpolate.h:198
Definition: tstrings.cpp:16
Definition: floating_array.h:21
Definition: tstrings.h:166
Definition: tstrings.h:113
Definition: tstrings.h:175
Definition: tstrings.h:196