diff --git a/.vscode/settings.json b/.vscode/settings.json index 4914447..c8c081b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -42,7 +42,21 @@ "gen.h": "c", "string_ops.hpp": "c", "assert.h": "c", - "intrin.h": "c" + "intrin.h": "c", + "bit": "cpp", + "cmath": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "iosfwd": "cpp", + "new": "cpp", + "typeinfo": "cpp", + "unordered_map": "cpp", + "xstddef": "cpp" }, "C_Cpp.intelliSenseEngineFallback": "disabled", "mesonbuild.configureOnOpen": true, diff --git a/gen_c_library/c_library.cpp b/gen_c_library/c_library.cpp index 3389bc7..f07659a 100644 --- a/gen_c_library/c_library.cpp +++ b/gen_c_library/c_library.cpp @@ -100,6 +100,9 @@ int gen_main() #define project_dir "../project/" gen::init(); + PreprocessorDefines.append(txt("GEN_API_C_BEGIN")); + PreprocessorDefines.append(txt("GEN_API_C_END")); + Code push_ignores = scan_file( project_dir "helpers/push_ignores.inline.hpp" ); Code pop_ignores = scan_file( project_dir "helpers/pop_ignores.inline.hpp" ); Code c_library_header_start = scan_file( "components/header_start.hpp" ); @@ -127,21 +130,21 @@ int gen_main() header.print( basic_types ); header.print( debug ); - Array(StrC) to_rename = array_init_reserve(StrC, GlobalAllocator, 128); - to_rename.append(txt("align_forward")); - to_rename.append(txt("pointer_add")); - to_rename.append(txt("allocator_info")); - to_rename.append(txt("size_remaining")); - to_rename.append(txt("free")); + // Array(StrC) to_rename = array_init_reserve(StrC, GlobalAllocator, 128); + // to_rename.append(txt("align_forward")); + // to_rename.append(txt("pointer_add")); + // to_rename.append(txt("allocator_info")); + // to_rename.append(txt("size_remaining")); + // to_rename.append(txt("free")); // to_rename.append(txt("clear")); // to_rename.append(txt("init_sub")); // to_rename.append(txt("check")); - NeedsSelectors needs_selectors; - needs_selectors.table = hashtable_init_reserve(Array(CodeFn), GlobalAllocator, 1024); - for ( StrC id : to_rename ) { - needs_selectors.set(id, array_init_reserve(CodeFn, GlobalAllocator, 128)); - } + // NeedsSelectors needs_selectors; + // needs_selectors.table = hashtable_init_reserve(Array(CodeFn), GlobalAllocator, 1024); + // for ( StrC id : to_rename ) { + // needs_selectors.set(id, array_init_reserve(CodeFn, GlobalAllocator, 128)); + // } CodeBody parsed_memory = parse_file( project_dir "dependencies/memory.hpp" ); CodeBody memory = def_body(CT_Global_Body); @@ -152,7 +155,7 @@ int gen_main() { case CT_Using: { - log_fmt("REPLACE THIS MANUALLY: %S\n", entry->Name); + log_fmt("REPLACE THIS MANUALLY: %SC\n", entry->Name); CodeUsing using_ver = cast(CodeUsing, entry); CodeTypedef typedef_ver = def_typedef(using_ver->Name, using_ver->UnderlyingType); diff --git a/gen_c_library/components/containers.hashtable.hpp b/gen_c_library/components/containers.hashtable.hpp index c8ef7fc..fe3ecb9 100644 --- a/gen_c_library/components/containers.hashtable.hpp +++ b/gen_c_library/components/containers.hashtable.hpp @@ -88,7 +88,7 @@ CodeBody gen_hashtable( StrC type, StrC hashtable_name ) void _remove ( self, u64 key ); void _remove_entry( self, ssize idx ); void _set ( * self, u64 key, value ); - ssize _slot ( self, u64 key ); + ssize _slot ( self, u64 key ); ssize __add_entry( self, u64 key ); HT_FindResult __find ( self, u64 key ); diff --git a/project/components/header_end.hpp b/project/components/header_end.hpp index 4529bc7..d12dad2 100644 --- a/project/components/header_end.hpp +++ b/project/components/header_end.hpp @@ -159,16 +159,16 @@ extern CodeTypename t_typename; // Used by the lexer to persistently treat all these identifiers as preprocessor defines. // Populate with strings via gen::get_cached_string. // Functional defines must have format: id( ;at minimum to indicate that the define is only valid with arguments. -extern Array< StringCached > PreprocessorDefines; +extern Array(StringCached) PreprocessorDefines; #ifdef GEN_EXPOSE_BACKEND // Global allocator used for data with process lifetime. extern AllocatorInfo GlobalAllocator; - extern Array< Arena > Global_AllocatorBuckets; + extern Array(Arena) Global_AllocatorBuckets; - extern Array< Pool > CodePools; - extern Array< Arena > StringArenas; + extern Array(Pool) CodePools; + extern Array(Arena) StringArenas; extern StringTable StringCache; diff --git a/project/components/lexer.cpp b/project/components/lexer.cpp index d4bb9b2..e74b5d0 100644 --- a/project/components/lexer.cpp +++ b/project/components/lexer.cpp @@ -578,16 +578,16 @@ TokArray lex( StrC content ) return { {}, 0 }; } - for ( StringCached* entry = array_begin(PreprocessorDefines); entry != array_end(PreprocessorDefines); array_next(PreprocessorDefines, entry)) + for ( StringCached* entry = array_begin(PreprocessorDefines); entry != array_end(PreprocessorDefines); entry = array_next(PreprocessorDefines, entry)) { s32 length = 0; - char const* scanner = * entry; - while ( entry->Len > length && (char_is_alphanumeric( *scanner ) || *scanner == '_') ) + char const* entry_scanner = * entry; + while ( entry->Len > length && (char_is_alphanumeric( *entry_scanner ) || *entry_scanner == '_') ) { - c.scanner++; + entry_scanner++; length ++; } - if ( c.scanner[0] == '(' ) + if ( entry_scanner[0] == '(' ) { length++; } diff --git a/project/components/parser.cpp b/project/components/parser.cpp index c06ccfa..74c9ba7 100644 --- a/project/components/parser.cpp +++ b/project/components/parser.cpp @@ -3859,8 +3859,47 @@ CodeFriend parse_friend() eat( Tok_Decl_Friend ); // friend - CodeFn function = { nullptr }; - CodeOperator op = { nullptr }; + CodeFn function = { nullptr }; + CodeOperator op = { nullptr }; + CodeSpecifiers specifiers = { nullptr }; + + // Specifiers Parsing + { + Specifier specs_found[ 16 ] { Spec_NumSpecifiers }; + s32 NumSpecifiers = 0; + + while ( left && is_specifier(currtok) ) + { + Specifier spec = to_specifier( to_str(currtok) ); + + switch ( spec ) + { + case Spec_Const : + case Spec_Inline : + case Spec_ForceInline : + break; + + default : + log_failure( "Invalid specifier %s for friend definition\n%s", to_str( spec ), to_string(Context) ); + pop(& Context); + return InvalidCode; + } + + // Ignore const it will be handled by the type + if ( spec == Spec_Const ) + break; + + specs_found[ NumSpecifiers ] = spec; + NumSpecifiers++; + eat( currtok.Type ); + } + + if ( NumSpecifiers ) + { + specifiers = def_specifiers( NumSpecifiers, specs_found ); + } + // + } // Type declaration or return type CodeTypename type = parse_type(); @@ -3879,7 +3918,7 @@ CodeFriend parse_friend() Context.Scope->Name = name; // friend - function = parse_function_after_name( ModuleFlag_None, NullCode, NullCode, type, name ); + function = parse_function_after_name( ModuleFlag_None, NullCode, specifiers, type, name ); // Parameter list // CodeParam params = parse_params(); @@ -3897,7 +3936,7 @@ CodeFriend parse_friend() // Operator declaration or definition if ( currtok.Type == Tok_Decl_Operator ) { - op = parse_operator_after_ret_type( ModuleFlag_None, NullCode, NullCode, type ); + op = parse_operator_after_ret_type( ModuleFlag_None, NullCode, specifiers, type ); } CodeComment inline_cmt = NullCode; diff --git a/project/components/static_data.cpp b/project/components/static_data.cpp index 92725dc..c54cc66 100644 --- a/project/components/static_data.cpp +++ b/project/components/static_data.cpp @@ -82,7 +82,7 @@ global CodeTypename t_wchar_t; global CodeTypename t_class; global CodeTypename t_typename; -global Array< StringCached > PreprocessorDefines; +global Array(StringCached) PreprocessorDefines; #ifdef GEN_DEFINE_LIBRARY_CODE_CONSTANTS global CodeTypename t_b32; diff --git a/project/dependencies/containers.hpp b/project/dependencies/containers.hpp index acfa5c6..01f650a 100644 --- a/project/dependencies/containers.hpp +++ b/project/dependencies/containers.hpp @@ -114,7 +114,7 @@ template forceinline Type* next(Array& array, Type* entry) { r template forceinline Type* array_begin(Array array) { return array; } template forceinline Type* array_end(Array array) { return array + array_get_header(array)->Num; } -template forceinline Type* array_next(Array array, Type* entry) { return entry + 1; } +template forceinline Type* array_next(Array array, Type* entry) { return ++ entry; } template inline Array array_init(AllocatorInfo allocator) { diff --git a/project/dependencies/macros.hpp b/project/dependencies/macros.hpp index c603535..bee0015 100644 --- a/project/dependencies/macros.hpp +++ b/project/dependencies/macros.hpp @@ -206,7 +206,7 @@ #endif #ifndef GEN_API_C_BEGIN -# if GEN_COMPILER_C +# if GEN_COMPILER_C || (GEN_COMPILER_CPP && GEN_SUPPORT_CPP_REFERENCES) # define GEN_API_C_BEGIN # define GEN_API_C_END # else diff --git a/project/dependencies/memory.hpp b/project/dependencies/memory.hpp index 92bacce..76d2af1 100644 --- a/project/dependencies/memory.hpp +++ b/project/dependencies/memory.hpp @@ -320,8 +320,10 @@ ssize arena_size_remaining(Arena* arena, ssize alignment) } #pragma endregion Arena + GEN_API_C_END + #pragma region FixedArena template struct FixedArena; @@ -384,8 +386,10 @@ using Arena_2MB = FixedArena< megabytes( 2 ) >; using Arena_4MB = FixedArena< megabytes( 4 ) >; #pragma endregion FixedArena + GEN_API_C_BEGIN + #pragma region Pool struct Pool_Def; typedef struct Pool_Def Pool; diff --git a/project/dependencies/strings.hpp b/project/dependencies/strings.hpp index 57273a4..117fd84 100644 --- a/project/dependencies/strings.hpp +++ b/project/dependencies/strings.hpp @@ -49,13 +49,14 @@ forceinline char const* strc_end (StrC str) { return str.Ptr forceinline char const* strc_next (StrC str, char const* iter) { return iter + 1; } GEN_API_C_END -#if GEN_COMPILER_CPP && 0 +#if GEN_COMPILER_CPP forceinline char const* begin(StrC str) { return str.Ptr; } forceinline char const* end (StrC str) { return str.Ptr + str.Len; } forceinline char const* next (StrC str, char const* iter) { return iter + 1; } #endif GEN_API_C_BEGIN + inline bool strc_are_equal(StrC lhs, StrC rhs) { @@ -119,6 +120,7 @@ struct String; #endif GEN_API_C_BEGIN + forceinline usize string_grow_formula(usize value); String string_make_c_str (AllocatorInfo allocator, char const* str); @@ -155,6 +157,7 @@ StrC string_to_strc (String str); void string_trim (String str, char const* cut_set); void string_trim_space (String str); String string_visualize_whitespace(String const str); + GEN_API_C_END struct StringHeader {