[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/nolankramer/daScript/master/src/simulate/hash.cpp [Back]  [Original]

#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();
    }
}


Web Proxy Viewer  |  New URL  |  Original Page