mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-11-03 15:26:12 -08:00 
			
		
		
		
	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)
This commit is contained in:
		@@ -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<Type> result = { { nullptr }, { nullptr } };
 | 
			
		||||
 | 
			
		||||
		result.Hashes  = Array<sw>::init( allocator );
 | 
			
		||||
		result.Entries = Array<Entry>::init( allocator );
 | 
			
		||||
 | 
			
		||||
		HashTable<Type> result = init_reserve(allocator, 8);
 | 
			
		||||
		return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -330,19 +328,17 @@ struct HashTable
 | 
			
		||||
 | 
			
		||||
		result.Hashes  = Array<sw>::init_reserve( allocator, num );
 | 
			
		||||
		result.Hashes.get_header()->Num = num;
 | 
			
		||||
		result.Hashes.resize( num );
 | 
			
		||||
		result.Hashes.fill( 0, num, -1);
 | 
			
		||||
 | 
			
		||||
		result.Entries = Array<Entry>::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<Type> new_ht = init_reserve( Hashes.get_header()->Allocator, new_num );
 | 
			
		||||
 | 
			
		||||
		Array<sw>::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;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user