3 // Quick, dirty and inefficient AA using linear search, useful for testing.
4 struct LinearAA(K
, V
) {
15 assert(0, "Key not present.");
18 V
opIndexAssign(V val
, K key
) {
21 return values
[i
] = val
;
30 V
* opBinaryRight(string op
: "in")(K key
) {
33 return values
.ptr
+ i
;
42 for(; i
< keys
.length
; i
++) {
48 assert(i
< keys
.length
);
50 for(; i
< keys
.length
- 1; i
++) {
51 keys
[i
] = keys
[i
+ 1];
52 values
[i
] = values
[i
+ 1];
55 keys
= keys
[0..$ - 1];
56 values
= values
[0..$ - 1];
64 extern (C
) int rand();
66 uint random(const uint max
= uint.max
)
70 // RAND_MAX is quite low for windows, extend the range by
71 // abusing multiple random values and rounding errors.
72 const a
= rand(), b
= rand();
73 const c
= a
< b ?
double(a
) / b
: double(b
) / a
;
74 return (cast(int) (c
* max
)) % max
;
82 foreach(iter
; 0..10) { // Bug only happens after a few iterations.
85 LinearAA
!(size_t
, uint) linAA
;
86 uint[] nums
= new uint[100_000];
87 foreach(ref num
; nums
) {
91 foreach(i
; 0..10_000
) {
92 auto index
= random(cast(uint) nums
.length
);
93 if(index
in builtin
) {
94 assert(index
in linAA
);
95 assert(builtin
[index
] == nums
[index
]);
96 assert(linAA
[index
] == nums
[index
]);
97 builtin
.remove(index
);
100 assert(!(index
in linAA
));
101 builtin
[index
] = nums
[index
];
102 linAA
[index
] = nums
[index
];
106 assert(builtin
.length
== linAA
.length
);
107 foreach(k
, v
; builtin
) {
109 assert(*(k
in builtin
) == *(k
in linAA
));
110 assert(linAA
[k
] == v
);