Replace ad-hoc or locally defined power-of-2 tests
[gem5.git] / base / random.hh
index fe93a98a6f01d0423e9da71c892aff35c632d3ed..def7a4bcefaaa26343a04004a9f906718b29aeeb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003 The Regents of The University of Michigan
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -33,6 +33,8 @@
 
 long getLong();
 double getDouble();
+uint64_t getUniformPos(uint64_t min, uint64_t max);
+int64_t getUniform(int64_t min, int64_t max);
 
 template <typename T>
 struct Random;
@@ -41,48 +43,72 @@ template<> struct Random<int8_t>
 {
     static int8_t get()
     { return getLong() & (int8_t)-1; }
+
+    static int8_t uniform(int8_t min, int8_t max)
+    { return getUniform(min, max); }
 };
 
 template<> struct Random<uint8_t>
 {
     static uint8_t get()
     { return getLong() & (uint8_t)-1; }
+
+    static uint8_t uniform(uint8_t min, uint8_t max)
+    { return getUniformPos(min, max); }
 };
 
 template<> struct Random<int16_t>
 {
     static int16_t get()
     { return getLong() & (int16_t)-1; }
+
+    static int16_t uniform(int16_t min, int16_t max)
+    { return getUniform(min, max); }
 };
 
 template<> struct Random<uint16_t>
 {
     static uint16_t get()
     { return getLong() & (uint16_t)-1; }
+
+    static uint16_t uniform(uint16_t min, uint16_t max)
+    { return getUniformPos(min, max); }
 };
 
 template<> struct Random<int32_t>
 {
     static int32_t get()
     { return (int32_t)getLong(); }
+
+    static int32_t uniform(int32_t min, int32_t max)
+    { return getUniform(min, max); }
 };
 
 template<> struct Random<uint32_t>
 {
     static uint32_t get()
     { return (uint32_t)getLong(); }
+
+    static uint32_t uniform(uint32_t min, uint32_t max)
+    { return getUniformPos(min, max); }
 };
 
 template<> struct Random<int64_t>
 {
     static int64_t get()
     { return (int64_t)getLong() << 32 || (uint64_t)getLong(); }
+
+    static int64_t uniform(int64_t min, int64_t max)
+    { return getUniform(min, max); }
 };
 
 template<> struct Random<uint64_t>
 {
     static uint64_t get()
     { return (uint64_t)getLong() << 32 || (uint64_t)getLong(); }
+
+    static uint64_t uniform(uint64_t min, uint64_t max)
+    { return getUniformPos(min, max); }
 };
 
 template<> struct Random<float>