digitalmars.D.learn - Polymorphic hashOf
- Per =?UTF-8?B?Tm9yZGzDtnc=?= (83/83) Dec 22 2018 If I want to include the class type (TypeInfo) inside a class
If I want to include the class type (TypeInfo) inside a class instance hash, is the following snippet a good ` safe pure nothrow nogc`-solution?: import core.internal.hash : hashOf; /** Hash that distinguishes `Expr(X)` from `NounExpr(X)`. */ hash_t hashOfPolymorphic(Class)(Class aClassInstance) trusted pure nothrow nogc if (is(Class == class)) { assert(Class.alignof == 8); return (cast(hash_t)(cast(void*)typeid(Class)) >> 3) ^ hashOf(aClassInstance); } class Thing { } class Expr : Thing { safe pure nothrow nogc: alias Data = string; this(Data data) { this.data = data; } property override hash_t toHash() const safe pure nothrow nogc { return hashOf(data); } Data data; } class NounExpr : Expr { safe pure nothrow nogc: this(Data data) { super(data); } property override hash_t toHash() const safe pure nothrow nogc { return hashOf(data); } } class Year : Thing { safe pure nothrow nogc: alias Data = long; property override hash_t toHash() const safe pure nothrow nogc { return hashOf(data); } Data data; } safe pure nothrow unittest { auto car1 = new Expr("car"); auto car2 = new Expr("car"); auto bar1 = new Expr("bar"); auto ncar = new NounExpr("car"); void testEqual() safe pure nothrow nogc { assert(hashOf(car1) == hashOf(car2)); assert(hashOfPolymorphic(car1) == hashOfPolymorphic(car2)); } void testDifferent1() safe pure nothrow nogc { assert(hashOf(car1) != hashOf(bar1)); assert(hashOfPolymorphic(car1) != hashOfPolymorphic(bar1)); } void testDifferent2() safe pure nothrow nogc { assert(hashOf(car1) == hashOf(ncar)); assert(hashOfPolymorphic(car1) != hashOfPolymorphic(ncar)); } testEqual(); testDifferent1(); testDifferent2(); }
Dec 22 2018