00001
00002
00003
00004
00005
00006 #include "SgSystem.h"
00007 #include "GoKomi.h"
00008
00009 #include <sstream>
00010
00011 using namespace std;
00012
00013
00014
00015 namespace {
00016
00017 string GetInvalidKomiErrorMessage(float komi)
00018 {
00019 ostringstream buffer;
00020 buffer << "Invalid komi value: " << komi;
00021 return buffer.str();
00022 }
00023
00024 }
00025
00026
00027
00028 GoKomi::InvalidKomi::InvalidKomi(float komi)
00029 : SgException(GetInvalidKomiErrorMessage(komi))
00030 {
00031 }
00032
00033 GoKomi::InvalidKomi::InvalidKomi(const string& komi)
00034 : SgException("Invalid komi value: " + komi)
00035 {
00036 }
00037
00038
00039
00040 GoKomi::GoKomi(const std::string& komi)
00041 {
00042 {
00043 istringstream buffer(komi);
00044 string trimmedString;
00045 buffer >> trimmedString;
00046 if (! buffer)
00047 {
00048 m_isUnknown = true;
00049 m_value = 0;
00050 return;
00051 }
00052 }
00053 {
00054 istringstream buffer(komi);
00055 float value;
00056 buffer >> value;
00057 if (! buffer)
00058 throw InvalidKomi(komi);
00059 *this = GoKomi(value);
00060 }
00061 }
00062
00063 string GoKomi::ToString() const
00064 {
00065 if (m_isUnknown)
00066 return "";
00067 if (m_value % 2 == 0)
00068 {
00069 ostringstream buffer;
00070 buffer << (m_value / 2);
00071 return buffer.str();
00072 }
00073 else if (m_value == -1)
00074 return "-0.5";
00075 else
00076 {
00077 ostringstream buffer;
00078 buffer << (m_value / 2) << ".5";
00079 return buffer.str();
00080 }
00081 }
00082
00083