]> www.ginac.de Git - cln.git/blobdiff - src/base/random/cl_random_from.cc
Use paths relative the `src' directory in the #include directives.
[cln.git] / src / base / random / cl_random_from.cc
index 6c3b123519b15aa1d478f67e0feb460c3cec9475..22d48b68dc182698240bf06e8fda09a59e320245 100644 (file)
@@ -1,7 +1,12 @@
 // random_state constructor.
 
+
+#if defined(_WIN32)
+#include <windows.h> // For GetCurrentProcessId(), must be included first, sorry.
+#endif
+
 // General includes.
-#include "cl_sysdep.h"
+#include "base/cl_sysdep.h"
 
 // Specification.
 #include "cln/random.h"
 
 // Implementation.
 
-#include "cl_base_config.h"
-#include "cl_low.h"
+#include "base/cl_base_config.h"
+#include "base/cl_low.h"
+#include <cstdlib>  // declares rand()
 
-#if defined(unix) || defined(__unix) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(_WIN32) && defined(__GNUC__)) || defined(__BEOS__)
+#if defined(unix) || defined(__unix) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(__CYGWIN__) && defined(__GNUC__)) || defined(__BEOS__)
 
 #include <sys/types.h>
 #include <unistd.h> // declares getpid()
-#include <cstdlib>  // declares rand()
 
 #if defined(HAVE_GETTIMEOFDAY)
 
   extern "C" int gettimeofday (struct timeval * tp, GETTIMEOFDAY_TZP_T tzp);
 #endif
 
+namespace cln {
 inline uint32 get_seed (void)
 {
        var struct timeval tv;
        gettimeofday(&tv,0);
-       return cln::highlow32(tv.tv_sec,tv.tv_usec); // 16+16 zufällige Bits
+       return highlow32(tv.tv_sec,tv.tv_usec); // 16+16 zufällige Bits
 }
+}  // namespace cln
 
 #elif defined(HAVE_TIMES_CLOCK)
 
@@ -43,15 +50,30 @@ inline uint32 get_seed (void)
 #include <sys/times.h>
 extern "C" clock_t times (struct tms * buffer);
 
+namespace cln {
 inline uint32 get_seed (void)
 {
        var struct tms tmsbuf;
        var uint32 seed_lo = times(&tmsbuf);
        return seed_lo + tmsbuf.tms_utime + tmsbuf.tms_stime;
 }
+}  // namespace cln
 
 #endif
 
+#elif defined(_WIN32)
+#include <sys/time.h>
+#include <sys/timeb.h>
+
+namespace cln {
+inline uint32 get_seed (void)
+{
+       struct timeb timebuf;
+       ftime(&timebuf);
+       return highlow32(timebuf.time, (long)(timebuf.millitm)*1000);
+}
+}  // namespace cln
+
 #endif
 
 namespace cln {
@@ -64,21 +86,24 @@ random_state::random_state ()
 {
        var uint32 seed_hi;
        var uint32 seed_lo;
-#if defined(unix) || defined(__unix) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(_WIN32) && defined(__GNUC__)) || defined(__BEOS__)
-       seed_lo = ::get_seed();
-       seed_hi = (rand() // zufällige 31 Bit (bei UNIX_BSD) bzw. 16 Bit (bei UNIX_SYSV)
+#if defined(unix) || defined(__unix) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(_AIX) || defined(sinix) || (defined(__MACH__) && defined(__APPLE__)) || (defined(__CYGWIN__) && defined(__GNUC__)) || defined(__BEOS__)
+       seed_lo = get_seed();
+       seed_hi = (rand() // zufällige 31 Bit (bei UNIX_BSD) bzw. 16 Bit (bei UNIX_SYSV)
                           << 8) ^ (uintL)(getpid()); // ca. 8 Bit von der Process ID
 #elif defined(__OpenBSD__)
        seed_lo = arc4random();
        seed_hi = arc4random();
+#elif defined(_WIN32)
+       seed_lo = get_seed();
+       seed_hi = (rand() << 8) ^ (uintL)(GetCurrentProcessId());
 #elif defined(__atarist)
-       seed_lo = highlow32(GEMDOS_GetDate(),GEMDOS_GetTime()); // 16+16 zufällige Bits
-       seed_hi = XBIOS_Random(); // 24 Bit zufällig vom XBIOS, vorne 8 Nullbits
+       seed_lo = highlow32(GEMDOS_GetDate(),GEMDOS_GetTime()); // 16+16 zufällige Bits
+       seed_hi = XBIOS_Random(); // 24 Bit zufällig vom XBIOS, vorne 8 Nullbits
 #elif defined(amiga) || defined(AMIGA)
        seed_lo = get_real_time(); // Uhrzeit
        seed_hi = FindTask(NULL); // Pointer auf eigene Task
 #elif defined(__MSDOS__) || defined(__EMX__) || defined(__riscos)
-       // Keine Zufallszahlen, keine PID, nichts Zufälliges da.
+       // Keine Zufallszahlen, keine PID, nichts Zufälliges da.
        seed_lo = get_real_time(); // Uhrzeit, 100 Hz
        seed_hi = time(NULL);
 #else