mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 07:44:45 -08:00
More design/major changes
Found flaws with design while the parser If I want to support modules I needed to add separaration from the usual specifiers. Same with attributes, decided to minimize my parsing complexity of attributes. Added a banned header (will not have that be there for the release version
This commit is contained in:
parent
38a60e4b91
commit
9a6deb12cc
35
project/Banned.define.hpp
Normal file
35
project/Banned.define.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
// Standard Allocation
|
||||
#define new static_assert( false, "Banned keyword used: " new )
|
||||
#define delete static_assert( false, "Banned keyword used: " delete )
|
||||
|
||||
// Standard Coroutines
|
||||
#define co_await static_assert( false, "Banned keyword used: " co_await )
|
||||
#define co_return static_assert( false, "Banned keyword used: " co_return )
|
||||
#define co_yield static_assert( false, "Banned keyword used: " co_yield )
|
||||
|
||||
// Standard Exceptions
|
||||
#define atomic_cancel static_assert( false, "Banned keyword used: " atomic_cancel )
|
||||
#define atomic_commit static_assert( false, "Banned keyword used: " atomic_commit )
|
||||
#define atomic_noexcept static_assert( false, "Banned keyword used: " atomic_noexcept )
|
||||
#define catch static_assert( false, "Banned keyword used: " catch )
|
||||
#define noexcept static_assert( false, "Banned keyword used: " noexcept )
|
||||
#define throw static_assert( false, "Banned keyword used: " throw )
|
||||
#define try static_assert( false, "Banned keyword used: " try )
|
||||
|
||||
// Standard RTTI
|
||||
#define decltype static_assert( false, "Banned keyword used: " decltype )
|
||||
#define reflexpr static_assert( false, "Banned keyword used: " reflexpr )
|
||||
#define typeid static_assert( false, "Banned keyword used: " typeid )
|
||||
|
||||
// Object-Oriented Dynamic Dispatch
|
||||
#define final static_assert( false, "Banned keyword used: " final )
|
||||
#define override static_assert( false, "Banned keyword used: " override )
|
||||
#define virtual static_assert( false, "Banned keyword used: " virtual )
|
||||
|
||||
// Private Access Specifier
|
||||
#define private static_assert( false, "Banned keyword used: " private )
|
||||
|
||||
// Template Meta-programming
|
||||
#define concept static_assert( false, "Banned keyword used: " concept )
|
||||
#define requires static_assert( false, "Banned keyword used: " requires )
|
||||
#define template static_assert( false, "Banned keyword used: " template )
|
35
project/Banned.undef.hpp
Normal file
35
project/Banned.undef.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
// Standard Allocation
|
||||
#undef new
|
||||
#undef delete
|
||||
|
||||
// Standard Coroutines
|
||||
#undef co_await
|
||||
#undef co_return
|
||||
#undef co_yield
|
||||
|
||||
// Standard Exceptions
|
||||
#undef atomic_cancel
|
||||
#undef atomic_commit
|
||||
#undef atomic_noexcept
|
||||
#undef catch
|
||||
#undef noexcept
|
||||
#undef throw
|
||||
#undef try
|
||||
|
||||
// Standard RTTI
|
||||
#undef decltype
|
||||
#undef reflexpr
|
||||
#undef typeid
|
||||
|
||||
// Object-Oriented Dynamic Dispatch
|
||||
#undef final
|
||||
#undef override
|
||||
#undef virtual
|
||||
|
||||
// Private Access Specifier
|
||||
#undef private
|
||||
|
||||
// Template Meta-programming
|
||||
#undef concept
|
||||
#undef requires
|
||||
#undef template
|
@ -105,6 +105,9 @@ using zpl::str_len;
|
||||
#endif
|
||||
|
||||
|
||||
#include "Banned.define.hpp"
|
||||
|
||||
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
// Supports 0-10 arguments
|
||||
#define macro_num_args_impl( _0, \
|
||||
|
909
project/gen.cpp
909
project/gen.cpp
File diff suppressed because it is too large
Load Diff
446
project/gen.hpp
446
project/gen.hpp
@ -37,45 +37,50 @@ namespace gen
|
||||
|
||||
namespace ECode
|
||||
{
|
||||
# define Define_Types \
|
||||
Entry( Untyped ) \
|
||||
Entry( Access_Public ) \
|
||||
Entry( Access_Protected ) \
|
||||
Entry( Access_Private ) \
|
||||
Entry( Class ) \
|
||||
Entry( Class_Fwd ) \
|
||||
Entry( Class_Body ) \
|
||||
Entry( Enum ) \
|
||||
Entry( Enum_Fwd ) \
|
||||
Entry( Enum_Body ) \
|
||||
Entry( Enum_Class ) \
|
||||
Entry( Enum_Class_Fwd ) \
|
||||
Entry( Execution ) \
|
||||
Entry( Extern_Linkage ) \
|
||||
Entry( Extern_Linkage_Body ) \
|
||||
Entry( Friend ) \
|
||||
Entry( Function ) \
|
||||
Entry( Function_Fwd ) \
|
||||
Entry( Function_Body ) \
|
||||
Entry( Global_Body ) \
|
||||
Entry( Namespace ) \
|
||||
Entry( Namespace_Body ) \
|
||||
Entry( Operator ) \
|
||||
Entry( Operator_Fwd ) \
|
||||
Entry( Operator_Member ) \
|
||||
Entry( Operator_Member_Fwd ) \
|
||||
Entry( Parameters ) \
|
||||
Entry( Specifiers ) \
|
||||
Entry( Struct ) \
|
||||
Entry( Struct_Fwd ) \
|
||||
Entry( Struct_Body ) \
|
||||
Entry( Variable ) \
|
||||
Entry( Typedef ) \
|
||||
Entry( Typename ) \
|
||||
Entry( Union ) \
|
||||
Entry( Union_Fwd ) \
|
||||
Entry( Union_Body) \
|
||||
Entry( Using ) \
|
||||
# define Define_Types \
|
||||
Entry( Untyped ) \
|
||||
Entry( Comment ) \
|
||||
Entry( Access_Private ) \
|
||||
Entry( Access_Protected ) \
|
||||
Entry( Access_Public ) \
|
||||
Entry( Attributes ) \
|
||||
Entry( Class ) \
|
||||
Entry( Class_Fwd ) \
|
||||
Entry( Class_Body ) \
|
||||
Entry( Enum ) \
|
||||
Entry( Enum_Fwd ) \
|
||||
Entry( Enum_Body ) \
|
||||
Entry( Enum_Class ) \
|
||||
Entry( Enum_Class_Fwd ) \
|
||||
Entry( Execution ) \
|
||||
Entry( Export_Body ) \
|
||||
Entry( Extern_Linkage ) \
|
||||
Entry( Extern_Linkage_Body ) \
|
||||
Entry( Friend ) \
|
||||
Entry( Function ) \
|
||||
Entry( Function_Fwd ) \
|
||||
Entry( Function_Body ) \
|
||||
Entry( Global_Body ) \
|
||||
Entry( Module ) \
|
||||
Entry( Namespace ) \
|
||||
Entry( Namespace_Body ) \
|
||||
Entry( Operator ) \
|
||||
Entry( Operator_Fwd ) \
|
||||
Entry( Operator_Member ) \
|
||||
Entry( Operator_Member_Fwd ) \
|
||||
Entry( Parameters ) \
|
||||
Entry( Preprocessor_Include ) \
|
||||
Entry( Specifiers ) \
|
||||
Entry( Struct ) \
|
||||
Entry( Struct_Fwd ) \
|
||||
Entry( Struct_Body ) \
|
||||
Entry( Variable ) \
|
||||
Entry( Typedef ) \
|
||||
Entry( Typename ) \
|
||||
Entry( Union ) \
|
||||
Entry( Union_Fwd ) \
|
||||
Entry( Union_Body) \
|
||||
Entry( Using ) \
|
||||
Entry( Using_Namespace )
|
||||
|
||||
enum Type : u32
|
||||
@ -101,7 +106,7 @@ namespace gen
|
||||
return lookup[ type ];
|
||||
}
|
||||
|
||||
#undef Define_Types
|
||||
# undef Define_Types
|
||||
}
|
||||
using CodeT = ECode::Type;
|
||||
|
||||
@ -197,38 +202,27 @@ namespace gen
|
||||
return lookup[ op ];
|
||||
}
|
||||
|
||||
#undef Define_Operators
|
||||
# undef Define_Operators
|
||||
}
|
||||
using OperatorT = EOperator::Type;
|
||||
|
||||
namespace ESpecifier
|
||||
{
|
||||
#if defined(ZPL_SYSTEM_WINDOWS)
|
||||
# define API_Export_Code __declspec(dllexport)
|
||||
# define API_Import_Code __declspec(dllimport)
|
||||
# define API_Keyword __declspec
|
||||
#elif defined(ZPL_SYSTEM_MACOS)
|
||||
# define API_Export_Code __attribute__ ((visibility ("default")))
|
||||
# define API_Import_Code __attribute__ ((visibility ("default")))
|
||||
# define API_Keyword __attribute__
|
||||
#endif
|
||||
/*
|
||||
Note: The following are handled separately:
|
||||
attributes
|
||||
alignas
|
||||
*/
|
||||
|
||||
#define Define_Specifiers \
|
||||
Entry( API_Import, API_Export_Code ) \
|
||||
Entry( API_Export, API_Import_Code ) \
|
||||
Entry( Alignas, alignas ) \
|
||||
Entry( Array_Decl, "You cannot stringize an array declare this way" ) \
|
||||
Entry( Const, const ) \
|
||||
Entry( Consteval, consteval ) \
|
||||
Entry( Constexpr, constexpr ) \
|
||||
Entry( Constinit, constinit ) \
|
||||
Entry( Export, export ) \
|
||||
Entry( External_Linkage, extern ) \
|
||||
Entry( Import, import ) \
|
||||
Entry( Inline, inline ) \
|
||||
Entry( Internal_Linkage, static ) \
|
||||
Entry( Local_Persist, static ) \
|
||||
Entry( Module, module ) \
|
||||
Entry( Mutable, mutable ) \
|
||||
Entry( Ptr, * ) \
|
||||
Entry( Ref, & ) \
|
||||
@ -295,6 +289,78 @@ namespace gen
|
||||
}
|
||||
using SpecifierT = ESpecifier::Type;
|
||||
|
||||
enum class AccessSpec : u32
|
||||
{
|
||||
Public,
|
||||
Protected,
|
||||
Private,
|
||||
|
||||
Num_AccessSpec,
|
||||
Invalid,
|
||||
};
|
||||
|
||||
inline
|
||||
char const* to_str( AccessSpec type )
|
||||
{
|
||||
local_persist
|
||||
char const* lookup[ (u32)AccessSpec::Num_AccessSpec ] = {
|
||||
"private",
|
||||
"protected",
|
||||
"public",
|
||||
};
|
||||
|
||||
if ( type > AccessSpec::Public )
|
||||
return lookup[ (u32)AccessSpec::Invalid ];
|
||||
|
||||
return lookup[ (u32)type ];
|
||||
}
|
||||
|
||||
enum class ModuleFlag : u32
|
||||
{
|
||||
None = 0,
|
||||
Export = bit(0),
|
||||
Import = bit(1),
|
||||
Private = bit(2),
|
||||
|
||||
Num_ModuleFlags,
|
||||
Invalid,
|
||||
};
|
||||
|
||||
/*
|
||||
Predefined attributes
|
||||
|
||||
Used for the parser constructors to identify non-standard attributes
|
||||
*/
|
||||
namespace Attribute
|
||||
{
|
||||
#if 0 && defined(ZPL_SYSTEM_WINDOWS) || defined( __CYGWIN__ )
|
||||
# define GEN_API_
|
||||
# define GEN_API_Export_Code __declspec(dllexport)
|
||||
# define GEN_API_Import_Code __declspec(dllimport)
|
||||
# define GEN_Attribute_Keyword __declspec
|
||||
|
||||
constexpr char const* API_Export = txt( GEN_API_Export_Code );
|
||||
constexpr char const* API_Import = txt( GEN_API_Import_Code );
|
||||
|
||||
#elif ZPL_HAS_ATTRIBUTE( visibility ) || ZPL_GCC_VERSION_CHECK( 3, 3, 0 ) || ZPL_INTEL_VERSION_CHECK( 13, 0, 0 )
|
||||
# define GEN_API_Export_Code __attribute__ ((visibility ("default")))
|
||||
# define GEN_API_Import_Code __attribute__ ((visibility ("default")))
|
||||
# define GEN_Attribute_Keyword __attribute__
|
||||
|
||||
constexpr char const* API_Export = txt( GEN_API_Export_Code );
|
||||
constexpr char const* API_Import = txt( GEN_API_Import_Code );
|
||||
|
||||
#else
|
||||
# define GEN_API_Export_Code
|
||||
# define GEN_API_Import_Code
|
||||
# define GEN_Attribute_Keyword
|
||||
|
||||
constexpr char const* API_Export = "";
|
||||
constexpr char const* API_Import = "";
|
||||
constexpr char const* Attribute_Keyword = "";
|
||||
#endif
|
||||
}
|
||||
|
||||
#pragma region Data Structures
|
||||
// Implements basic string interning. Data structure is based off the ZPL Hashtable.
|
||||
ZPL_TABLE_DECLARE( ZPL_EXTERN, StringTable, str_tbl_, String );
|
||||
@ -326,7 +392,7 @@ namespace gen
|
||||
|
||||
void add_entry( AST* other );
|
||||
|
||||
forceinline
|
||||
inline
|
||||
AST* body()
|
||||
{
|
||||
return Entries[0];
|
||||
@ -334,19 +400,19 @@ namespace gen
|
||||
|
||||
AST* duplicate();
|
||||
|
||||
forceinline
|
||||
inline
|
||||
bool has_entries()
|
||||
{
|
||||
return Entries[0];
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
bool is_invalid()
|
||||
{
|
||||
return Type != ECode::Invalid;
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
s32 num_entries()
|
||||
{
|
||||
return DynamicEntries ? array_count(Entries) : StaticIndex;
|
||||
@ -354,7 +420,7 @@ namespace gen
|
||||
|
||||
// Class/Struct
|
||||
|
||||
forceinline
|
||||
inline
|
||||
AST* parent()
|
||||
{
|
||||
return Entries[1];
|
||||
@ -362,7 +428,7 @@ namespace gen
|
||||
|
||||
// Enum
|
||||
|
||||
forceinline
|
||||
inline
|
||||
AST* underlying_type()
|
||||
{
|
||||
return Entries[1];
|
||||
@ -372,7 +438,7 @@ namespace gen
|
||||
|
||||
bool add_param( AST* type, s32 length, char const* name );
|
||||
|
||||
forceinline
|
||||
inline
|
||||
AST* get_param( s32 index )
|
||||
{
|
||||
if ( index <= 0 )
|
||||
@ -381,14 +447,14 @@ namespace gen
|
||||
return Entries[ index + 1 ];
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
s32 param_count()
|
||||
{
|
||||
// The first entry (which holds the type) represents the first parameter.
|
||||
return num_entries();
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
AST* param_type()
|
||||
{
|
||||
return Entries[0];
|
||||
@ -411,32 +477,32 @@ namespace gen
|
||||
}
|
||||
|
||||
inline
|
||||
bool has_specifier( SpecifierT spec )
|
||||
s32 has_specifier( SpecifierT spec )
|
||||
{
|
||||
for ( s32 Index = 0; Index < StaticIndex; Index++ )
|
||||
for ( s32 idx = 0; idx < StaticIndex; idx++ )
|
||||
{
|
||||
if ( ArrSpecs[StaticIndex] == spec )
|
||||
return true;
|
||||
return idx;
|
||||
}
|
||||
|
||||
return false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Typename
|
||||
|
||||
forceinline
|
||||
inline
|
||||
bool typename_is_ptr()
|
||||
{
|
||||
assert_crash("not implemented");
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
bool typename_is_ref()
|
||||
{
|
||||
assert_crash("not implemented");
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
AST* typename_specifiers()
|
||||
{
|
||||
return Entries[0];
|
||||
@ -444,7 +510,7 @@ namespace gen
|
||||
|
||||
// Serialization
|
||||
|
||||
forceinline
|
||||
inline
|
||||
char const* debug_str()
|
||||
{
|
||||
char const* fmt = txt(
|
||||
@ -469,7 +535,7 @@ namespace gen
|
||||
);
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
char const* type_str()
|
||||
{
|
||||
return ECode::to_str( Type );
|
||||
@ -481,12 +547,14 @@ namespace gen
|
||||
constexpr static
|
||||
uw ArrS_Cap =
|
||||
( AST_POD_Size
|
||||
- sizeof(AST*)
|
||||
- sizeof(StringCached) * 2
|
||||
- sizeof(CodeT)
|
||||
- sizeof(OperatorT)
|
||||
- sizeof(bool) * 2
|
||||
- sizeof(u8) * 7 )
|
||||
- sizeof(AST*) // Parent
|
||||
- sizeof(StringCached) // Name
|
||||
- sizeof(CodeT) // Type
|
||||
- sizeof(OperatorT) // Op
|
||||
- sizeof(ModuleFlag) // ModuleFlags
|
||||
- sizeof(u32) // StaticIndex
|
||||
- sizeof(bool) * 2 // Readonly, DynamicEntries
|
||||
- sizeof(u8) * 6 ) // _Align_Pad
|
||||
/ sizeof(AST*);
|
||||
|
||||
constexpr static
|
||||
@ -501,12 +569,12 @@ namespace gen
|
||||
}; \
|
||||
AST* Parent; \
|
||||
StringCached Name; \
|
||||
StringCached Comment; \
|
||||
CodeT Type; \
|
||||
OperatorT Op; \
|
||||
ModuleFlag ModuleFlags; \
|
||||
u32 StaticIndex; \
|
||||
bool Readonly; \
|
||||
bool DynamicEntries; \
|
||||
u8 StaticIndex; \
|
||||
u8 _Align_Pad[6];
|
||||
|
||||
Using_Code_POD
|
||||
@ -537,7 +605,7 @@ namespace gen
|
||||
struct Code
|
||||
{
|
||||
#pragma region Statics
|
||||
// Used internally for the most part to identify invaidly generated code.
|
||||
// Used to identify invalid generated code.
|
||||
static Code Invalid;
|
||||
#pragma endregion Statics
|
||||
|
||||
@ -574,43 +642,43 @@ namespace gen
|
||||
return * (Code*)( ast->body() );
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
void lock()
|
||||
{
|
||||
ast->Readonly = true;
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
char const* to_string()
|
||||
{
|
||||
return ast->to_string();
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
operator bool()
|
||||
{
|
||||
return ast;
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
bool operator ==( Code other )
|
||||
{
|
||||
return ast == other.ast;
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
bool operator !=( Code other )
|
||||
{
|
||||
return ast != other.ast;
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
operator AST*()
|
||||
{
|
||||
return ast;
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
Code& operator=( Code other )
|
||||
{
|
||||
if ( ast == nullptr )
|
||||
@ -632,7 +700,7 @@ namespace gen
|
||||
return *this;
|
||||
}
|
||||
|
||||
forceinline
|
||||
inline
|
||||
AST* operator->()
|
||||
{
|
||||
if ( ast == nullptr )
|
||||
@ -710,63 +778,120 @@ namespace gen
|
||||
void set_allocator_type_table ( AllocatorInfo type_reg_allocator );
|
||||
|
||||
# pragma region Upfront
|
||||
Code def_class ( s32 length, char const* name, Code parent = NoCode, Code specifiers = NoCode, Code body = NoCode );
|
||||
Code def_enum ( s32 length, char const* name, Code type = NoCode, EnumT specifier = EnumRegular, Code body = NoCode );
|
||||
Code def_comment ( s32 length, char const* content );
|
||||
Code def_attributes( s32 length, char const* content );
|
||||
|
||||
Code def_execution ( Code untyped_code );
|
||||
Code def_class( s32 length, char const* name
|
||||
, Code body = NoCode
|
||||
, Code parent = NoCode, AccessSpec access = AccessSpec::Public
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_friend ( Code symbol );
|
||||
Code def_function ( s32 length, char const* name, Code params = NoCode, Code ret_type = NoCode, Code specifiers = NoCode, Code body = NoCode );
|
||||
Code def_extern_linkage ( s32 length, char const* name, Code body );
|
||||
Code def_namespace ( s32 length, char const* name, Code body );
|
||||
Code def_operator ( OperatorT op, Code params = NoCode, Code ret_type = NoCode, Code specifiers = NoCode, Code body = NoCode );
|
||||
Code def_enum( s32 length, char const* name
|
||||
, Code body = NoCode, Code type = NoCode
|
||||
, EnumT specifier = EnumRegular, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_param ( Code type, s32 length, char const* name, Code value = NoCode );
|
||||
Code def_execution ( s32 length, char const* content );
|
||||
Code def_extern_link( s32 length, char const* name, Code body, ModuleFlag mflags = ModuleFlag::None );
|
||||
Code def_friend ( Code symbol );
|
||||
|
||||
Code def_specifier ( SpecifierT specifier );
|
||||
Code def_function( s32 length, char const* name
|
||||
, Code params = NoCode, Code ret_type = NoCode, Code body = NoCode
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_struct ( s32 length, char const* name, Code parent = NoCode, Code specifiers = NoCode, Code body = NoCode );
|
||||
Code def_typedef ( s32 length, char const* name, Code type );
|
||||
Code def_type ( s32 length, char const* name, Code specifiers = NoCode, Code ArrayExpr = NoCode );
|
||||
Code def_union ( s32 length, char const* name, Code body = NoCode );
|
||||
Code def_using ( s32 length, char const* name, Code type = NoCode, UsingT specifier = UsingRegular );
|
||||
Code def_include ( s32 length, char const* path );
|
||||
Code def_module ( s32 length, char const* name, ModuleFlag mflags = ModuleFlag::None );
|
||||
Code def_namespace( s32 length, char const* name, Code body, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_variable ( Code type, s32 length, char const* name, Code value = NoCode, Code specifiers = NoCode );
|
||||
Code def_operator( OperatorT op
|
||||
, Code params = NoCode, Code ret_type = NoCode, Code body = NoCode
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_class_body ( s32 num, ... );
|
||||
Code def_enum_body ( s32 num, ... );
|
||||
Code def_enum_body ( s32 num, Code* codes );
|
||||
Code def_extern_linkage_body( s32 num, ... );
|
||||
Code def_extern_linkage_body( s32 num, Code* codes );
|
||||
Code def_global_body ( s32 num, ... );
|
||||
Code def_global_body ( s32 num, Code* codes );
|
||||
Code def_function_body ( s32 num, ... );
|
||||
Code def_function_body ( s32 num, Code* codes );
|
||||
Code def_namespace_body ( s32 num, ... );
|
||||
Code def_namespace_body ( s32 num, Code* codes );
|
||||
Code def_params ( s32 num, ... );
|
||||
Code def_params ( s32 num, Code* params );
|
||||
Code def_specifiers ( s32 num , ... );
|
||||
Code def_specifiers ( s32 num, SpecifierT* specs );
|
||||
Code def_struct_body ( s32 num, ... );
|
||||
Code def_struct_body ( s32 num, Code* codes );
|
||||
Code def_union_body ( s32 num, ... );
|
||||
Code def_union_body ( s32 num, Code* codes );
|
||||
Code def_param ( Code type, s32 length, char const* name, Code value = NoCode );
|
||||
Code def_specifier( SpecifierT specifier );
|
||||
|
||||
Code def_struct( s32 length, char const* name
|
||||
, Code body
|
||||
, Code parent = NoCode, AccessSpec access
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_typedef( s32 length, char const* name, Code type, Code attributes = NoCode, ModuleFlag mflags = ModuleFlag::None );
|
||||
Code def_type ( s32 length, char const* name, Code arrayexpr = NoCode, Code specifiers = NoCode );
|
||||
|
||||
Code def_union( s32 length, char const* name, Code body = NoCode, Code attributes = NoCode, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_using( s32 length, char const* name, UsingT specifier = UsingRegular
|
||||
, Code type = NoCode
|
||||
, Code attributess = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_variable( Code type, s32 length, char const* name, Code value = NoCode
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code def_class_body ( s32 num, ... );
|
||||
Code def_enum_body ( s32 num, ... );
|
||||
Code def_enum_body ( s32 num, Code* codes );
|
||||
Code def_extern_link_body( s32 num, ... );
|
||||
Code def_extern_link_body( s32 num, Code* codes );
|
||||
Code def_export_body ( s32 num, ... );
|
||||
Code def_export_body ( s32 num, Code* codes);
|
||||
Code def_global_body ( s32 num, ... );
|
||||
Code def_global_body ( s32 num, Code* codes );
|
||||
Code def_function_body ( s32 num, ... );
|
||||
Code def_function_body ( s32 num, Code* codes );
|
||||
Code def_namespace_body ( s32 num, ... );
|
||||
Code def_namespace_body ( s32 num, Code* codes );
|
||||
Code def_params ( s32 num, ... );
|
||||
Code def_params ( s32 num, Code* params );
|
||||
Code def_specifiers ( s32 num , ... );
|
||||
Code def_specifiers ( s32 num, SpecifierT* specs );
|
||||
Code def_struct_body ( s32 num, ... );
|
||||
Code def_struct_body ( s32 num, Code* codes );
|
||||
Code def_union_body ( s32 num, ... );
|
||||
Code def_union_body ( s32 num, Code* codes );
|
||||
# pragma endregion Upfront
|
||||
|
||||
# pragma region Incremental
|
||||
# ifdef GEN_FEATURE_INCREMENTAL
|
||||
Code make_class ( s32 length, char const* name, Code parent = NoCode, Code specifiers = NoCode );
|
||||
Code make_enum ( s32 length, char const* name, Code type = NoCode, EnumT specifier = EnumRegular );
|
||||
Code make_class( s32 length, char const* name
|
||||
, Code parent = NoCode, AccessSpec access = AccessSpec::Public
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code make_enum( s32 length, char const* name
|
||||
, Code type = NoCode, EnumT specifier = EnumRegular
|
||||
, Code attributes = NoCode, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code make_export_body ( s32 length = 1, char const* name = "" );
|
||||
Code make_extern_linkage( s32 length, char const* name );
|
||||
Code make_function ( s32 length, char const* name, Code params = NoCode, Code ret_type = NoCode, Code specifiers = NoCode );
|
||||
Code make_global_body ( s32 length = 1, char const* name = "" );
|
||||
Code make_namespace ( s32 length, char const* name );
|
||||
Code make_operator ( OperatorT op, Code params = NoCode, Code ret_type = NoCode, Code specifiers = NoCode );
|
||||
Code make_params ();
|
||||
Code make_specifiers ();
|
||||
Code make_struct ( s32 length, char const* name, Code parent = NoCode, Code specifiers = NoCode );
|
||||
Code make_union ( s32 length, char const* name );
|
||||
|
||||
Code make_function( s32 length, char const* name
|
||||
, Code params = NoCode, Code ret_type = NoCode
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code make_global_body( s32 length = 1, char const* name = "" );
|
||||
Code make_namespace ( s32 length, char const* name );
|
||||
|
||||
Code make_operator( OperatorT op
|
||||
, Code params = NoCode, Code ret_type = NoCode
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code make_params ();
|
||||
Code make_specifiers();
|
||||
|
||||
Code make_struct( s32 length, char const* name
|
||||
, Code parent = NoCode, AccessSpec access
|
||||
, Code specifiers = NoCode, Code attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
|
||||
Code make_union( s32 length, char const* name, Code attributes = NoCode, ModuleFlag mflags = ModuleFlag::None );
|
||||
# endif
|
||||
# pragma endregion Incremental
|
||||
|
||||
@ -774,6 +899,8 @@ namespace gen
|
||||
#ifdef GEN_FEATURE_PARSING
|
||||
Code parse_class ( s32 length, char const* class_def );
|
||||
Code parse_enum ( s32 length, char const* enum_def );
|
||||
Code parse_export_body( s32 length, char const* export_def );
|
||||
Code parse_exten_link ( s32 length, char const* exten_link_def);
|
||||
Code parse_friend ( s32 length, char const* friend_def );
|
||||
Code parse_function ( s32 length, char const* fn_def );
|
||||
Code parse_global_body( s32 length, char const* body_def );
|
||||
@ -785,18 +912,6 @@ namespace gen
|
||||
Code parse_typedef ( s32 length, char const* typedef_def );
|
||||
Code parse_union ( s32 length, char const* union_def );
|
||||
Code parse_using ( s32 length, char const* using_def );
|
||||
|
||||
s32 parse_classes ( s32 length, char const* class_defs, Code* out_class_codes );
|
||||
s32 parse_enums ( s32 length, char const* enum_defs, Code* out_enum_codes );
|
||||
s32 parse_friends ( s32 length, char const* friend_defs, Code* out_friend_codes );
|
||||
s32 parse_functions ( s32 length, char const* fn_defs, Code* out_fn_codes );
|
||||
s32 parse_namespaces( s32 length, char const* namespace_defs, Code* out_namespaces_codes );
|
||||
s32 parse_operators ( s32 length, char const* operator_defs, Code* out_operator_codes );
|
||||
s32 parse_structs ( s32 length, char const* struct_defs, Code* out_struct_codes );
|
||||
s32 parse_variables ( s32 length, char const* var_defs, Code* out_var_codes );
|
||||
s32 parse_typedefs ( s32 length, char const* typedef_defs, Code* out_typedef_codes );
|
||||
s32 parse_unions ( s32 length, char const* union_defs, Code* out_union_codes );
|
||||
s32 parse_usings ( s32 length, char const* using_defs, Code* out_using_codes );
|
||||
#endif
|
||||
#pragma endregion Parsing
|
||||
|
||||
@ -833,6 +948,15 @@ namespace gen
|
||||
void write();
|
||||
};
|
||||
|
||||
#if defined(GEN_FEATURE_EDITOR) || defined(GEN_FEATURE_SCANNER)
|
||||
struct SymbolInfo
|
||||
{
|
||||
StringCached File;
|
||||
char const* Marker;
|
||||
Code Signature;
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef GEN_FEATURE_EDITOR
|
||||
struct Policy
|
||||
{
|
||||
@ -846,13 +970,6 @@ namespace gen
|
||||
Marker
|
||||
};
|
||||
|
||||
struct SymbolInfo
|
||||
{
|
||||
StringCached File;
|
||||
char const* Marker;
|
||||
Code Signature;
|
||||
};
|
||||
|
||||
struct Editor
|
||||
{
|
||||
enum RequestType : u32
|
||||
@ -1003,11 +1120,11 @@ namespace gen
|
||||
# define function_2( Name_, Params_ ) gen::def_function( txt_n_len( Name_ ), macro_expand( Params_ ) )
|
||||
# define function_1( Name_ ) gen::def_function( txt_n_len( Name_ ) )
|
||||
|
||||
# define params_12( T_1, V_1, T_2, V_2, T_3, V_3, T_4, V_4, T_5, V_5, T_6, V_6 ) gen::def_params( 6, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3), type_ns(T_4), txt_n_len( V_4), type_ns(T_5), txt_n_len( V_5), type_ns(T_6), txt_n_len(V_6))
|
||||
# define params_10( T_1, V_1, T_2, V_2, T_3, V_3, T_4, V_4, T_5, V_5 ) gen::def_params( 5, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3), type_ns(T_4), txt_n_len( V_4), type_ns(T_5), txt_n_len( V_5))
|
||||
# define params_8( T_1, V_1, T_2, V_2, T_3, V_3, T_4, V_4 ) gen::def_params( 4, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3), type_ns(T_4), txt_n_len( V_4) )
|
||||
# define params_6( T_1, V_1, T_2, V_2, T_3, V_3 ) gen::def_params( 3, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3))
|
||||
# define params_4( T_1, V_1, T_2, V_2 ) gen::def_params( 2, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2))
|
||||
# define params_12( T_1, V_1, T_2, V_2, T_3, V_3, T_4, V_4, T_5, V_5, T_6, V_6 ) gen::def_params( 12, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3), type_ns(T_4), txt_n_len( V_4), type_ns(T_5), txt_n_len( V_5), type_ns(T_6), txt_n_len(V_6))
|
||||
# define params_10( T_1, V_1, T_2, V_2, T_3, V_3, T_4, V_4, T_5, V_5 ) gen::def_params( 10, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3), type_ns(T_4), txt_n_len( V_4), type_ns(T_5), txt_n_len( V_5))
|
||||
# define params_8( T_1, V_1, T_2, V_2, T_3, V_3, T_4, V_4 ) gen::def_params( 8, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3), type_ns(T_4), txt_n_len( V_4) )
|
||||
# define params_6( T_1, V_1, T_2, V_2, T_3, V_3 ) gen::def_params( 6, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2), type_ns(T_3), txt_n_len( V_3))
|
||||
# define params_4( T_1, V_1, T_2, V_2 ) gen::def_params( 4, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2))
|
||||
# define params_2( T_1, V_1 ) gen::def_param ( type_ns(T_1), txt_n_len( V_1))
|
||||
# define params_bad static_assert("params(...): Invalid number of parameters provided.")
|
||||
# define params_11 params_bad
|
||||
@ -1019,9 +1136,10 @@ namespace gen
|
||||
|
||||
// Upfront
|
||||
|
||||
# define comment( Value_ ) gen::def_comment( sizeof(Value), Value_ )
|
||||
# define attribute( Value_ ) gen::def_attribute( txt_n_len(Value_) )
|
||||
# define class( Name_, ... ) gen::def_class( txt_n_len(Name_), __VA_ARGS__ )
|
||||
# define enum( Name_, Type_, Body_ ) gen::def_enum ( txt_n_len(Name_), type_ns(Type_), Body_ )
|
||||
|
||||
# define extern_linkage( Name_, Body_ ) gen::def_extern_linkage( txt_n_len(Name_), Body_ )
|
||||
# define function( ... ) macrofn_polymorphic( function, __VA_ARGS__ )
|
||||
# define namespace( Name_, Body_ ) gen::def_namespace ( txt_n_len(Name_), Body_ )
|
||||
@ -1033,8 +1151,7 @@ namespace gen
|
||||
# define type( Value_, ... ) gen::def_type ( txt_n_len(Value_), __VA_ARGS__ )
|
||||
# define type_fmt( Fmt_, ... ) gen::def_type ( bprintf( Fmt_, __VA_ARGS__ ) )
|
||||
# define union( Name_, ... ) gen::def_union ( txt_n_len(Name_), __VA_ARGS__ )
|
||||
# define using( Name_, Type_ ) gen::def_using ( txt_n_len(Name_), type_ns(Type_) )
|
||||
# define using_namespace( Name_ ) gen::def_using_namespace( txt_n_len(Name_) )
|
||||
# define using( Name_, ... ) gen::def_using ( txt_n_len(Name_), __VA_ARGS__ )
|
||||
|
||||
# define class_body( ... ) gen::def_class_body ( macro_num_args( __VA_ARGS__ ), __VA_ARGS__ )
|
||||
# define enum_body( ... ) gen::def_enum_body ( macro_num_args( __VA_ARGS__ ), __VA_ARGS__ )
|
||||
@ -1116,6 +1233,7 @@ namespace gen
|
||||
constexpr s32 SizePer_CodeEntriresArena = megabytes(16);
|
||||
constexpr s32 SizePer_StringArena = megabytes(32);
|
||||
|
||||
constexpr s32 MaxCommentLineLength = 1024;
|
||||
constexpr s32 MaxNameLength = 128;
|
||||
constexpr s32 MaxUntypedStrLength = kilobytes(640);
|
||||
constexpr s32 StringTable_MaxHashLength = kilobytes(1);
|
||||
|
Loading…
Reference in New Issue
Block a user