| Index: third_party/re2/util/random.cc
|
| diff --git a/third_party/re2/util/random.cc b/third_party/re2/util/random.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..49d6195876a31aaf5e3a0c7b0f2d16bbba7c64a1
|
| --- /dev/null
|
| +++ b/third_party/re2/util/random.cc
|
| @@ -0,0 +1,34 @@
|
| +// Copyright 2005-2009 The RE2 Authors. All Rights Reserved.
|
| +// Use of this source code is governed by a BSD-style
|
| +// license that can be found in the LICENSE file.
|
| +
|
| +// Modified from Google perftools's tcmalloc_unittest.cc.
|
| +
|
| +#include "util/random.h"
|
| +
|
| +namespace re2 {
|
| +
|
| +int32 ACMRandom::Next() {
|
| + const int32 M = 2147483647L; // 2^31-1
|
| + const int32 A = 16807;
|
| + // In effect, we are computing seed_ = (seed_ * A) % M, where M = 2^31-1
|
| + uint32 lo = A * (int32)(seed_ & 0xFFFF);
|
| + uint32 hi = A * (int32)((uint32)seed_ >> 16);
|
| + lo += (hi & 0x7FFF) << 16;
|
| + if (lo > M) {
|
| + lo &= M;
|
| + ++lo;
|
| + }
|
| + lo += hi >> 15;
|
| + if (lo > M) {
|
| + lo &= M;
|
| + ++lo;
|
| + }
|
| + return (seed_ = (int32) lo);
|
| +}
|
| +
|
| +int32 ACMRandom::Uniform(int32 n) {
|
| + return Next() % n;
|
| +}
|
| +
|
| +} // namespace re2
|
|
|