13template<concepts::Encoding Enc>
20 enum class IndexingMode {
27 constexpr explicit FormatParseContext(View view,
size_t arg_count) : m_view(view), m_arg_count(arg_count) {}
39 : m_data(
data), m_position(
data.begin()), m_parent(util::addressof(parent)) {
50 constexpr auto operator*() const ->
Value&& {
return util::move(m_parent->m_current_value); }
53 if (m_position == m_data.end()) {
58 auto start = m_position;
61 if (*m_position == CodePoint(
'{')) {
65 if (m_position == m_data.end()) {
66 return set_error(BasicError::InvalidArgument);
70 if (*m_position == CodePoint(
'{')) {
71 set_value(m_data.substr(start, m_position));
77 size_t left_brace_count = 1;
78 for (; left_brace_count && m_position != m_data.end(); ++m_position) {
79 if (*m_position == CodePoint(
'{')) {
81 }
else if (*m_position == CodePoint(
'}')) {
86 if (left_brace_count > 0) {
87 return set_error(BasicError::InvalidArgument);
99 auto digit_result = *digit_parser.parse(inside_view_context);
100 if (!digit_result.empty()) {
103 return set_error(util::move(index).error());
105 auto result = m_parent->check_arg_index(*index);
107 return set_error(util::move(result).error());
109 inside_view.replace_begin(digit_result.end());
113 auto result = m_parent->next_arg_index();
115 return set_error(util::move(result).error());
121 if (!inside_view.empty() && !inside_view.starts_with(CodePoint(
':'))) {
122 return set_error(BasicError::InvalidArgument);
126 if (!inside_view.empty()) {
127 inside_view = inside_view.substr(
container::next(inside_view.begin()));
132 return set_value(
Argument { inside_view, arg_index });
136 if (*m_position == CodePoint(
'}')) {
140 if (m_position == m_data.end() || *m_position != CodePoint(
'}')) {
141 return set_error(BasicError::InvalidArgument);
144 set_value(m_data.substr(start, m_position));
152 }
while (m_position != m_data.end() && *m_position != CodePoint(
'{') && *m_position != CodePoint(
'}'));
153 set_value(m_data.substr(start, m_position));
159 constexpr void set_error(
Error error) {
161#pragma GCC diagnostic push
162#pragma GCC diagnostic ignored "-Wredundant-consteval-if"
168#pragma GCC diagnostic pop
170 m_position = m_data.
end();
171 set_value(util::move(error));
174 constexpr void set_value(View view) { m_parent->m_current_value.emplace(
c_<0ZU>, view); }
175 constexpr void set_value(Argument argument) {
176 m_parent->m_current_format_string = argument.format_string;
177 m_parent->m_current_value.emplace(
c_<1ZU>, argument);
179 constexpr void set_value(
Error error) { m_parent->m_current_value =
Unexpected(util::move(error)); }
184 bool m_at_end {
false };
194 if (m_indexing_mode == IndexingMode::Manual) {
195 return Unexpected(BasicError::InvalidArgument);
197 m_indexing_mode = IndexingMode::Automatic;
199 auto index = m_next_arg_index++;
200 if (index >= m_arg_count) {
201 return Unexpected(BasicError::InvalidArgument);
207 if (m_indexing_mode == IndexingMode::Automatic) {
208 return Unexpected(BasicError::InvalidArgument);
210 m_indexing_mode = IndexingMode::Manual;
212 if (index >= m_arg_count) {
213 return Unexpected(BasicError::InvalidArgument);
220 IndexingMode m_indexing_mode { IndexingMode::Unknown };
221 Value m_current_value;
222 View m_current_format_string;
223 size_t m_next_arg_index { 0 };
224 size_t m_arg_count { 0 };
Definition fixed_string.h:7
constexpr auto end() const
Definition constant_string_interface.h:70
Definition string_view_impl_forward_declaration.h:7
Definition format_parse_context.h:14
constexpr auto current_format_string() const -> View
Definition format_parse_context.h:191
constexpr auto next_arg_index() -> Result< size_t >
Definition format_parse_context.h:193
Result< Variant< View, Argument > > Value
Definition format_parse_context.h:34
constexpr void set_current_format_string(View view)
Definition format_parse_context.h:190
constexpr FormatParseContext(View view, size_t arg_count)
Definition format_parse_context.h:27
constexpr auto end() const
Definition format_parse_context.h:188
constexpr auto check_arg_index(size_t index) -> Result< void >
Definition format_parse_context.h:206
constexpr auto begin()
Definition format_parse_context.h:187
Definition string_view_parser_context.h:8
Definition unexpected.h:14
constexpr auto prev
Definition prev.h:28
constexpr auto next
Definition next.h:35
View(Iter, Sent) -> View< Iter, Sent >
constexpr auto default_sentinel
Definition default_sentinel.h:6
Definition integral_set.h:125
constexpr auto run_parser
Definition run_parser.h:22
constexpr auto integer
Definition integer.h:212
constexpr auto match_zero_or_more
Definition match_zero_or_more.h:48
void compile_time_fail()
Definition compile_time_fail.h:7
Expected< T, Error > Result
Definition result.h:8
StatusCode< Erased< long > > Error
Definition error.h:8
Unexpected(E &&) -> Unexpected< meta::UnwrapRefDecay< E > >
Definition zstring_parser.h:9
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto data
Definition data.h:51
Definition default_sentinel.h:4
Definition iterator_base.h:14
Definition format_parse_context.h:29
View format_string
Definition format_parse_context.h:30
size_t index
Definition format_parse_context.h:31
Definition format_parse_context.h:36
constexpr friend auto operator==(Iterator const &a, container::DefaultSentinel) -> bool
Definition format_parse_context.h:157
constexpr void advance_one()
Definition format_parse_context.h:52
constexpr auto operator*() const -> Value &&
Definition format_parse_context.h:50
friend class FormatParseContext
Definition format_parse_context.h:43
Enc Encoding
Definition format_parse_context.h:46