mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-30 14:30:53 -07: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:
		
							
								
								
									
										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 | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include "Banned.define.hpp" | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(__GNUC__) || defined(__clang__) | #if defined(__GNUC__) || defined(__clang__) | ||||||
| 	// Supports 0-10 arguments | 	// Supports 0-10 arguments | ||||||
| 	#define macro_num_args_impl( _0,                      \ | 	#define macro_num_args_impl( _0,                      \ | ||||||
|   | |||||||
							
								
								
									
										889
									
								
								project/gen.cpp
									
									
									
									
									
								
							
							
						
						
									
										889
									
								
								project/gen.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										330
									
								
								project/gen.hpp
									
									
									
									
									
								
							
							
						
						
									
										330
									
								
								project/gen.hpp
									
									
									
									
									
								
							| @@ -39,9 +39,11 @@ namespace gen | |||||||
| 	{ | 	{ | ||||||
| 	#	define Define_Types           \ | 	#	define Define_Types           \ | ||||||
| 		Entry( Untyped )              \ | 		Entry( Untyped )              \ | ||||||
| 		Entry( Access_Public )       \ | 		Entry( Comment )              \ | ||||||
| 		Entry( Access_Protected )    \ |  | ||||||
| 		Entry( Access_Private )       \ | 		Entry( Access_Private )       \ | ||||||
|  | 		Entry( Access_Protected )     \ | ||||||
|  | 		Entry( Access_Public )        \ | ||||||
|  | 		Entry( Attributes )           \ | ||||||
| 		Entry( Class )                \ | 		Entry( Class )                \ | ||||||
| 		Entry( Class_Fwd )            \ | 		Entry( Class_Fwd )            \ | ||||||
| 		Entry( Class_Body )           \ | 		Entry( Class_Body )           \ | ||||||
| @@ -51,6 +53,7 @@ namespace gen | |||||||
| 		Entry( Enum_Class )           \ | 		Entry( Enum_Class )           \ | ||||||
| 		Entry( Enum_Class_Fwd )       \ | 		Entry( Enum_Class_Fwd )       \ | ||||||
| 		Entry( Execution )            \ | 		Entry( Execution )            \ | ||||||
|  | 		Entry( Export_Body )          \ | ||||||
| 		Entry( Extern_Linkage )       \ | 		Entry( Extern_Linkage )       \ | ||||||
| 		Entry( Extern_Linkage_Body )  \ | 		Entry( Extern_Linkage_Body )  \ | ||||||
| 		Entry( Friend )               \ | 		Entry( Friend )               \ | ||||||
| @@ -58,6 +61,7 @@ namespace gen | |||||||
| 		Entry( Function_Fwd )         \ | 		Entry( Function_Fwd )         \ | ||||||
| 		Entry( Function_Body )        \ | 		Entry( Function_Body )        \ | ||||||
| 		Entry( Global_Body )          \ | 		Entry( Global_Body )          \ | ||||||
|  | 		Entry( Module )               \ | ||||||
| 		Entry( Namespace )            \ | 		Entry( Namespace )            \ | ||||||
| 		Entry( Namespace_Body )       \ | 		Entry( Namespace_Body )       \ | ||||||
| 		Entry( Operator )             \ | 		Entry( Operator )             \ | ||||||
| @@ -65,6 +69,7 @@ namespace gen | |||||||
| 		Entry( Operator_Member )      \ | 		Entry( Operator_Member )      \ | ||||||
| 		Entry( Operator_Member_Fwd )  \ | 		Entry( Operator_Member_Fwd )  \ | ||||||
| 		Entry( Parameters )           \ | 		Entry( Parameters )           \ | ||||||
|  | 		Entry( Preprocessor_Include ) \ | ||||||
| 		Entry( Specifiers )           \ | 		Entry( Specifiers )           \ | ||||||
| 		Entry( Struct )               \ | 		Entry( Struct )               \ | ||||||
| 		Entry( Struct_Fwd )           \ | 		Entry( Struct_Fwd )           \ | ||||||
| @@ -101,7 +106,7 @@ namespace gen | |||||||
| 			return lookup[ type ]; | 			return lookup[ type ]; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		#undef Define_Types | 	#	undef Define_Types | ||||||
| 	} | 	} | ||||||
| 	using CodeT = ECode::Type; | 	using CodeT = ECode::Type; | ||||||
|  |  | ||||||
| @@ -197,38 +202,27 @@ namespace gen | |||||||
| 			return lookup[ op ]; | 			return lookup[ op ]; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	#undef Define_Operators | 	#	undef Define_Operators | ||||||
| 	} | 	} | ||||||
| 	using OperatorT = EOperator::Type; | 	using OperatorT = EOperator::Type; | ||||||
|  |  | ||||||
| 	namespace ESpecifier | 	namespace ESpecifier | ||||||
| 	{ | 	{ | ||||||
| 	#if defined(ZPL_SYSTEM_WINDOWS) | 	/* | ||||||
| 	#	define API_Export_Code __declspec(dllexport) | 		Note: The following are handled separately: | ||||||
| 	#	define API_Import_Code __declspec(dllimport) | 		attributes | ||||||
| 	#	define API_Keyword     __declspec | 		alignas | ||||||
| 	#elif defined(ZPL_SYSTEM_MACOS) | 	*/ | ||||||
| 	#	define API_Export_Code __attribute__ ((visibility ("default"))) |  | ||||||
| 	#	define API_Import_Code __attribute__ ((visibility ("default"))) |  | ||||||
| 	#	define API_Keyword     __attribute__ |  | ||||||
| 	#endif |  | ||||||
|  |  | ||||||
| 		#define Define_Specifiers                    \ | 		#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( Const,            const )             \ | ||||||
| 		Entry( Consteval,        consteval )         \ | 		Entry( Consteval,        consteval )         \ | ||||||
| 		Entry( Constexpr,        constexpr )         \ | 		Entry( Constexpr,        constexpr )         \ | ||||||
| 		Entry( Constinit,        constinit )         \ | 		Entry( Constinit,        constinit )         \ | ||||||
| 		Entry( Export,           export )            \ |  | ||||||
| 		Entry( External_Linkage, extern )            \ | 		Entry( External_Linkage, extern )            \ | ||||||
| 		Entry( Import,           import )            \ |  | ||||||
| 		Entry( Inline,           inline )            \ | 		Entry( Inline,           inline )            \ | ||||||
| 		Entry( Internal_Linkage, static )            \ | 		Entry( Internal_Linkage, static )            \ | ||||||
| 		Entry( Local_Persist,    static )            \ | 		Entry( Local_Persist,    static )            \ | ||||||
| 		Entry( Module,           module )            \ |  | ||||||
| 		Entry( Mutable,          mutable )           \ | 		Entry( Mutable,          mutable )           \ | ||||||
| 		Entry( Ptr,              * )                 \ | 		Entry( Ptr,              * )                 \ | ||||||
| 		Entry( Ref,              & )                 \ | 		Entry( Ref,              & )                 \ | ||||||
| @@ -295,6 +289,78 @@ namespace gen | |||||||
| 	} | 	} | ||||||
| 	using SpecifierT = ESpecifier::Type; | 	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 | #pragma region Data Structures | ||||||
| 	// Implements basic string interning. Data structure is based off the ZPL Hashtable. | 	// Implements basic string interning. Data structure is based off the ZPL Hashtable. | ||||||
| 	ZPL_TABLE_DECLARE( ZPL_EXTERN, StringTable, str_tbl_, String ); | 	ZPL_TABLE_DECLARE( ZPL_EXTERN, StringTable, str_tbl_, String ); | ||||||
| @@ -326,7 +392,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		void add_entry( AST* other ); | 		void add_entry( AST* other ); | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		AST* body() | 		AST* body() | ||||||
| 		{ | 		{ | ||||||
| 			return Entries[0]; | 			return Entries[0]; | ||||||
| @@ -334,19 +400,19 @@ namespace gen | |||||||
|  |  | ||||||
| 		AST* duplicate(); | 		AST* duplicate(); | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		bool has_entries() | 		bool has_entries() | ||||||
| 		{ | 		{ | ||||||
| 			return Entries[0]; | 			return Entries[0]; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		bool is_invalid() | 		bool is_invalid() | ||||||
| 		{ | 		{ | ||||||
| 			return Type != ECode::Invalid; | 			return Type != ECode::Invalid; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		s32 num_entries() | 		s32 num_entries() | ||||||
| 		{ | 		{ | ||||||
| 			return DynamicEntries ? array_count(Entries) : StaticIndex; | 			return DynamicEntries ? array_count(Entries) : StaticIndex; | ||||||
| @@ -354,7 +420,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		// Class/Struct | 		// Class/Struct | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		AST* parent() | 		AST* parent() | ||||||
| 		{ | 		{ | ||||||
| 			return Entries[1]; | 			return Entries[1]; | ||||||
| @@ -362,7 +428,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		// Enum | 		// Enum | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		AST* underlying_type() | 		AST* underlying_type() | ||||||
| 		{ | 		{ | ||||||
| 			return Entries[1]; | 			return Entries[1]; | ||||||
| @@ -372,7 +438,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		bool add_param( AST* type, s32 length, char const* name ); | 		bool add_param( AST* type, s32 length, char const* name ); | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		AST* get_param( s32 index ) | 		AST* get_param( s32 index ) | ||||||
| 		{ | 		{ | ||||||
| 			if ( index <= 0 ) | 			if ( index <= 0 ) | ||||||
| @@ -381,14 +447,14 @@ namespace gen | |||||||
| 			return Entries[ index + 1 ]; | 			return Entries[ index + 1 ]; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		s32 param_count() | 		s32 param_count() | ||||||
| 		{ | 		{ | ||||||
| 			// The first entry (which holds the type) represents the first parameter. | 			// The first entry (which holds the type) represents the first parameter. | ||||||
| 			return num_entries(); | 			return num_entries(); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		AST* param_type() | 		AST* param_type() | ||||||
| 		{ | 		{ | ||||||
| 			return Entries[0]; | 			return Entries[0]; | ||||||
| @@ -411,32 +477,32 @@ namespace gen | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		inline | 		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 ) | 				if ( ArrSpecs[StaticIndex] == spec ) | ||||||
| 					return true; | 					return idx; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			return false; | 			return -1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// Typename | 		// Typename | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		bool typename_is_ptr() | 		bool typename_is_ptr() | ||||||
| 		{ | 		{ | ||||||
| 			assert_crash("not implemented"); | 			assert_crash("not implemented"); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		bool typename_is_ref() | 		bool typename_is_ref() | ||||||
| 		{ | 		{ | ||||||
| 			assert_crash("not implemented"); | 			assert_crash("not implemented"); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		AST* typename_specifiers() | 		AST* typename_specifiers() | ||||||
| 		{ | 		{ | ||||||
| 			return Entries[0]; | 			return Entries[0]; | ||||||
| @@ -444,7 +510,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		// Serialization | 		// Serialization | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		char const* debug_str() | 		char const* debug_str() | ||||||
| 		{ | 		{ | ||||||
| 			char const* fmt = txt( | 			char const* fmt = txt( | ||||||
| @@ -469,7 +535,7 @@ namespace gen | |||||||
| 			); | 			); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		char const* type_str() | 		char const* type_str() | ||||||
| 		{ | 		{ | ||||||
| 			return ECode::to_str( Type ); | 			return ECode::to_str( Type ); | ||||||
| @@ -481,12 +547,14 @@ namespace gen | |||||||
| 		constexpr static | 		constexpr static | ||||||
| 		uw ArrS_Cap = | 		uw ArrS_Cap = | ||||||
| 		( 	AST_POD_Size | 		( 	AST_POD_Size | ||||||
| 			- sizeof(AST*) | 			- sizeof(AST*)         // Parent | ||||||
| 			- sizeof(StringCached) * 2 | 			- sizeof(StringCached) // Name | ||||||
| 			- sizeof(CodeT) | 			- sizeof(CodeT) 	   // Type | ||||||
| 			- sizeof(OperatorT) | 			- sizeof(OperatorT)    // Op | ||||||
| 			- sizeof(bool) * 2 | 			- sizeof(ModuleFlag)   // ModuleFlags | ||||||
| 			- sizeof(u8) * 7 ) | 			- sizeof(u32) 		   // StaticIndex | ||||||
|  | 			- sizeof(bool) * 2     // Readonly, DynamicEntries | ||||||
|  | 			- sizeof(u8) * 6 )     // _Align_Pad | ||||||
| 		/ sizeof(AST*); | 		/ sizeof(AST*); | ||||||
|  |  | ||||||
| 		constexpr static | 		constexpr static | ||||||
| @@ -501,12 +569,12 @@ namespace gen | |||||||
| 		};                                             \ | 		};                                             \ | ||||||
| 		AST*              Parent;                      \ | 		AST*              Parent;                      \ | ||||||
| 		StringCached      Name;                        \ | 		StringCached      Name;                        \ | ||||||
| 		StringCached      Comment;                     \ |  | ||||||
| 		CodeT             Type;                        \ | 		CodeT             Type;                        \ | ||||||
| 		OperatorT         Op;                          \ | 		OperatorT         Op;                          \ | ||||||
|  | 		ModuleFlag        ModuleFlags;                 \ | ||||||
|  | 		u32               StaticIndex;                 \ | ||||||
| 		bool              Readonly;                    \ | 		bool              Readonly;                    \ | ||||||
| 		bool              DynamicEntries;              \ | 		bool              DynamicEntries;              \ | ||||||
| 		u8                StaticIndex;                 \ |  | ||||||
| 		u8                _Align_Pad[6]; | 		u8                _Align_Pad[6]; | ||||||
|  |  | ||||||
| 		Using_Code_POD | 		Using_Code_POD | ||||||
| @@ -537,7 +605,7 @@ namespace gen | |||||||
| 	struct Code | 	struct Code | ||||||
| 	{ | 	{ | ||||||
| 	#pragma region Statics | 	#pragma region Statics | ||||||
| 		// Used internally for the most part to identify invaidly generated code. | 		// Used to identify invalid generated code. | ||||||
| 		static Code Invalid; | 		static Code Invalid; | ||||||
| 	#pragma endregion Statics | 	#pragma endregion Statics | ||||||
|  |  | ||||||
| @@ -574,43 +642,43 @@ namespace gen | |||||||
| 			return * (Code*)( ast->body() ); | 			return * (Code*)( ast->body() ); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		void lock() | 		void lock() | ||||||
| 		{ | 		{ | ||||||
| 			ast->Readonly = true; | 			ast->Readonly = true; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		char const* to_string() | 		char const* to_string() | ||||||
| 		{ | 		{ | ||||||
| 			return ast->to_string(); | 			return ast->to_string(); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		operator bool() | 		operator bool() | ||||||
| 		{ | 		{ | ||||||
| 			return ast; | 			return ast; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		bool operator ==( Code other ) | 		bool operator ==( Code other ) | ||||||
| 		{ | 		{ | ||||||
| 			return ast == other.ast; | 			return ast == other.ast; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		bool operator !=( Code other ) | 		bool operator !=( Code other ) | ||||||
| 		{ | 		{ | ||||||
| 			return ast != other.ast; | 			return ast != other.ast; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		operator AST*() | 		operator AST*() | ||||||
| 		{ | 		{ | ||||||
| 			return ast; | 			return ast; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		Code& operator=( Code other ) | 		Code& operator=( Code other ) | ||||||
| 		{ | 		{ | ||||||
| 			if ( ast == nullptr ) | 			if ( ast == nullptr ) | ||||||
| @@ -632,7 +700,7 @@ namespace gen | |||||||
| 			return *this; | 			return *this; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		forceinline | 		inline | ||||||
| 		AST* operator->() | 		AST* operator->() | ||||||
| 		{ | 		{ | ||||||
| 			if ( ast == nullptr ) | 			if ( ast == nullptr ) | ||||||
| @@ -710,34 +778,68 @@ namespace gen | |||||||
| 	void set_allocator_type_table       ( AllocatorInfo type_reg_allocator ); | 	void set_allocator_type_table       ( AllocatorInfo type_reg_allocator ); | ||||||
|  |  | ||||||
| #	pragma region Upfront | #	pragma region Upfront | ||||||
| 	Code def_class          ( s32 length, char const* name, Code parent = NoCode,                         Code specifiers = NoCode, Code body = NoCode ); | 	Code def_comment   ( s32 length, char const* content ); | ||||||
| 	Code def_enum           ( s32 length, char const* name, Code type   = NoCode, EnumT specifier = EnumRegular,                    Code body = NoCode ); | 	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_enum( s32 length, char const* name | ||||||
|  | 		, Code       body      = NoCode,      Code type       = NoCode | ||||||
|  | 		, EnumT      specifier = EnumRegular, Code attributes = NoCode | ||||||
|  | 		, ModuleFlag mflags    = ModuleFlag::None ); | ||||||
|  |  | ||||||
|  | 	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_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_function( s32 length, char const* name | ||||||
| 	Code def_namespace      ( s32 length, char const* name,                                                                         Code body ); | 		, Code       params     = NoCode, Code ret_type   = NoCode, Code body = NoCode | ||||||
| 	Code def_operator       (             OperatorT   op,   Code params = NoCode, Code ret_type = NoCode, Code specifiers = NoCode, Code body = NoCode ); | 		, Code       specifiers = NoCode, Code attributes = NoCode | ||||||
|  | 		, ModuleFlag mflags     = ModuleFlag::None ); | ||||||
|  |  | ||||||
|  | 	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_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_param     ( Code type, s32 length, char const* name, Code value = NoCode ); | 	Code def_param     ( Code type, s32 length, char const* name, Code value = NoCode ); | ||||||
|  | 	Code def_specifier( SpecifierT specifier ); | ||||||
|  |  | ||||||
| 	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_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 attributes = NoCode, ModuleFlag mflags = ModuleFlag::None ); | ||||||
| 	Code def_typedef        ( s32 length, char const* name, Code type ); | 	Code def_type   ( s32 length, char const* name, Code arrayexpr = NoCode, Code specifiers = NoCode ); | ||||||
| 	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_variable       ( Code type, s32 length, char const* name, Code value = 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_class_body      ( s32 num, ... ); | ||||||
| 	Code def_enum_body       ( s32 num, ... ); | 	Code def_enum_body       ( s32 num, ... ); | ||||||
| 	Code def_enum_body       ( s32 num, Code* codes ); | 	Code def_enum_body       ( s32 num, Code* codes ); | ||||||
| 	Code def_extern_linkage_body( s32 num, ... ); | 	Code def_extern_link_body( s32 num, ... ); | ||||||
| 	Code def_extern_linkage_body( s32 num, Code* codes ); | 	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 def_global_body     ( s32 num, Code* codes ); | 	Code def_global_body     ( s32 num, Code* codes ); | ||||||
| 	Code def_function_body   ( s32 num, ... ); | 	Code def_function_body   ( s32 num, ... ); | ||||||
| @@ -756,17 +858,40 @@ namespace gen | |||||||
|  |  | ||||||
| #	pragma region Incremental | #	pragma region Incremental | ||||||
| #	ifdef GEN_FEATURE_INCREMENTAL | #	ifdef GEN_FEATURE_INCREMENTAL | ||||||
| 	Code make_class         ( s32 length,     char const* name, Code parent = NoCode,                                Code specifiers = NoCode ); | 	Code make_class( s32 length, char const* name | ||||||
| 	Code make_enum          ( s32 length,     char const* name, Code type   = NoCode, EnumT specifier = EnumRegular ); | 		, 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_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_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_namespace  ( s32 length,     char const* name ); | ||||||
| 	Code make_operator      (                 OperatorT   op,   Code params = NoCode, Code  ret_type  = NoCode,      Code specifiers = NoCode ); |  | ||||||
|  | 	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_params    (); | ||||||
| 	Code make_specifiers    (); | 	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_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 | #	endif | ||||||
| #	pragma endregion Incremental | #	pragma endregion Incremental | ||||||
|  |  | ||||||
| @@ -774,6 +899,8 @@ namespace gen | |||||||
| 	#ifdef GEN_FEATURE_PARSING | 	#ifdef GEN_FEATURE_PARSING | ||||||
| 	Code parse_class      ( s32 length, char const* class_def     ); | 	Code parse_class      ( s32 length, char const* class_def     ); | ||||||
| 	Code parse_enum       ( s32 length, char const* enum_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_friend     ( s32 length, char const* friend_def    ); | ||||||
| 	Code parse_function   ( s32 length, char const* fn_def        ); | 	Code parse_function   ( s32 length, char const* fn_def        ); | ||||||
| 	Code parse_global_body( s32 length, char const* body_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_typedef    ( s32 length, char const* typedef_def   ); | ||||||
| 	Code parse_union      ( s32 length, char const* union_def     ); | 	Code parse_union      ( s32 length, char const* union_def     ); | ||||||
| 	Code parse_using      ( s32 length, char const* using_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 | 	#endif | ||||||
| 	#pragma endregion Parsing | 	#pragma endregion Parsing | ||||||
|  |  | ||||||
| @@ -833,6 +948,15 @@ namespace gen | |||||||
| 		void write(); | 		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 | #ifdef GEN_FEATURE_EDITOR | ||||||
| 	struct Policy | 	struct Policy | ||||||
| 	{ | 	{ | ||||||
| @@ -846,13 +970,6 @@ namespace gen | |||||||
| 		Marker | 		Marker | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	struct SymbolInfo |  | ||||||
| 	{ |  | ||||||
| 		StringCached File; |  | ||||||
| 		char const*  Marker; |  | ||||||
| 		Code         Signature; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	struct Editor | 	struct Editor | ||||||
| 	{ | 	{ | ||||||
| 		enum RequestType : u32 | 		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_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 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_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( 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_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( 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_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( 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_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( 2, type_ns(T_1), txt_n_len( V_1), type_ns(T_2), txt_n_len( V_2)) | #	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_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_bad static_assert("params(...): Invalid number of parameters provided.") | ||||||
| #	define params_11  params_bad | #	define params_11  params_bad | ||||||
| @@ -1019,9 +1136,10 @@ namespace gen | |||||||
|  |  | ||||||
| // Upfront | // 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 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 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 extern_linkage( Name_, Body_ ) gen::def_extern_linkage( txt_n_len(Name_), Body_ ) | ||||||
| #	define function( ... )                macrofn_polymorphic( function, __VA_ARGS__ ) | #	define function( ... )                macrofn_polymorphic( function, __VA_ARGS__ ) | ||||||
| #	define namespace( Name_, Body_ )      gen::def_namespace      ( txt_n_len(Name_),  Body_ ) | #	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( Value_, ... )            gen::def_type           ( txt_n_len(Value_), __VA_ARGS__ ) | ||||||
| #	define type_fmt( Fmt_, ... )          gen::def_type           ( bprintf( Fmt_, __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 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( Name_, ... )		  	  gen::def_using          ( txt_n_len(Name_), __VA_ARGS__ ) | ||||||
| #	define using_namespace( Name_ )       gen::def_using_namespace( txt_n_len(Name_) ) |  | ||||||
|  |  | ||||||
| #	define class_body(          ... )     gen::def_class_body    ( macro_num_args( __VA_ARGS__ ), __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__ ) | #	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_CodeEntriresArena = megabytes(16); | ||||||
| 	constexpr s32 SizePer_StringArena       = megabytes(32); | 	constexpr s32 SizePer_StringArena       = megabytes(32); | ||||||
|  |  | ||||||
|  | 	constexpr s32 MaxCommentLineLength      = 1024; | ||||||
| 	constexpr s32 MaxNameLength             = 128; | 	constexpr s32 MaxNameLength             = 128; | ||||||
| 	constexpr s32 MaxUntypedStrLength       = kilobytes(640); | 	constexpr s32 MaxUntypedStrLength       = kilobytes(640); | ||||||
| 	constexpr s32 StringTable_MaxHashLength = kilobytes(1); | 	constexpr s32 StringTable_MaxHashLength = kilobytes(1); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user