13#if !defined(ULTRA_INDIVIDUAL_FORMAT_H)
14#define ULTRA_INDIVIDUAL_FORMAT_H
26std::ostream &operator<<(std::ostream &,
const individual &);
38 friend std::ostream &operator<<(std::ostream &, print_format);
46std::ostream &
dump(std::ostream &);
47std::ostream &
graphviz(std::ostream &);
48std::ostream &
in_line(std::ostream &);
49std::ostream &
list(std::ostream &);
51std::ostream &
tree(std::ostream &);
59template<>
struct formatter<
ultra::individual, char>
63 [[nodiscard]]
constexpr auto parse(std::format_parse_context &ctx)
66 const auto end(ctx.end());
68 if (it == end || *it ==
'}')
71 const auto consume([&]<std::size_t N>(
const char (&s)[N],
76 for (std::size_t i(0); i < N - 1; ++i)
78 if (probe == end || *probe != s[i])
90 if (consume(
"graphviz", ultra::out::graphviz_f)
91 || consume(
"python", ultra::out::python_language_f)
92 || consume(
"inline", ultra::out::in_line_f)
93 || consume(
"dump", ultra::out::dump_f)
94 || consume(
"list", ultra::out::list_f)
95 || consume(
"tree", ultra::out::tree_f)
96 || consume(
"cpp", ultra::out::cpp_language_f)
97 || consume(
"c", ultra::out::c_language_f))
99 if (it != end && *it !=
'}')
100 throw std::format_error(
"invalid trailing format specifier for "
101 "ultra::individual");
106 throw std::format_error(
"invalid format specifier for ultra::individual");
109 template<
class FormatContext>
111 FormatContext &ctx)
const
113 const auto s(ind.
format(fmt_));
114 return std::ranges::copy(s, ctx.out()).out;
118template<std::derived_from<ultra::indiv
idual> T>
119struct formatter<T, char> : formatter<ultra::individual, char>
Definition individual.h:54
std::string format(out::print_format_t) const
Definition individual.cc:140
print_format_t
Rendering format used to print an individual.
Definition individual.h:29