説明を見る。00001
00002
00003 #ifndef RECORD_KANJIPRINT_H
00004 #define RECORD_KANJIPRINT_H
00005
00006 #include "osl/simpleState.h"
00007 #include <memory>
00008 #include <iosfwd>
00009 #include <string>
00010
00011 namespace osl
00012 {
00013 class Move;
00014
00015 namespace record
00016 {
00017 class Color;
00018 std::ostream& operator<<(std::ostream& os, const Color& c);
00022 class Color
00023 {
00024 public:
00025 Color() : name(""), valid(false) {}
00026 Color(const std::string& value, const std::string& name, const bool valid=true);
00027 ~Color();
00028 private:
00029 std::string value;
00030 std::string name;
00031 bool valid;
00032 public:
00033 bool isValid() const {return valid;}
00034 const std::string& getName() const {return name;}
00035 bool operator==(const Color& rhs) const
00036 {
00037 return (this->valid == rhs.valid) &&
00038 (this->value == rhs.value);
00039 }
00040 bool operator!=(const Color& rhs) const
00041 {
00042 return !(*this == rhs);
00043
00044 }
00045
00049 static const Color colorFor(const std::string& str);
00050
00052 static const Color NONE;
00053 static const Color Black;
00054 static const Color Red;
00055 static const Color Green;
00056 static const Color Brown;
00057 static const Color Blue;
00058 static const Color Purple;
00059 static const Color Cyan;
00060 static const Color LightGray;
00061 static const Color DarkGray;
00062 static const Color LightRed;
00063 static const Color LightGreen;
00064 static const Color Yellow;
00065 static const Color LightBlue;
00066 static const Color LightPurple;
00067 static const Color LightCyan;
00068 static const Color White;
00069
00070 friend std::ostream& operator<<(std::ostream& os, const Color& c);
00071 };
00072
00073
00077 class ChangeShellColor
00078 {
00079 private:
00080 std::ostream& os;
00081 const Color color;
00082
00083 void escColSet() const;
00084 void escColReSet() const;
00085 public:
00086 ChangeShellColor(std::ostream& os, const Color& color)
00087 : os(os), color(color) {escColSet();}
00088 ~ChangeShellColor() {escColReSet();}
00089 };
00090
00092 std::string kanjiNumber(const int n);
00093
00097 class Characters
00098 {
00099 public:
00100 static const CArray<std::string, 32> stand;
00101
00102 virtual ~Characters();
00103
00105 virtual const std::string& getDan(const size_t index) const = 0;
00107 virtual const std::string& getSuji(const size_t index) const = 0;
00109 virtual const std::string& getPiece(const size_t index) const = 0;
00110
00112 const std::string& getStand(const size_t index) const
00113 {
00114 return stand[index];
00115 }
00116
00117 const std::string& stand_kanji(const PtypeO& ptypeo) const
00118 {
00119 return getStand(piece_index(ptypeo));
00120 }
00121
00122 const std::string& kanji(const PtypeO& ptypeo) const
00123 {
00124 return getPiece(piece_index(ptypeo));
00125 }
00126 const std::string& kanji(Ptype ptype) const
00127 {
00128 return getPiece(newPtypeO(BLACK, ptype));
00129 }
00130 private:
00131 size_t piece_index(const PtypeO& ptypeo) const
00132 {
00133 #ifndef NDEBUG
00134 static const size_t NPieces = PTYPEO_MAX - PTYPEO_MIN+2;
00135 #endif
00136 const size_t index = ptypeo - PTYPEO_MIN;
00137 assert(index < NPieces);
00138 return index;
00139 }
00140 };
00141
00143 struct StandardCharacters : public Characters
00144 {
00146 static const CArray<std::string,10> dan;
00148 static const CArray<std::string,10> suji;
00150 static const CArray<std::string,32> pieces;
00151
00152 const std::string& getDan(const size_t index) const {return dan[index];}
00153 const std::string& getSuji(const size_t index) const {return suji[index];}
00154 const std::string& getPiece(const size_t index) const {return pieces[index];}
00155 };
00156
00158 struct RussianCharacters : public Characters
00159 {
00160 static const CArray<std::string,10> dan;
00161 static const CArray<std::string,10> suji;
00162 static const CArray<std::string,32> pieces;
00163
00164 const std::string& getDan(const size_t index) const {return dan[index];}
00165 const std::string& getSuji(const size_t index) const {return suji[index];}
00166 const std::string& getPiece(const size_t index) const {return pieces[index];}
00167 };
00168
00170 struct KIFCharacters : public Characters
00171 {
00172 static const CArray<std::string,10> dan;
00173 static const CArray<std::string,10> suji;
00174 static const CArray<std::string,32> pieces;
00175
00176 const std::string& getDan(const size_t index) const {return dan[index];}
00177 const std::string& getSuji(const size_t index) const {return suji[index];}
00178 const std::string& getPiece(const size_t index) const {return pieces[index];}
00179 };
00180
00184 class KanjiPrint
00185 {
00186 private:
00187 std::ostream& os;
00188 const std::shared_ptr<Characters> pieces;
00189 Color black_color;
00190 Color white_color;
00191 Color last_move_color;
00192
00193 public:
00194 explicit KanjiPrint(std::ostream& os,
00195 const std::shared_ptr<Characters> pieces=std::shared_ptr<Characters>(new StandardCharacters()))
00196 : os(os), pieces(pieces),
00197 black_color(Color::NONE),
00198 white_color(Color::NONE),
00199 last_move_color(Color::NONE) {}
00200 ~KanjiPrint() {}
00201
00207 void print(const SimpleState& state,
00208 const Move *last_move=NULL) const;
00209
00210 void setBlackColor(const Color& c) {black_color = c;}
00211 void setWhiteColor(const Color& c) {white_color = c;}
00212 void setLastMoveColor(const Color& c) {last_move_color = c;}
00213 };
00214 }
00215 }
00216
00217 #endif
00218
00219
00220
00221