Index   Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

SgUtil.h

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


Sun Mar 13 2011 Doxygen 1.7.1