#ifdef GEN_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 Operator : u32
{
	Op_Invalid,
	Op_Assign,
	Op_Assign_Add,
	Op_Assign_Subtract,
	Op_Assign_Multiply,
	Op_Assign_Divide,
	Op_Assign_Modulo,
	Op_Assign_BAnd,
	Op_Assign_BOr,
	Op_Assign_BXOr,
	Op_Assign_LShift,
	Op_Assign_RShift,
	Op_Increment,
	Op_Decrement,
	Op_Unary_Plus,
	Op_Unary_Minus,
	Op_UnaryNot,
	Op_Add,
	Op_Subtract,
	Op_Multiply,
	Op_Divide,
	Op_Modulo,
	Op_BNot,
	Op_BAnd,
	Op_BOr,
	Op_BXOr,
	Op_LShift,
	Op_RShift,
	Op_LAnd,
	Op_LOr,
	Op_LEqual,
	Op_LNot,
	Op_Lesser,
	Op_Greater,
	Op_LesserEqual,
	Op_GreaterEqual,
	Op_Subscript,
	Op_Indirection,
	Op_AddressOf,
	Op_MemberOfPointer,
	Op_PtrToMemOfPtr,
	Op_FunctionCall,
	Op_Comma,
	Op_New,
	Op_NewArray,
	Op_Delete,
	Op_DeleteArray,
	Op_NumOps,
	Op_UnderlyingType = 0xffffffffu
};

inline Str operator_to_str( Operator op )
{
	local_persist Str lookup[] = {
		{ "INVALID",  sizeof( "INVALID" ) - 1  },
		{ "=",        sizeof( "=" ) - 1        },
		{ "+=",       sizeof( "+=" ) - 1       },
		{ "-=",       sizeof( "-=" ) - 1       },
		{ "*=",       sizeof( "*=" ) - 1       },
		{ "/=",       sizeof( "/=" ) - 1       },
		{ "%=",       sizeof( "%=" ) - 1       },
		{ "&=",       sizeof( "&=" ) - 1       },
		{ "|=",       sizeof( "|=" ) - 1       },
		{ "^=",       sizeof( "^=" ) - 1       },
		{ "<<=",      sizeof( "<<=" ) - 1      },
		{ ">>=",      sizeof( ">>=" ) - 1      },
		{ "++",       sizeof( "++" ) - 1       },
		{ "--",       sizeof( "--" ) - 1       },
		{ "+",        sizeof( "+" ) - 1        },
		{ "-",        sizeof( "-" ) - 1        },
		{ "!",        sizeof( "!" ) - 1        },
		{ "+",        sizeof( "+" ) - 1        },
		{ "-",        sizeof( "-" ) - 1        },
		{ "*",        sizeof( "*" ) - 1        },
		{ "/",        sizeof( "/" ) - 1        },
		{ "%",        sizeof( "%" ) - 1        },
		{ "~",        sizeof( "~" ) - 1        },
		{ "&",        sizeof( "&" ) - 1        },
		{ "|",        sizeof( "|" ) - 1        },
		{ "^",        sizeof( "^" ) - 1        },
		{ "<<",       sizeof( "<<" ) - 1       },
		{ ">>",       sizeof( ">>" ) - 1       },
		{ "&&",       sizeof( "&&" ) - 1       },
		{ "||",       sizeof( "||" ) - 1       },
		{ "==",       sizeof( "==" ) - 1       },
		{ "!=",       sizeof( "!=" ) - 1       },
		{ "<",        sizeof( "<" ) - 1        },
		{ ">",        sizeof( ">" ) - 1        },
		{ "<=",       sizeof( "<=" ) - 1       },
		{ ">=",       sizeof( ">=" ) - 1       },
		{ "[]",       sizeof( "[]" ) - 1       },
		{ "*",        sizeof( "*" ) - 1        },
		{ "&",        sizeof( "&" ) - 1        },
		{ "->",       sizeof( "->" ) - 1       },
		{ "->*",      sizeof( "->*" ) - 1      },
		{ "()",       sizeof( "()" ) - 1       },
		{ ",",        sizeof( "," ) - 1        },
		{ "new",      sizeof( "new" ) - 1      },
		{ "new[]",    sizeof( "new[]" ) - 1    },
		{ "delete",   sizeof( "delete" ) - 1   },
		{ "delete[]", sizeof( "delete[]" ) - 1 },
	};
	return lookup[op];
}

forceinline Str to_str( Operator op )
{
	return operator_to_str( op );
}
