00001
00002
00003
00004
00005
00006
00007 #ifndef SG_UTIL_H
00008 #define SG_UTIL_H
00009
00010 #include <iostream>
00011 #include "SgBlackWhite.h"
00012 #include "SgBWArray.h"
00013
00014
00015 namespace SgUtil {
00016
00017 template<class T>
00018 inline void ForceInRange(const T& min, T* p, const T& max)
00019 {
00020 if (*p < min)
00021 *p = min;
00022 if (*p > max)
00023 *p = max;
00024 }
00025
00026 template <class T>
00027 inline bool InRange(const T& i, const T& from, const T& to)
00028 {
00029 return (i >= from) && (i <= to);
00030 }
00031
00032 template<class T>
00033 inline void LowerLimit(T& x, const T& limit)
00034 {
00035 if (x < limit)
00036 x = limit;
00037 }
00038
00039 template<class T>
00040 inline void UpperLimit(T& x, const T& limit)
00041 {
00042 if (x > limit)
00043 x = limit;
00044 }
00045
00046 }
00047
00048
00049
00050
00051
00052 class SgBalancer
00053 {
00054 public:
00055 SgBalancer(int margin) :
00056 m_balance(0),
00057 m_nuCalls(0),
00058 m_margin(margin),
00059 m_played(0,0),
00060 m_rejected(0,0)
00061 { }
00062
00063 bool Play(SgBlackWhite color)
00064 {
00065 SG_ASSERT(SgIsBlackWhite(color));
00066 ++m_nuCalls;
00067 if (color == SG_BLACK)
00068 {
00069 if (m_balance < m_margin)
00070 {
00071 ++m_balance;
00072 ++m_played[SG_BLACK];
00073 return true;
00074 }
00075 }
00076 else if (m_balance > -m_margin)
00077 {
00078 --m_balance;
00079 ++m_played[SG_WHITE];
00080 return true;
00081 }
00082 ++m_rejected[color];
00083 return false;
00084 }
00085
00086 int Balance() const
00087 {
00088 return m_balance;
00089 }
00090
00091 int Margin() const
00092 {
00093 return m_margin;
00094 }
00095
00096 int NuCalls() const
00097 {
00098 return m_nuCalls;
00099 }
00100
00101 int NuPlayed(SgBlackWhite color) const
00102 {
00103 return m_played[color];
00104 }
00105
00106 int NuRejected(SgBlackWhite color) const
00107 {
00108 return m_rejected[color];
00109 }
00110
00111 private:
00112 int m_balance;
00113 int m_nuCalls;
00114 const int m_margin;
00115 SgBWArray<int> m_played;
00116 SgBWArray<int> m_rejected;
00117 };
00118
00119
00120
00121 std::ostream& operator<<(std::ostream& stream, const SgBalancer& balancer);
00122
00123
00124
00125 #endif // SG_UTIL_H
00126