mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-11-03 23:36:12 -08:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifdef INTELLISENSE_DIRECTIVES
 | 
						|
#pragma once
 | 
						|
#include "components/types.hpp"
 | 
						|
#endif
 | 
						|
 | 
						|
// This file was generated automatially by gencpp's bootstrap.cpp (See: https://github.com/Ed94/gencpp)
 | 
						|
 | 
						|
enum Specifier : u32
 | 
						|
{
 | 
						|
	Spec_Invalid,
 | 
						|
	Spec_Consteval,
 | 
						|
	Spec_Constexpr,
 | 
						|
	Spec_Constinit,
 | 
						|
	Spec_Explicit,
 | 
						|
	Spec_External_Linkage,
 | 
						|
	Spec_ForceInline,
 | 
						|
	Spec_Global,
 | 
						|
	Spec_Inline,
 | 
						|
	Spec_Internal_Linkage,
 | 
						|
	Spec_Local_Persist,
 | 
						|
	Spec_Mutable,
 | 
						|
	Spec_NeverInline,
 | 
						|
	Spec_Ptr,
 | 
						|
	Spec_Ref,
 | 
						|
	Spec_Register,
 | 
						|
	Spec_Restrict,
 | 
						|
	Spec_RValue,
 | 
						|
	Spec_Static,
 | 
						|
	Spec_Thread_Local,
 | 
						|
	Spec_Virtual,
 | 
						|
	Spec_Const,
 | 
						|
	Spec_Final,
 | 
						|
	Spec_NoExceptions,
 | 
						|
	Spec_Override,
 | 
						|
	Spec_Pure,
 | 
						|
	Spec_Delete,
 | 
						|
	Spec_Volatile,
 | 
						|
	Spec_NumSpecifiers,
 | 
						|
	Spec_UnderlyingType = 0xffffffffu
 | 
						|
};
 | 
						|
 | 
						|
inline Str spec_to_str(Specifier type)
 | 
						|
{
 | 
						|
	local_persist Str lookup[] = {
 | 
						|
		{ "INVALID",       sizeof("INVALID") - 1       },
 | 
						|
		{ "consteval",     sizeof("consteval") - 1     },
 | 
						|
		{ "constexpr",     sizeof("constexpr") - 1     },
 | 
						|
		{ "constinit",     sizeof("constinit") - 1     },
 | 
						|
		{ "explicit",      sizeof("explicit") - 1      },
 | 
						|
		{ "extern",        sizeof("extern") - 1        },
 | 
						|
		{ "forceinline",   sizeof("forceinline") - 1   },
 | 
						|
		{ "global",        sizeof("global") - 1        },
 | 
						|
		{ "inline",        sizeof("inline") - 1        },
 | 
						|
		{ "internal",      sizeof("internal") - 1      },
 | 
						|
		{ "local_persist", sizeof("local_persist") - 1 },
 | 
						|
		{ "mutable",       sizeof("mutable") - 1       },
 | 
						|
		{ "neverinline",   sizeof("neverinline") - 1   },
 | 
						|
		{ "*",             sizeof("*") - 1             },
 | 
						|
		{ "&",             sizeof("&") - 1             },
 | 
						|
		{ "register",      sizeof("register") - 1      },
 | 
						|
		{ "restrict",      sizeof("restrict") - 1      },
 | 
						|
		{ "&&",            sizeof("&&") - 1            },
 | 
						|
		{ "static",        sizeof("static") - 1        },
 | 
						|
		{ "thread_local",  sizeof("thread_local") - 1  },
 | 
						|
		{ "virtual",       sizeof("virtual") - 1       },
 | 
						|
		{ "const",         sizeof("const") - 1         },
 | 
						|
		{ "final",         sizeof("final") - 1         },
 | 
						|
		{ "noexcept",      sizeof("noexcept") - 1      },
 | 
						|
		{ "override",      sizeof("override") - 1      },
 | 
						|
		{ "= 0",           sizeof("= 0") - 1           },
 | 
						|
		{ "= delete",      sizeof("= delete") - 1      },
 | 
						|
		{ "volatile",      sizeof("volatile") - 1      },
 | 
						|
	};
 | 
						|
	return lookup[type];
 | 
						|
}
 | 
						|
 | 
						|
inline bool spec_is_trailing(Specifier specifier)
 | 
						|
{
 | 
						|
	switch (specifier)
 | 
						|
	{
 | 
						|
		case Spec_Const:
 | 
						|
		case Spec_Final:
 | 
						|
		case Spec_NoExceptions:
 | 
						|
		case Spec_Override:
 | 
						|
		case Spec_Pure:
 | 
						|
		case Spec_Delete:
 | 
						|
		case Spec_Volatile:
 | 
						|
			return true;
 | 
						|
		default:
 | 
						|
			return false;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
inline Specifier str_to_specifier(Str str)
 | 
						|
{
 | 
						|
	local_persist u32 keymap[Spec_NumSpecifiers];
 | 
						|
	do_once_start for (u32 index = 0; index < Spec_NumSpecifiers; index++)
 | 
						|
	{
 | 
						|
		Str enum_str  = spec_to_str((Specifier)index);
 | 
						|
		keymap[index] = crc32(enum_str.Ptr, enum_str.Len);
 | 
						|
	}
 | 
						|
	do_once_end u32 hash = crc32(str.Ptr, str.Len);
 | 
						|
	for (u32 index = 0; index < Spec_NumSpecifiers; index++)
 | 
						|
	{
 | 
						|
		if (keymap[index] == hash)
 | 
						|
			return (Specifier)index;
 | 
						|
	}
 | 
						|
	return Spec_Invalid;
 | 
						|
}
 | 
						|
 | 
						|
forceinline Str to_str(Specifier spec)
 | 
						|
{
 | 
						|
	return spec_to_str(spec);
 | 
						|
}
 | 
						|
 | 
						|
forceinline Specifier to_type(Str str)
 | 
						|
{
 | 
						|
	return str_to_specifier(str);
 | 
						|
}
 | 
						|
 | 
						|
forceinline bool is_trailing(Specifier specifier)
 | 
						|
{
 | 
						|
	return spec_is_trailing(specifier);
 | 
						|
}
 |