6#ifndef MIMICPP_PRINTING_TYPE_NAME_PARSER_TOKENS_HPP
7#define MIMICPP_PRINTING_TYPE_NAME_PARSER_TOKENS_HPP
13#ifndef MIMICPP_DETAIL_IS_MODULE
19 #include <type_traits>
28 &&
requires(std::unwrap_reference_t<T> visitor,
StringViewT content, std::ptrdiff_t count) {
29 visitor.unrecognized(content);
37 visitor.begin_scope();
40 visitor.add_identifier(content);
43 visitor.begin_template_args(count);
44 visitor.end_template_args();
47 visitor.add_volatile();
48 visitor.add_noexcept();
50 visitor.add_lvalue_ref();
51 visitor.add_rvalue_ref();
53 visitor.begin_function();
54 visitor.end_function();
55 visitor.begin_return_type();
56 visitor.end_return_type();
57 visitor.begin_function_args(count);
58 visitor.end_function_args();
60 visitor.begin_function_ptr();
61 visitor.end_function_ptr();
63 visitor.begin_operator_identifier();
64 visitor.end_operator_identifier();
67 template <parser_visitor Visitor>
72 std::add_lvalue_reference_t<
73 std::unwrap_reference_t<Visitor>
>>(visitor);
163 template <parser_visitor Visitor>
175 inner.add_volatile();
195 return 1u <
layers.size();
198 template <parser_visitor Visitor>
205 std::invoke(
layers.front(), unwrapped);
207 for (
auto const& layer :
layers | std::views::drop(1u))
210 std::invoke(layer, unwrapped);
216 unwrapped.add_lvalue_ref();
220 unwrapped.add_rvalue_ref();
223 case none: [[fallthrough]];
229 unwrapped.add_noexcept();
247 constexpr
void operator()(Visitor& visitor) const;
260 using Symbol = std::variant<StringViewT, std::shared_ptr<Type>>;
264 using Content = std::variant<StringViewT, OperatorInfo>;
277 auto const*
const id = std::get_if<StringViewT>(&
content);
286 auto const*
const id = std::get_if<StringViewT>(&
content);
289 &&
id->starts_with(
"__");
298 template <parser_visitor Visitor>
314 template <parser_visitor Visitor>
319 visitor.add_identifier(
content);
322 template <parser_visitor Visitor>
325 visitor.begin_operator_identifier();
329 visitor.end_operator_identifier();
332 template <parser_visitor Visitor>
337 visitor.add_identifier(symbol);
340 template <parser_visitor Visitor>
345 std::invoke(*
type, visitor);
355 template <parser_visitor Visitor>
356 constexpr void operator()(Visitor& visitor)
const;
365 template <parser_visitor Visitor>
371 std::invoke(
context, unwrapped);
378 using Scope = std::variant<Identifier, FunctionIdentifier>;
381 template <parser_visitor Visitor>
388 for (
auto const& scope :
scopes)
390 unwrapped.begin_scope();
392 [&](
auto const&
id) { handle_scope(unwrapped,
id); },
394 unwrapped.end_scope();
399 template <parser_visitor Visitor>
400 constexpr void handle_scope(Visitor& visitor,
Identifier const& scope)
const
402 std::invoke(scope, visitor);
405 template <parser_visitor Visitor>
406 constexpr void handle_scope(Visitor& visitor, FunctionIdentifier
const& scope)
const
408 visitor.begin_function();
409 std::invoke(scope, visitor);
410 visitor.end_function();
421 template <parser_visitor Visitor>
426 unwrapped.begin_type();
430 std::invoke(*
scopes, unwrapped);
434 std::invoke(
specs, unwrapped);
436 unwrapped.end_type();
446 template <parser_visitor Visitor>
453 unwrapped.begin_function();
455 unwrapped.begin_return_type();
457 unwrapped.end_return_type();
459 std::invoke(
context, unwrapped);
461 unwrapped.end_function();
473 std::shared_ptr<FunctionPtr>
ptr{};
488 template <parser_visitor Visitor>
495 unwrapped.begin_type();
497 unwrapped.begin_return_type();
499 unwrapped.end_return_type();
501 unwrapped.begin_function_ptr();
504 std::invoke(*
scopes, unwrapped);
507 std::invoke(
specs, unwrapped);
508 unwrapped.end_function_ptr();
510 std::invoke(
context, unwrapped);
512 unwrapped.end_type();
519 using State = std::variant<RegularType, FunctionType, FunctionPtrType>;
525 auto const*
const regularType = std::get_if<RegularType>(&
state);
528 && regularType->identifier.is_void();
535 [&](
auto& inner)
noexcept ->
Specs& {
return specs(inner); },
539 template <parser_visitor Visitor>
545 [&](
auto const& inner) { std::invoke(inner, unwrapped); },
557 static constexpr Specs& specs(FunctionType&
type)
noexcept
559 return type.context.specs;
563 static constexpr Specs& specs(FunctionPtrType&
type)
noexcept
576 template <parser_visitor Visitor>
581 auto& unwrapped = unwrap_visitor(visitor);
583 std::invoke(types.front(), unwrapped);
585 for (auto const& type : types | std::views::drop(1))
588 std::invoke(type, unwrapped);
593 template <parser_visitor Visitor>
598 unwrapped.begin_template_args(std::ranges::ssize(
types));
599 std::invoke(*
this, unwrapped);
600 unwrapped.end_template_args();
603 template <parser_visitor Visitor>
608 unwrapped.begin_function_args(std::ranges::ssize(
args.types));
609 std::invoke(
args, unwrapped);
610 unwrapped.end_function_args();
611 std::invoke(
specs, unwrapped);
621 template <parser_visitor Visitor>
626 unwrapped.begin_function();
630 unwrapped.begin_return_type();
632 unwrapped.end_return_type();
637 std::invoke(*
scopes, unwrapped);
642 unwrapped.end_function();
675 template <
typename T>
#define MIMICPP_DETAIL_CONSTEXPR_VECTOR
Definition Config.hpp:69
#define MIMICPP_ASSERT(condition, msg)
Definition Config.hpp:51
Definition NameParserTokens.hpp:96
StringViewT content
Definition NameParserTokens.hpp:98
Definition NameParserTokens.hpp:235
std::vector< Type > types
Definition NameParserTokens.hpp:237
MIMICPP_DETAIL_CONSTEXPR_VECTOR ~ArgSequence() noexcept
constexpr void handle_as_template_args(Visitor &visitor) const
Definition NameParserTokens.hpp:594
MIMICPP_DETAIL_CONSTEXPR_VECTOR ArgSequence()
Definition NameParserTokens.hpp:108
StringViewT content
Definition NameParserTokens.hpp:110
Definition NameParserTokens.hpp:132
StringViewT content
Definition NameParserTokens.hpp:134
Definition NameParserTokens.hpp:120
StringViewT content
Definition NameParserTokens.hpp:122
Definition NameParserTokens.hpp:144
StringViewT content
Definition NameParserTokens.hpp:146
Definition NameParserTokens.hpp:350
Specs specs
Definition NameParserTokens.hpp:353
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:604
ArgSequence args
Definition NameParserTokens.hpp:352
Definition NameParserTokens.hpp:615
FunctionIdentifier identifier
Definition NameParserTokens.hpp:619
std::shared_ptr< Type > returnType
Definition NameParserTokens.hpp:617
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:618
void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:622
Definition NameParserTokens.hpp:360
Identifier identifier
Definition NameParserTokens.hpp:362
FunctionContext context
Definition NameParserTokens.hpp:363
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:366
Definition NameParserTokens.hpp:466
std::optional< NestedInfo > nested
Definition NameParserTokens.hpp:477
Specs specs
Definition NameParserTokens.hpp:469
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:468
Definition NameParserTokens.hpp:481
FunctionContext context
Definition NameParserTokens.hpp:486
Specs specs
Definition NameParserTokens.hpp:485
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:489
std::shared_ptr< Type > returnType
Definition NameParserTokens.hpp:483
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:484
Definition NameParserTokens.hpp:441
FunctionContext context
Definition NameParserTokens.hpp:444
std::shared_ptr< Type > returnType
Definition NameParserTokens.hpp:443
void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:447
Definition NameParserTokens.hpp:254
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:299
std::variant< StringViewT, OperatorInfo > Content
Definition NameParserTokens.hpp:264
static constexpr void handle_op_symbol(Visitor &visitor, std::shared_ptr< Type > const &type)
Definition NameParserTokens.hpp:341
constexpr bool is_builtin() const noexcept
Definition NameParserTokens.hpp:293
bool isBuiltinType
Definition NameParserTokens.hpp:256
static constexpr void handle_content(Visitor &visitor, StringViewT const &content)
Definition NameParserTokens.hpp:315
constexpr bool is_template() const noexcept
Definition NameParserTokens.hpp:269
static constexpr void handle_op_symbol(Visitor &visitor, StringViewT const &symbol)
Definition NameParserTokens.hpp:333
Content content
Definition NameParserTokens.hpp:265
constexpr bool is_reserved() const noexcept
Definition NameParserTokens.hpp:284
constexpr bool is_void() const noexcept
Definition NameParserTokens.hpp:275
std::optional< ArgSequence > templateArgs
Definition NameParserTokens.hpp:266
static constexpr void handle_content(Visitor &visitor, OperatorInfo const &content)
Definition NameParserTokens.hpp:323
Definition NameParserTokens.hpp:102
StringViewT content
Definition NameParserTokens.hpp:104
Definition NameParserTokens.hpp:138
StringViewT content
Definition NameParserTokens.hpp:140
Definition NameParserTokens.hpp:126
StringViewT content
Definition NameParserTokens.hpp:128
Definition NameParserTokens.hpp:114
StringViewT content
Definition NameParserTokens.hpp:116
Definition NameParserTokens.hpp:86
Definition NameParserTokens.hpp:415
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:417
Specs specs
Definition NameParserTokens.hpp:419
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:422
Identifier identifier
Definition NameParserTokens.hpp:418
Definition NameParserTokens.hpp:90
StringViewT content
Definition NameParserTokens.hpp:92
Definition NameParserTokens.hpp:376
std::vector< Scope > scopes
Definition NameParserTokens.hpp:379
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:382
std::variant< Identifier, FunctionIdentifier > Scope
Definition NameParserTokens.hpp:378
Definition NameParserTokens.hpp:82
Definition NameParserTokens.hpp:156
std::vector< Layer > layers
Definition NameParserTokens.hpp:180
MIMICPP_DETAIL_CONSTEXPR_VECTOR bool has_ptr() const noexcept
Definition NameParserTokens.hpp:193
bool isNoexcept
Definition NameParserTokens.hpp:190
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:199
Refness
Definition NameParserTokens.hpp:183
@ rvalue
Definition NameParserTokens.hpp:186
@ lvalue
Definition NameParserTokens.hpp:185
@ none
Definition NameParserTokens.hpp:184
Refness refness
Definition NameParserTokens.hpp:189
Definition NameParserTokens.hpp:150
StringViewT content
Definition NameParserTokens.hpp:152
Definition NameParserTokens.hpp:517
constexpr Specs & specs() noexcept
Definition NameParserTokens.hpp:532
State state
Definition NameParserTokens.hpp:520
constexpr bool is_void() const noexcept
Definition NameParserTokens.hpp:523
std::variant< RegularType, FunctionType, FunctionPtrType > State
Definition NameParserTokens.hpp:519
void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:540
Definition NameParserTokens.hpp:27
Definition NameParserTokens.hpp:676
Determines, whether B behaves as a the builtin type bool.
Definition Concepts.hpp:66
Definition NameParserReductions.hpp:118
Definition NameParser.hpp:27
std::variant< token::Space, token::OperatorKeyword, token::ScopeResolution, token::ArgSeparator, token::OpeningAngle, token::ClosingAngle, token::OpeningParens, token::ClosingParens, token::OpeningCurly, token::ClosingCurly, token::OpeningBacktick, token::ClosingSingleQuote, token::TypeContext, token::Identifier, token::FunctionIdentifier, token::ScopeSequence, token::ArgSequence, token::FunctionContext, token::FunctionPtr, token::Specs, token::Type, token::Function > Token
Definition NameParserTokens.hpp:649
constexpr auto & unwrap_visitor(Visitor &visitor) noexcept
Definition NameParserTokens.hpp:69
std::vector< Token > TokenStack
Definition NameParserTokens.hpp:673
std::basic_string_view< CharT, CharTraitsT > StringViewT
Definition Fwd.hpp:392
Definition NameParserTokens.hpp:472
FunctionContext ctx
Definition NameParserTokens.hpp:474
std::shared_ptr< FunctionPtr > ptr
Definition NameParserTokens.hpp:473
Definition NameParserTokens.hpp:259
std::variant< StringViewT, std::shared_ptr< Type > > Symbol
Definition NameParserTokens.hpp:260
Symbol symbol
Definition NameParserTokens.hpp:261
Definition NameParserTokens.hpp:159
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:164
bool isVolatile
Definition NameParserTokens.hpp:161
bool isConst
Definition NameParserTokens.hpp:160