1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
2 // This file is part of the "Irrlicht Engine".
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
4 
5 #ifndef __IRR_OS_H_INCLUDED__
6 #define __IRR_OS_H_INCLUDED__
7 
8 #include "IrrCompileConfig.h" // for endian check
9 #include "irrTypes.h"
10 #include "irrString.h"
11 #include "path.h"
12 #include "ILogger.h"
13 #include "ITimer.h"
14 
15 namespace irr
16 {
17 
18 namespace os
19 {
20 	class Byteswap
21 	{
22 	public:
23 		static u16 byteswap(u16 num);
24 		static s16 byteswap(s16 num);
25 		static u32 byteswap(u32 num);
26 		static s32 byteswap(s32 num);
27 		static f32 byteswap(f32 num);
28 		// prevent accidental swapping of chars
29 		static u8  byteswap(u8  num);
30 		static c8  byteswap(c8  num);
31 	};
32 
33 	class Printer
34 	{
35 	public:
36 		// prints out a string to the console out stdout or debug log or whatever
37 		static void print(const c8* message);
38 		static void log(const c8* message, ELOG_LEVEL ll = ELL_INFORMATION);
39 		static void log(const wchar_t* message, ELOG_LEVEL ll = ELL_INFORMATION);
40 		static void log(const c8* message, const c8* hint, ELOG_LEVEL ll = ELL_INFORMATION);
41 		static void log(const c8* message, const io::path& hint, ELOG_LEVEL ll = ELL_INFORMATION);
42 		static ILogger* Logger;
43 	};
44 
45 
46 	// mixed linear congruential generator (MLCG)
47 	// numbers chosen according to L'Ecuyer, Commun. ACM 31 (1988) 742
48 	// period is somewhere around m-1
49 	class Randomizer
50 	{
51 	public:
52 
53 		//! resets the randomizer
54 		static void reset(s32 value=0x0f0f0f0f);
55 
56 		//! generates a pseudo random number in the range 0..randMax()
57 		static s32 rand();
58 
59 		//! generates a pseudo random number in the range 0..1
60 		static f32 frand();
61 
62 		//! get maxmimum number generated by rand()
63 		static s32 randMax();
64 
65 	private:
66 
67 		static s32 seed;
68 		static const s32 m = 2147483399;	// a non-Mersenne prime
69 		static const s32 a = 40692;			// another spectral success story
70 		static const s32 q = m/a;
71 		static const s32 r = m%a;			// again less than q
72 		static const s32 rMax = m-1;
73 	};
74 
75 
76 
77 
78 	class Timer
79 	{
80 	public:
81 
82 		//! returns the current time in milliseconds
83 		static u32 getTime();
84 
85 		//! get current time and date in calendar form
86 		static ITimer::RealTimeDate getRealTimeAndDate();
87 
88 		//! initializes the real timer
89 		static void initTimer(bool usePerformanceTimer=true);
90 
91 		//! sets the current virtual (game) time
92 		static void setTime(u32 time);
93 
94 		//! stops the virtual (game) timer
95 		static void stopTimer();
96 
97 		//! starts the game timer
98 		static void startTimer();
99 
100 		//! sets the speed of the virtual timer
101 		static void setSpeed(f32 speed);
102 
103 		//! gets the speed of the virtual timer
104 		static f32 getSpeed();
105 
106 		//! returns if the timer currently is stopped
107 		static bool isStopped();
108 
109 		//! makes the virtual timer update the time value based on the real time
110 		static void tick();
111 
112 		//! returns the current real time in milliseconds
113 		static u32 getRealTime();
114 
115 	private:
116 
117 		static void initVirtualTimer();
118 
119 		static f32 VirtualTimerSpeed;
120 		static s32 VirtualTimerStopCounter;
121 		static u32 StartRealTime;
122 		static u32 LastVirtualTime;
123 		static u32 StaticTime;
124 	};
125 
126 } // end namespace os
127 } // end namespace irr
128 
129 
130 #endif
131 
132