mirror of
https://github.com/Ed94/gencpp.git
synced 2024-09-20 19:27:33 -07:00
Ed_
5d7dfaf666
Isolating large macros to their own directory (components/temp). - Plan is to remove them soon with proper generation. Added additional component files, separating the old data_structures header for a set of ast headers. Header_end also had its inlines extracted out. Necessary to complete the macro isolation. ZPL parser dependencies were removed from the core library along with builder, its now generated in bootstrap as pare of making a gen_builder set of files. Singleheader will be changed in next few commits to reflect this as well (By making builder deps and components a conditional option). Tests are most likely all broken for now.
110 lines
2.8 KiB
C++
110 lines
2.8 KiB
C++
// This is the non-bootstraped version of the ESpecifier. This will be obsolete once bootstrap is stress tested.
|
|
|
|
namespace ESpecifier
|
|
{
|
|
/*
|
|
Note: The following are handled separately:
|
|
attributes
|
|
alignas
|
|
*/
|
|
|
|
# define Define_Specifiers \
|
|
Entry( Invalid, INVALID ) \
|
|
Entry( Consteval, consteval ) \
|
|
Entry( Constexpr, constexpr ) \
|
|
Entry( Constinit, constinit ) \
|
|
Entry( Explicit, explicit ) \
|
|
Entry( External_Linkage, extern ) \
|
|
Entry( Global, global ) \
|
|
Entry( Inline, inline ) \
|
|
Entry( Internal_Linkage, internal ) \
|
|
Entry( Local_Persist, local_persist ) \
|
|
Entry( Mutable, mutable ) \
|
|
Entry( NeverInline, neverinline ) \
|
|
Entry( Ptr, * ) \
|
|
Entry( Ref, & ) \
|
|
Entry( Register, register ) \
|
|
Entry( RValue, && ) \
|
|
Entry( Static, static ) \
|
|
Entry( Thread_Local, thread_local ) \
|
|
Entry( Volatile, volatile ) \
|
|
Entry( Virtual, virtual ) \
|
|
Entry( Const, const ) \
|
|
Entry( Final, final ) \
|
|
Entry( Override, override )
|
|
|
|
enum Type : u32
|
|
{
|
|
# define Entry( Specifier, Code ) Specifier,
|
|
Define_Specifiers
|
|
# undef Entry
|
|
|
|
NumSpecifiers,
|
|
};
|
|
|
|
inline
|
|
bool is_trailing( Type specifier )
|
|
{
|
|
return specifier > Virtual;
|
|
}
|
|
|
|
// Specifier to string
|
|
inline
|
|
StrC to_str( Type specifier )
|
|
{
|
|
local_persist
|
|
StrC lookup[ NumSpecifiers ] = {
|
|
# pragma push_macro( "global" )
|
|
# pragma push_macro( "internal" )
|
|
# pragma push_macro( "local_persist" )
|
|
# pragma push_macro( "neverinline" )
|
|
# undef global
|
|
# undef internal
|
|
# undef local_persist
|
|
# undef neverinline
|
|
|
|
# define Entry( Spec_, Code_ ) { sizeof(stringize(Code_)), stringize(Code_) },
|
|
Define_Specifiers
|
|
# undef Entry
|
|
|
|
# pragma pop_macro( "global" )
|
|
# pragma pop_macro( "internal" )
|
|
# pragma pop_macro( "local_persist" )
|
|
# pragma pop_macro( "neverinline" )
|
|
};
|
|
|
|
return lookup[ specifier ];
|
|
}
|
|
|
|
inline
|
|
Type to_type( StrC str )
|
|
{
|
|
local_persist
|
|
u32 keymap[ NumSpecifiers ];
|
|
do_once_start
|
|
for ( u32 index = 0; index < NumSpecifiers; index++ )
|
|
{
|
|
StrC enum_str = to_str( (Type)index );
|
|
|
|
// We subtract 1 to remove the null terminator
|
|
// This is because the tokens lexed are not null terminated.
|
|
keymap[index] = crc32( enum_str.Ptr, enum_str.Len - 1);
|
|
}
|
|
do_once_end
|
|
|
|
u32 hash = crc32( str.Ptr, str.Len );
|
|
|
|
for ( u32 index = 0; index < NumSpecifiers; index++ )
|
|
{
|
|
if ( keymap[index] == hash )
|
|
return (Type)index;
|
|
}
|
|
|
|
return Invalid;
|
|
}
|
|
|
|
# undef Define_Specifiers
|
|
}
|
|
using SpecifierT = ESpecifier::Type;
|
|
|