#include "daScript/misc/platform.h" #include "daScript/ast/ast.h" #include "daScript/simulate/hash.h" #include "daScript/simulate/runtime_string.h" #include "daScript/simulate/data_walker.h" namespace das { struct HashDataWalker : DataWalker, HashBuilder { public: // walker HashDataWalker ( Context & ctx ) { context = &ctx; } // data types virtual void Null ( TypeInfo * ti ) override { update(ti->hash); } virtual void Bool ( bool & t ) override { update(t); } virtual void Int8 ( int8_t & t ) override { update(t); } virtual void UInt8 ( uint8_t & t ) override { update(t); } virtual void Int16 ( int16_t & t ) override { update(t); } virtual void UInt16 ( uint16_t & t ) override { update(t); } virtual void Int64 ( int64_t & t ) override { update(t); } virtual void UInt64 ( uint64_t & t ) override { update(t); } virtual void String ( char * & t ) override { updateString(t); } virtual void Double ( double & t ) override { update(t); } virtual void Float ( float & t ) override { update(t); } virtual void Int ( int32_t & t ) override { update(t); } virtual void UInt ( uint32_t & t ) override { update(t); } virtual void Bitfield ( uint32_t & t, TypeInfo * ti ) override { update(t); update(ti->hash); } virtual void Bitfield8 ( uint8_t & t, TypeInfo * ti ) override { update(t); update(ti->hash); } virtual void Bitfield16 ( uint16_t & t, TypeInfo * ti ) override { update(t); update(ti->hash); } virtual void Bitfield64 ( uint64_t & t, TypeInfo * ti ) override { update(t); update(ti->hash); } virtual void Int2 ( int2 & t ) override { update(t); } virtual void Int3 ( int3 & t ) override { update(t); } virtual void Int4 ( int4 & t ) override { update(t); } virtual void UInt2 ( uint2 & t ) override { update(t); } virtual void UInt3 ( uint3 & t ) override { update(t); } virtual void UInt4 ( uint4 & t ) override { update(t); } virtual void Float2 ( float2 & t ) override { update(t); } virtual void Float3 ( float3 & t ) override { update(t); } virtual void Float4 ( float4 & t ) override { update(t); } virtual void Range ( range & t ) override { update(t); } virtual void URange ( urange & t ) override { update(t); } virtual void Range64 ( range64 & t ) override { update(t); } virtual void URange64 ( urange64 & t ) override { update(t); } virtual void VoidPtr ( void * & p ) override { update(uint64_t(intptr_t(p))); } // WalkBlock virtual void WalkFunction ( Func * fn ) override { if ( fn && fn->PTR ) update(fn->PTR->mangledNameHash); } virtual void WalkEnumeration ( int32_t & t, EnumInfo * en ) override { update(t); update(en->hash); } virtual void WalkEnumeration8 ( int8_t & t, EnumInfo * en ) override { update(t); update(en->hash); } virtual void WalkEnumeration16 ( int16_t & t, EnumInfo * en ) override { update(t); update(en->hash); } virtual void WalkEnumeration64 ( int64_t & t, EnumInfo * en ) override { update(t); update(en->hash); } // unsupported virtual void beforeIterator ( Sequence *, TypeInfo * ) override { error("HASH, not expecting iterator"); } virtual void WalkBlock ( Block * ) override { error("HASH, not expecting block"); } virtual void FakeContext ( Context * ) override { error("HASH, not expecting context"); } }; uint64_t hash_value ( Context & ctx, void * pX, TypeInfo * info ) { HashDataWalker walker(ctx); walker.walk((char*)pX,info); return walker.getHash(); } uint64_t hash_value ( Context & ctx, vec4f value, TypeInfo * info ) { HashDataWalker walker(ctx); walker.walk(value,info); return walker.getHash(); } }