| Index: test/cctest/cctest.h
|
| diff --git a/test/cctest/cctest.h b/test/cctest/cctest.h
|
| index 193126a0818e91a1aac21a900c0b0db476c7467d..1282d7da0f8c9d90a7faa4375188035d3595fe35 100644
|
| --- a/test/cctest/cctest.h
|
| +++ b/test/cctest/cctest.h
|
| @@ -300,4 +300,57 @@ static inline void SimulateFullSpace(v8::internal::PagedSpace* space) {
|
| }
|
|
|
|
|
| +// Adapted from http://en.wikipedia.org/wiki/Multiply-with-carry
|
| +class RandomNumberGenerator {
|
| + public:
|
| + RandomNumberGenerator() {
|
| + init();
|
| + }
|
| +
|
| + void init(uint32_t seed = 0x5688c73e) {
|
| + static const uint32_t phi = 0x9e3779b9;
|
| + c = 362436;
|
| + i = kQSize-1;
|
| + Q[0] = seed;
|
| + Q[1] = seed + phi;
|
| + Q[2] = seed + phi + phi;
|
| + for (unsigned j = 3; j < kQSize; j++) {
|
| + Q[j] = Q[j - 3] ^ Q[j - 2] ^ phi ^ j;
|
| + }
|
| + }
|
| +
|
| + uint32_t next() {
|
| + uint64_t a = 18782;
|
| + uint32_t r = 0xfffffffe;
|
| + i = (i + 1) & (kQSize-1);
|
| + uint64_t t = a * Q[i] + c;
|
| + c = (t >> 32);
|
| + uint32_t x = static_cast<uint32_t>(t + c);
|
| + if (x < c) {
|
| + x++;
|
| + c++;
|
| + }
|
| + return (Q[i] = r - x);
|
| + }
|
| +
|
| + uint32_t next(int max) {
|
| + return next() % max;
|
| + }
|
| +
|
| + bool next(double threshold) {
|
| + ASSERT(threshold >= 0.0 && threshold <= 1.0);
|
| + if (threshold == 1.0) return true;
|
| + if (threshold == 0.0) return false;
|
| + uint32_t value = next() % 100000;
|
| + return threshold > static_cast<double>(value)/100000.0;
|
| + }
|
| +
|
| + private:
|
| + static const uint32_t kQSize = 4096;
|
| + uint32_t Q[kQSize];
|
| + uint32_t c;
|
| + uint32_t i;
|
| +};
|
| +
|
| +
|
| #endif // ifndef CCTEST_H_
|
|
|