1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
2 // Licensed under the MIT License:
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to deal
6 // in the Software without restriction, including without limitation the rights
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 // copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 // THE SOFTWARE.
21 
22 module capnproto.benchmark.Common;
23 
24 //Use a 128-bit Xorshift algorithm.
25 pragma(inline, true) uint nextFastRand()
26 {
27 	//These values are arbitrary. Any seed other than all zeroes is OK.
28 	static uint x = 0x1d2acd47;
29 	static uint y = 0x58ca3e14;
30 	static uint z = 0xf563f232;
31 	static uint w = 0x0bc76199;
32 	
33 	uint tmp = x ^ (x << 11);
34 	x = y;
35 	y = z;
36 	z = w;
37 	w = w ^ (w >> 19) ^ tmp ^ (tmp >> 8);
38 	return w;
39 }
40 
41 pragma(inline, true) uint fastRand(uint range)
42 {
43 	return nextFastRand() % range;
44 }
45 
46 pragma(inline, true) double fastRandDouble(double range)
47 {
48 	return nextFastRand() * range / uint.max;
49 }
50 
51 pragma(inline, true) int div(int a, int b)
52 {
53 	if(b == 0)
54 		return int.max;
55 	// INT_MIN / -1 => SIGFPE.  Who knew?
56 	if(a == int.min && b == -1)
57 		return int.max;
58 	return a / b;
59 }
60 
61 pragma(inline, true) int mod(int a, int b)
62 {
63 	if(b == 0)
64 		return int.max;
65 	//INT_MIN % -1 => SIGFPE. Who knew?
66 	if(a == int.min && b == -1)
67 		return int.max;
68 	return a % b;
69 }
70 
71 string[] WORDS = [ "foo ", "bar ", "baz ", "qux ", "quux ", "corge ", "grault ", "garply ", "waldo ", "fred ", "plugh ", "xyzzy ", "thud " ];