From e1592ba410df7e06d0d7186cd8bc500517d5bfe5 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sun, 5 May 2024 21:53:22 -0400 Subject: [PATCH] Bug fixes and updates to package_release.ps1 - Incrased size of the defines_map_arena to 256KB - Various fixes for the parser - Various fixes for code serialization - Fix for is_equal member func in Code types - Fixes for hasthable container - Added are_equal static func to String type for use against StrC - Added starts_with functions to String type - package_release.ps1 now packages all docs (forgot to update it with last release) --- Readme.md | 4 +- project/auxillary/scanner.cpp | 4 +- project/components/code_serialization.cpp | 22 +++--- project/components/gen/ast_inlines.hpp | 87 ++++++++--------------- project/components/interface.cpp | 6 +- project/components/lexer.cpp | 14 +++- project/components/parser.cpp | 45 ++++++++---- project/dependencies/containers.hpp | 42 ++++------- project/dependencies/strings.hpp | 41 +++++++++-- project/helpers/helper.hpp | 5 +- project/helpers/push_ignores.inline.hpp | 1 + scripts/package_release.ps1 | 22 +++--- 12 files changed, 160 insertions(+), 133 deletions(-) diff --git a/Readme.md b/Readme.md index f9c0815..a8cde93 100644 --- a/Readme.md +++ b/Readme.md @@ -10,7 +10,9 @@ Its not meant to be a black box metaprogramming utility, it should be easy to in ## Notes -**On Partial Hiatus: Working on handmade hero for now. Only fixes will be pushed as I come across them until I get what I want done from the series** +**On Partial Hiatus: Life has got me tackling other issues..** +I will be passively updating the library with bug fixes and minor improvements as I use it for my personal projects. +There won't be any major reworks or features to this thing for a while. This project is still in development (very much an alpha state), so expect bugs and missing features. See [issues](https://github.com/Ed94/gencpp/issues) for a list of known bugs or todos. diff --git a/project/auxillary/scanner.cpp b/project/auxillary/scanner.cpp index 871616e..3329581 100644 --- a/project/auxillary/scanner.cpp +++ b/project/auxillary/scanner.cpp @@ -1 +1,3 @@ -#include "scanner.hpp" +#ifdef GEN_INTELLISENSE_DIRECTIVES +# include "scanner.hpp" +#endif diff --git a/project/components/code_serialization.cpp b/project/components/code_serialization.cpp index 45356f5..69a2233 100644 --- a/project/components/code_serialization.cpp +++ b/project/components/code_serialization.cpp @@ -139,7 +139,7 @@ void CodeConstructor::to_string_fwd( String& result ) if ( ast->InlineCmt ) result.append_fmt( "; // %S\n", ast->InlineCmt->Content ); else - result.append( ";" ); + result.append( ";\n" ); } String CodeClass::to_string() @@ -183,7 +183,7 @@ void CodeClass::to_string_def( String& result ) while ( interface ) { result.append_fmt( ", %S", interface.to_string() ); - interface = interface->Next ? interface->Next->cast< CodeType >() : Code { nullptr }; + interface = interface->Next ? interface->Next->cast< CodeType >() : CodeType { nullptr }; } } else if ( ast->Name ) @@ -480,6 +480,7 @@ void CodeFn::to_string_def( String& result ) if ( ast->Attributes ) result.append_fmt( " %S ", ast->Attributes.to_string() ); + b32 prefix_specs = false; if ( ast->Specs ) { for ( SpecifierT spec : ast->Specs ) @@ -488,11 +489,13 @@ void CodeFn::to_string_def( String& result ) { StrC spec_str = ESpecifier::to_str( spec ); result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + + prefix_specs = true; } } } - if ( ast->Attributes || ast->Specs ) + if ( ast->Attributes || prefix_specs ) result.append( "\n" ); if ( ast->ReturnType ) @@ -530,19 +533,22 @@ void CodeFn::to_string_fwd( String& result ) if ( ast->Attributes ) result.append_fmt( "%S ", ast->Attributes.to_string() ); + b32 prefix_specs = false; if ( ast->Specs ) { for ( SpecifierT spec : ast->Specs ) { - if ( ESpecifier::is_trailing( spec ) && ! (spec != ESpecifier::Pure) ) + if ( ! ESpecifier::is_trailing( spec ) || ! (spec != ESpecifier::Pure) ) { StrC spec_str = ESpecifier::to_str( spec ); result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + + prefix_specs = true; } } } - if ( ast->Attributes || ast->Specs ) + if ( ast->Attributes || prefix_specs ) { result.append("\n" ); } @@ -571,7 +577,7 @@ void CodeFn::to_string_fwd( String& result ) } } - if ( ast->Specs.has( ESpecifier::Pure ) >= 0 ) + if ( ast->Specs && ast->Specs.has( ESpecifier::Pure ) >= 0 ) result.append( " = 0;" ); else if (ast->Body) result.append_fmt( " = %S;", ast->Body.to_string() ); @@ -983,7 +989,7 @@ void CodeStruct::to_string_def( String& result ) while ( interface ) { result.append_fmt( ", %S", interface.to_string() ); - interface = interface->Next ? interface->Next->cast< CodeType >() : Code { nullptr }; + interface = interface->Next ? interface->Next->cast< CodeType >() : CodeType { nullptr }; } } else if ( ast->Name ) @@ -1247,7 +1253,7 @@ void CodeVar::to_string( String& result ) result.append( ast->Name ); - if ( ast->ValueType->ArrExpr ) + if ( ast->ValueType && ast->ValueType->ArrExpr ) { result.append_fmt( "[ %S ]", ast->ValueType->ArrExpr.to_string() ); diff --git a/project/components/gen/ast_inlines.hpp b/project/components/gen/ast_inlines.hpp index 0d70d13..2ea8e36 100644 --- a/project/components/gen/ast_inlines.hpp +++ b/project/components/gen/ast_inlines.hpp @@ -28,8 +28,7 @@ bool Code::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -96,8 +95,7 @@ bool CodeBody::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -164,8 +162,7 @@ bool CodeAttributes::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -252,8 +249,7 @@ bool CodeComment::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -340,8 +336,7 @@ bool CodeConstructor::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -428,8 +423,7 @@ bool CodeClass::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -496,8 +490,7 @@ bool CodeDefine::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -584,8 +577,7 @@ bool CodeDestructor::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -672,8 +664,7 @@ bool CodeEnum::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -760,8 +751,7 @@ bool CodeExec::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -848,8 +838,7 @@ bool CodeExtern::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -936,8 +925,7 @@ bool CodeFriend::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1024,8 +1012,7 @@ bool CodeFn::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1112,8 +1099,7 @@ bool CodeInclude::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1200,8 +1186,7 @@ bool CodeModule::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1288,8 +1273,7 @@ bool CodeNS::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1376,8 +1360,7 @@ bool CodeOperator::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1464,8 +1447,7 @@ bool CodeOpCast::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1552,8 +1534,7 @@ bool CodeParam::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1620,8 +1601,7 @@ bool CodePragma::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1708,8 +1688,7 @@ bool CodePreprocessCond::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1796,8 +1775,7 @@ bool CodeSpecifiers::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1864,8 +1842,7 @@ bool CodeStruct::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -1932,8 +1909,7 @@ bool CodeTemplate::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -2020,8 +1996,7 @@ bool CodeType::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -2108,8 +2083,7 @@ bool CodeTypedef::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -2196,8 +2170,7 @@ bool CodeUnion::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -2284,8 +2257,7 @@ bool CodeUsing::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } @@ -2372,8 +2344,7 @@ bool CodeVar::is_equal( Code other ) { if ( ast == nullptr || other.ast == nullptr ) { - log_failure( "Code::is_equal: Cannot compare code, AST is null!" ); - return false; + return rcast( AST*, ast ) == other.ast; } return rcast( AST*, ast )->is_equal( other.ast ); } diff --git a/project/components/interface.cpp b/project/components/interface.cpp index fb65389..3cd845c 100644 --- a/project/components/interface.cpp +++ b/project/components/interface.cpp @@ -88,17 +88,17 @@ void define_constants() access_private = make_code(); access_private->Type = ECode::Access_Private; - access_private->Name = get_cached_string( txt("private:") ); + access_private->Name = get_cached_string( txt("private:\n") ); access_private.set_global(); access_protected = make_code(); access_protected->Type = ECode::Access_Protected; - access_protected->Name = get_cached_string( txt("protected:") ); + access_protected->Name = get_cached_string( txt("protected:\n") ); access_protected.set_global(); access_public = make_code(); access_public->Type = ECode::Access_Public; - access_public->Name = get_cached_string( txt("public:") ); + access_public->Name = get_cached_string( txt("public:\n") ); access_public.set_global(); attrib_api_export = def_attributes( code(GEN_API_Export_Code)); diff --git a/project/components/lexer.cpp b/project/components/lexer.cpp index 7437df5..0a8b547 100644 --- a/project/components/lexer.cpp +++ b/project/components/lexer.cpp @@ -159,7 +159,7 @@ struct TokArray } }; -global Arena_128KB defines_map_arena; +global Arena_256KB defines_map_arena; global HashTable defines; global Array Tokens; @@ -374,6 +374,16 @@ s32 lex_preprocessor_directive( move_forward(); preprocess_content.Length++; + if ( current == '\r' && scanner[1] == '\n' ) + { + move_forward(); + move_forward(); + } + else if ( current == '\n' ) + { + move_forward(); + } + Tokens.append( preprocess_content ); return Lex_Continue; // Skip found token, its all handled here. } @@ -576,7 +586,7 @@ TokArray lex( StrC content ) { s32 length = 0; char const* scanner = entry.Data; - while ( entry.length() > length && char_is_alphanumeric( *scanner ) || *scanner == '_' ) + while ( entry.length() > length && (char_is_alphanumeric( *scanner ) || *scanner == '_') ) { scanner++; length ++; diff --git a/project/components/parser.cpp b/project/components/parser.cpp index 632c510..953fffe 100644 --- a/project/components/parser.cpp +++ b/project/components/parser.cpp @@ -136,8 +136,8 @@ void init() , ( LexAllocator_Size - sizeof( Array::Header ) ) / sizeof(Token) ); - defines_map_arena = Arena_128KB::init(); - defines = HashTable::init( defines_map_arena ); + defines_map_arena = Arena_256KB::init(); + defines = HashTable::init_reserve( defines_map_arena, 256 ); } internal @@ -481,7 +481,7 @@ Code parse_array_decl() if ( check( TokType::Operator ) && currtok.Text[0] == '[' && currtok.Text[1] == ']' ) { - Code array_expr = untyped_str( currtok ); + Code array_expr = untyped_str( get_cached_string(txt(" ")) ); eat( TokType::Operator ); // [] @@ -574,6 +574,10 @@ Code parse_assignment_expression() s32 level = 0; while ( left && currtok.Type != TokType::Statement_End && (currtok.Type != TokType::Comma || level > 0) ) { + if (currtok.Type == TokType::BraceCurly_Open ) + level++; + if (currtok.Type == TokType::BraceCurly_Close ) + level--; if (currtok.Type == TokType::Capture_Start) level++; else if (currtok.Type == TokType::Capture_End) @@ -1539,18 +1543,18 @@ Code parse_function_body() result->Type = Function_Body; // TODO : Support actual parsing of function body - Token start = currtok; + Token start = currtok_noskip; s32 level = 0; - while ( left && ( currtok.Type != TokType::BraceCurly_Close || level > 0 ) ) + while ( left && ( currtok_noskip.Type != TokType::BraceCurly_Close || level > 0 ) ) { - if ( currtok.Type == TokType::BraceCurly_Open ) + if ( currtok_noskip.Type == TokType::BraceCurly_Open ) level++; - else if ( currtok.Type == TokType::BraceCurly_Close && level > 0 ) + else if ( currtok_noskip.Type == TokType::BraceCurly_Close && level > 0 ) level--; - eat( currtok.Type ); + eat( currtok_noskip.Type ); } Token previous = prevtok; @@ -1751,6 +1755,7 @@ CodeBody parse_global_nspace( CodeT which ) case TokType::Spec_Internal_Linkage: case TokType::Spec_NeverInline: case TokType::Spec_Static: + case TokType::Spec_ThreadLocal: { SpecifierT specs_found[16] { ESpecifier::NumSpecifiers }; s32 NumSpecifiers = 0; @@ -1774,6 +1779,7 @@ CodeBody parse_global_nspace( CodeT which ) case ESpecifier::NeverInline: case ESpecifier::Static: case ESpecifier::Volatile: + case ESpecifier::Thread_Local: break; case ESpecifier::Consteval: @@ -2294,7 +2300,7 @@ CodeOperator parse_operator_after_ret_type( case '<': { if ( currtok.Text[1] == '=' ) - op = LEqual; + op = LesserEqual; else if ( currtok.Text[1] == '<' ) { @@ -2683,7 +2689,7 @@ CodeParam parse_params( bool use_template_capture ) s32 capture_level = 0; s32 template_level = 0; - while ( left && (currtok.Type != TokType::Comma) && template_level >= 0 && CheckEndParams() || capture_level > 0 || template_level > 0 ) + while ( left && (currtok.Type != TokType::Comma) && template_level >= 0 && (CheckEndParams() || capture_level > 0 || template_level > 0) ) { if (currtok.Text[ 0 ] == '<') ++ template_level; @@ -2789,8 +2795,7 @@ CodeParam parse_params( bool use_template_capture ) while ( left && currtok.Type != TokType::Comma && template_level >= 0 - && CheckEndParams() - || capture_level > 0 || template_level > 0 ) + && (CheckEndParams() || capture_level > 0 || template_level > 0) ) { if (currtok.Text[ 0 ] == '<') ++ template_level; @@ -2867,7 +2872,7 @@ CodePreprocessCond parse_preprocess_cond() CodePreprocessCond cond = (CodePreprocessCond) make_code(); - cond->Type = scast(CodeT, currtok.Type - (ETokType::Preprocess_If - ECode::Preprocess_If) ); + cond->Type = scast(CodeT, currtok.Type - (s32(ETokType::Preprocess_If) - s32(ECode::Preprocess_If)) ); eat( currtok.Type ); // # @@ -3241,6 +3246,8 @@ CodeVar parse_variable_declaration_list() break; } + eat(currtok.Type); + if ( specifiers ) specifiers.append( spec ); else @@ -3642,6 +3649,13 @@ CodeEnum parse_enum( bool inplace_def ) // = , } + // Consume inline comments + if ( currtok.Type == TokType::Comment && prevtok.Line == currtok.Line ) + { + eat( TokType::Comment ); + // = , // + } + entry.Length = ( (sptr)prevtok.Text + prevtok.Length ) - (sptr)entry.Text; member = untyped_str( entry ); @@ -4385,10 +4399,13 @@ CodeType parse_type( bool from_template, bool* typedef_is_function ) else if ( currtok.Type == TokType::Decl_Class || currtok.Type == TokType::Decl_Enum || currtok.Type == TokType::Decl_Struct || currtok.Type == TokType::Decl_Union ) { + Token fwd_key = currtok; eat( currtok.Type ); // - name = parse_identifier(); + name = parse_identifier(); + fwd_key.Length = sptr(name.Text + name.Length) - sptr(fwd_key.Text); + name = fwd_key; // name.Length = ( ( sptr )currtok.Text + currtok.Length ) - ( sptr )name.Text; // eat( TokType::Identifier ); diff --git a/project/dependencies/containers.hpp b/project/dependencies/containers.hpp index b6b0210..6649c80 100644 --- a/project/dependencies/containers.hpp +++ b/project/dependencies/containers.hpp @@ -155,7 +155,7 @@ struct Array { Header& header = * get_header(); - if ( begin < 0 || end >= header.Num ) + if ( begin < 0 || end > header.Num ) return false; for ( sw idx = begin; idx < end; idx++ ) @@ -312,14 +312,12 @@ struct HashTable Type Value; }; + static constexpr f32 CriticalLoadScale = 0.7f; + static HashTable init( AllocatorInfo allocator ) { - HashTable result = { { nullptr }, { nullptr } }; - - result.Hashes = Array::init( allocator ); - result.Entries = Array::init( allocator ); - + HashTable result = init_reserve(allocator, 8); return result; } @@ -330,19 +328,17 @@ struct HashTable result.Hashes = Array::init_reserve( allocator, num ); result.Hashes.get_header()->Num = num; + result.Hashes.resize( num ); + result.Hashes.fill( 0, num, -1); result.Entries = Array::init_reserve( allocator, num ); - return result; } void clear( void ) { - for ( sw idx = 0; idx < Hashes.num(); idx++ ) - Hashes[ idx ] = -1; - - Hashes.clear(); Entries.clear(); + Hashes.fill( 0, Hashes.num(), -1); } void destroy( void ) @@ -395,32 +391,19 @@ struct HashTable void rehash( sw new_num ) { - sw idx; sw last_added_index; HashTable new_ht = init_reserve( Hashes.get_header()->Allocator, new_num ); - - Array::Header* hash_header = new_ht.Hashes.get_header(); - - for ( idx = 0; idx < new_ht.Hashes.num(); ++idx ) - new_ht.Hashes[ idx ] = -1; - - for ( idx = 0; idx < Entries.num(); ++idx ) + for ( sw idx = 0; idx < Entries.num(); ++idx ) { - Entry& entry = Entries[ idx ]; - FindResult find_result; - if ( new_ht.Hashes.num() == 0 ) - new_ht.grow(); - - entry = Entries[ idx ]; + Entry& entry = Entries[ idx ]; find_result = new_ht.find( entry.Key ); last_added_index = new_ht.add_entry( entry.Key ); if ( find_result.PrevIndex < 0 ) new_ht.Hashes[ find_result.HashIndex ] = last_added_index; - else new_ht.Entries[ find_result.PrevIndex ].Next = last_added_index; @@ -478,11 +461,10 @@ struct HashTable sw idx; FindResult find_result; - if ( Hashes.num() == 0 ) + if ( full() ) grow(); find_result = find( key ); - if ( find_result.EntryIndex >= 0 ) { idx = find_result.EntryIndex; @@ -555,7 +537,9 @@ protected: b32 full() { - return 0.75f * Hashes.num() < Entries.num(); + uw critical_load = uw( CriticalLoadScale * f32(Hashes.num()) ); + b32 result = Entries.num() > critical_load; + return result; } }; diff --git a/project/dependencies/strings.hpp b/project/dependencies/strings.hpp index 54ce806..95c6e14 100644 --- a/project/dependencies/strings.hpp +++ b/project/dependencies/strings.hpp @@ -11,14 +11,12 @@ struct StrC sw Len; char const* Ptr; - operator char const* () const - { - return Ptr; - } + operator char const* () const { return Ptr; } + char const& operator[]( sw index ) const { return Ptr[index]; } }; -#define cast_to_strc( str ) * rcast( StrC*, str - sizeof(sw) ) -#define txt( text ) StrC { sizeof( text ) - 1, text } +#define cast_to_strc( str ) * rcast( StrC*, (str) - sizeof(sw) ) +#define txt( text ) StrC { sizeof( text ) - 1, ( text ) } StrC to_str( char const* str ) { @@ -99,6 +97,19 @@ struct String return true; } + static + bool are_equal( String lhs, StrC rhs ) + { + if ( lhs.length() != (rhs.Len) ) + return false; + + for ( sw idx = 0; idx < lhs.length(); ++idx ) + if ( lhs[idx] != rhs[idx] ) + return false; + + return true; + } + bool make_space_for( char const* str, sw add_len ); bool append( char c ) @@ -197,6 +208,24 @@ struct String return header.Length; } + b32 starts_with( StrC substring ) const + { + if (substring.Len > length()) + return false; + + b32 result = str_compare(Data, substring.Ptr, substring.Len ) == 0; + return result; + } + + b32 starts_with( String substring ) const + { + if (substring.length() > length()) + return false; + + b32 result = str_compare(Data, substring, substring.length() - 1 ) == 0; + return result; + } + void skip_line() { #define current (*scanner) diff --git a/project/helpers/helper.hpp b/project/helpers/helper.hpp index b67b232..83f3c7f 100644 --- a/project/helpers/helper.hpp +++ b/project/helpers/helper.hpp @@ -360,10 +360,9 @@ CodeBody gen_ast_inlines() { if ( ast == nullptr || other.ast == nullptr ) { - log_failure("Code::is_equal: Cannot compare code, AST is null!"); - return false; + // Just check if they're both null. + return rcast(AST*, ast) == other.ast; } - return rcast(AST*, ast)->is_equal( other.ast ); } bool ::is_valid() diff --git a/project/helpers/push_ignores.inline.hpp b/project/helpers/push_ignores.inline.hpp index a47afef..a6e24a8 100644 --- a/project/helpers/push_ignores.inline.hpp +++ b/project/helpers/push_ignores.inline.hpp @@ -1,6 +1,7 @@ #if __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wunused-const-variable" +# pragma clang diagnostic ignored "-Wunused-but-set-variable" # pragma clang diagnostic ignored "-Wswitch" # pragma clang diagnostic ignored "-Wunused-variable" # pragma clang diagnostic ignored "-Wunknown-pragmas" diff --git a/scripts/package_release.ps1 b/scripts/package_release.ps1 index 93802f0..be7efc3 100644 --- a/scripts/package_release.ps1 +++ b/scripts/package_release.ps1 @@ -26,15 +26,21 @@ if ( -not(Test-Path $path_release_content) ) { New-Item -ItemType Directory -Path $path_release_content } -$license = Join-Path $path_root LICENSE -$readme_root = Join-Path $path_root Readme.md -$readme_docs = Join-Path $path_docs Readme.md -$readme_parsing = Join-Path $path_docs Parsing.md +$license = Join-Path $path_root LICENSE +$readme_root = Join-Path $path_root Readme.md +$readme_docs = Join-Path $path_docs Readme.md +$readme_ast_design = Join-Path $path_docs AST_Design.md +$readme_ast_types = Join-Path $path_docs AST_Types.md +$readme_parsing = Join-Path $path_docs Parsing.md +$readme_parser_algo = Join-Path $path_docs Parser_Algo.md -Copy-Item $license -Destination (Join-Path $path_release_content "LICENSE") -Copy-Item $readme_root -Destination (Join-Path $path_release_content "Readme.md") -Copy-Item $readme_docs -Destination (Join-Path $path_release_content "Readme_Docs.md") -Copy-Item $readme_parsing -Destination (Join-Path $path_release_content "Parsing.md") +Copy-Item $license -Destination (Join-Path $path_release_content "LICENSE") +Copy-Item $readme_root -Destination (Join-Path $path_release_content "Readme.md") +Copy-Item $readme_docs -Destination (Join-Path $path_release_content "Readme_Docs.md") +Copy-Item $readme_ast_design -Destination (Join-Path $path_release_content "AST_Design.md") +Copy-Item $readme_ast_types -Destination (Join-Path $path_release_content "AST_Types.md") +Copy-Item $readme_parsing -Destination (Join-Path $path_release_content "Parsing.md") +Copy-Item $readme_parser_algo -Destination (Join-Path $path_release_content "Parser_Algo.md") # Singleheader Copy-Item -Path $path_singleheader_gen\gen.hpp -Destination $path_release_content\gen.hpp