unsigned RvalHash(Rval rval, unsigned seed, unsigned max) { switch (rval.type) { case RVAL_TYPE_SCALAR: return StringHash(RvalScalarValue(rval), seed, max); case RVAL_TYPE_FNCALL: return FnCallHash(RvalFnCallValue(rval), seed, max); case RVAL_TYPE_LIST: return RlistHash(RvalRlistValue(rval), seed, max); case RVAL_TYPE_NOPROMISEE: return (seed + 1) % max; default: ProgrammingError("Unhandled case in switch: %d", rval.type); } }
unsigned RvalHash(Rval rval, unsigned seed) { switch (rval.type) { case RVAL_TYPE_SCALAR: return StringHash(RvalScalarValue(rval), seed); case RVAL_TYPE_FNCALL: return FnCallHash(RvalFnCallValue(rval), seed); case RVAL_TYPE_LIST: return RlistHash(RvalRlistValue(rval), seed); case RVAL_TYPE_NOPROMISEE: /* TODO modulus operation is biasing results. */ return (seed + 1); default: ProgrammingError("Unhandled case in switch: %d", rval.type); } }
unsigned FnCallHash(const FnCall *fp, unsigned seed) { unsigned hash = StringHash(fp->name, seed); return RlistHash(fp->args, hash); }
unsigned int RlistHash_untyped(const void *list, unsigned seed) { return RlistHash(list, seed); }