/* TEST_OUTPUT: --- fail_compilation/ice14929.d(45): Error: cast(Node)(*this.current).items[this.index] is not an lvalue fail_compilation/ice14929.d(88): Error: template instance ice14929.HashMap!(ulong, int).HashMap.opBinaryRight!"in" error instantiating fail_compilation/ice14929.d(92): instantiated from here: HashmapComponentStorage!int fail_compilation/ice14929.d(92): Error: template instance ice14929.isComponentStorage!(HashmapComponentStorage!int, int) error instantiating fail_compilation/ice14929.d(92): while evaluating: `static assert(isComponentStorage!(HashmapComponentStorage!int, int))` --- */ struct HashMap(K, V) { V* opBinaryRight(string op)(K key) const if (op == "in") { size_t index; foreach (ref node; buckets[index].range) { return &(node.value); } return null; } struct Node { K key; V value; } alias Bucket = UnrolledList!(Node); Bucket[] buckets; } struct UnrolledList(T) { Range range() const pure { return Range(_front); } static struct Range { ref T front() const @property { return cast(T) current.items[index]; } void popFront() pure { } bool empty() const pure @property { return true; } const(Node)* current; size_t index; } Node* _front; static struct Node { ContainerStorageType!T[10] items; } } template ContainerStorageType(T) { alias ContainerStorageType = T; } template isComponentStorage(CS, C) { enum bool isComponentStorage = is(typeof( (inout int = 0) { CS cs = CS.init; ulong eid; cs.add(eid, c); })); } struct HashmapComponentStorage(ComponentType) { private HashMap!(ulong, ComponentType) components; void add(ulong eid, ComponentType component) { assert(eid !in components); } } static assert(isComponentStorage!(HashmapComponentStorage!int, int)); void main() { }