My Project
ptypeTraits.h
Go to the documentation of this file.
1/* ptypeTraits.h
2 */
3#ifndef OSL_PTYPETRAITS_H
4#define OSL_PTYPETRAITS_H
5
6#include "osl/basic_type.h"
8
9namespace osl
10{
11 template<Ptype T>
13
14 template <>
16 {
17 static const bool isBasic=false;
18 static const bool canPromote=false;
20 static const bool betterToPromote=false;
21 static const char *name() { return "PTYPE_EMPTY";}
22 static const char *csaName() { return "..";}
23 static const int moveMask=0;
24 };
25
26 template <>
28 {
29 static const bool isBasic=false;
30 static const bool canPromote=false;
31 static const bool betterToPromote=false;
32 static const char *name() { return "PTYPE_EDGE";}
33 static const char *csaName() { return "XX";}
34 static const int moveMask=0;
35 };
36
37 template <>
39 {
40 static const bool isBasic=true;
41 static const bool canPromote=false;
42 static const bool betterToPromote=false;
43 static const Ptype moveType=GOLD;
44 static const char *name() { return "GOLD";}
45 static const char *csaName() { return "KI";}
46 static const int indexMin=26;
47 static const int indexLimit=30;
48 static const int dropBlackFromY=1;
49 static const int dropBlackToY=9;
50 static const Ptype basicType=GOLD;
51 static const int moveMask=
55 };
56
57 template <>
59 {
60 static const bool isBasic=true;
61 static const bool canPromote=true;
62 static const bool betterToPromote=true;
63 static const Ptype moveType=PAWN;
64 static const Ptype basicType=PAWN;
65 static const char *name() { return "PAWN";}
66 static const char *csaName() { return "FU";}
67 static const int indexMin=0;
68 static const int indexLimit=18;
69 static const int dropBlackFromY=2;
70 static const int dropBlackToY=9;
71 static const int mayPromoteToY=4;
72 static const int moveMask=DirectionTraits<U>::mask;
73 };
74
75 template <>
77 {
78 static const bool isBasic=false;
79 static const bool canPromote=false;
80 // 疑問 falseの方がよいのでは?
81 static const bool betterToPromote=true;
82 static const Ptype moveType=GOLD;
83 static const char *name() { return "PPAWN";}
84 static const char *csaName() { return "TO";}
85 static const int moveMask=PtypeTraits<GOLD>::moveMask;
86 static const Ptype basicType=PAWN;
87 static const int indexMin=PtypeTraits<basicType>::indexMin;
88 };
89
90 template <>
92 {
93 static const bool isBasic=true;
94 static const bool canPromote=true;
95 static const bool betterToPromote=false;
96 static const Ptype moveType=LANCE;
97 static const Ptype basicType=LANCE;
98 static const char *name() { return "LANCE";}
99 static const char *csaName() { return "KY";}
100 static const int indexMin=32;
101 static const int indexLimit=36;
102 static const int dropBlackFromY=2;
103 static const int dropBlackToY=9;
104 static const int mayPromoteToY=9;
105 static const int moveMask=DirectionTraits<LONG_U>::mask;
106 };
107
108 template <>
110 {
111 static const bool isBasic=false;
112 static const bool canPromote=false;
113 static const bool betterToPromote=false;
114 static const Ptype moveType=GOLD;
115 static const char *name() { return "PLANCE";}
116 static const char *csaName() { return "NY";}
117 static const int moveMask=PtypeTraits<GOLD>::moveMask;
118 static const Ptype basicType=LANCE;
119 static const int indexMin=PtypeTraits<basicType>::indexMin;
120 };
121
122 template <>
124 {
125 static const bool isBasic=true;
126 static const bool canPromote=true;
127 static const bool betterToPromote=false;
128 static const Ptype moveType=KNIGHT;
129 static const Ptype basicType=KNIGHT;
130 static const char *name() { return "KNIGHT";}
131 static const char *csaName() { return "KE";}
132 static const int indexMin=18;
133 static const int indexLimit=22;
134 static const int dropBlackFromY=3;
135 static const int dropBlackToY=9;
136 static const int mayPromoteToY=5;
138 };
139
140 template <>
142 {
143 static const bool isBasic=false;
144 static const bool canPromote=false;
145 static const bool betterToPromote=false;
146 static const Ptype moveType=GOLD;
147 static const char *name() { return "PKNIGHT";}
148 static const char *csaName() { return "NK";}
149 static const int moveMask=PtypeTraits<GOLD>::moveMask;
150 static const Ptype basicType=KNIGHT;
151 static const int indexMin=PtypeTraits<basicType>::indexMin;
152 };
153
154 template <>
156 {
157 static const bool isBasic=true;
158 static const bool canPromote=true;
159 static const bool betterToPromote=false;
160 static const Ptype moveType=SILVER;
161 static const Ptype basicType=SILVER;
162 static const char *name() { return "SILVER";}
163 static const char *csaName() { return "GI";}
164 static const int indexMin=22;
165 static const int indexLimit=26;
166 static const int dropBlackFromY=1;
167 static const int dropBlackToY=9;
168 static const int mayPromoteToY=4;
169 static const int moveMask=
173 };
174
175 template <>
177 {
178 static const bool isBasic=false;
179 static const bool canPromote=false;
180 static const bool betterToPromote=false;
181 static const Ptype moveType=GOLD;
182 static const char *name() { return "PSILVER";}
183 static const char *csaName() { return "NG";}
184 static const int moveMask=PtypeTraits<GOLD>::moveMask;
185 static const Ptype basicType=SILVER;
186 static const int indexMin=PtypeTraits<basicType>::indexMin;
187 };
188
189 template <>
191 {
192 static const bool isBasic=true;
193 static const bool canPromote=true;
194 static const bool betterToPromote=true;
195 static const Ptype moveType=BISHOP;
196 static const Ptype basicType=BISHOP;
197 static const char *name() { return "BISHOP";}
198 static const char *csaName() { return "KA";}
199 static const int indexMin=36;
200 static const int indexLimit=38;
201 static const int dropBlackFromY=1;
202 static const int dropBlackToY=9;
203 static const int mayPromoteToY=9;
204 static const int moveMask=
207 };
208
209 template <>
211 {
212 static const bool isBasic=false;
213 static const bool canPromote=false;
214 // 疑問 falseの方がよいのでは?
215 static const bool betterToPromote=true;
216 static const Ptype moveType=PBISHOP;
217 static const char *name() { return "PBISHOP";}
218 static const char *csaName() { return "UM";}
219 static const int moveMask=
224 static const Ptype basicType=BISHOP;
225 static const int indexMin=PtypeTraits<basicType>::indexMin;
226 };
227
228 template <>
230 {
231 static const bool isBasic=true;
232 static const bool canPromote=true;
233 static const bool betterToPromote=true;
234 static const Ptype moveType=ROOK;
235 static const Ptype basicType=ROOK;
236 static const char *name() { return "ROOK";}
237 static const char *csaName() { return "HI";}
238 static const int indexMin=38;
239 static const int indexLimit=40;
240 static const int dropBlackFromY=1;
241 static const int dropBlackToY=9;
242 static const int mayPromoteToY=9;
243 static const int moveMask=
246 };
247
248 template <>
250 {
251 static const bool isBasic=false;
252 static const bool canPromote=false;
253 // 疑問 falseの方がよいのでは?
254 static const bool betterToPromote=true;
255 static const Ptype moveType=PROOK;
256 static const char *name() { return "PROOK";}
257 static const char *csaName() { return "RY";}
258 static const int moveMask=
263 static const Ptype basicType=ROOK;
264 static const int indexMin=PtypeTraits<basicType>::indexMin;
265 };
266
267
268 template <>
270 {
271 static const bool isBasic=true;
272 static const bool canPromote=false;
273 static const bool betterToPromote=false;
274 static const Ptype moveType=KING;
275 static const Ptype basicType=KING;
276 static const char *name() { return "KING";}
277 static const char *csaName() { return "OU";}
278 static const int indexMin=30;
279 static const int indexLimit=32;
280 static const int dropBlackFromY=1;
281 static const int dropBlackToY=9;
282 static const int moveMask=
287 };
288
289 template<Ptype T,bool IsBasic>
291
292 template<Ptype T>
293 struct PtypeFunsSub<T,true>
294 {
295 static const uint64_t indexMask=(((unsigned long long) -1)<<(PtypeTraits<T>::indexMin))^(((unsigned long long) -1)<<(PtypeTraits<T>::indexLimit));
296 static const Ptype promotePtype=static_cast<Ptype>(static_cast<int>(T)-8);
297 static const Ptype basicType = T;
298 };
299
300 template<Ptype T>
301 struct PtypeFunsSub<T,false>
302 {
303 static const uint64_t indexMask=static_cast<uint64_t>(0);
304 // static const Ptype promotePtype=PTYPE_EMPTY;
305 static const Ptype promotePtype=T;
306 static const Ptype basicType = PtypeTraits<T>::basicType;
307 };
308
309 template<Ptype T>
311 {
312#if OSL_WORDSIZE == 64
313 static const unsigned int indexNum=0;
314#elif OSL_WORDSIZE == 32
315 static const unsigned int indexNum=(PtypeTraits<T>::indexMin >> 5);
316#endif
317 static const bool hasLongMove=(PtypeTraits<T>::indexMin>=32);
321 };
322
336 };
337
338 template<Ptype T,Direction D>
340 {
342 static const bool canMove=
352 };
353
354
355 template<Player T>
357 {
359 };
360
361 template<Ptype T,Player P>
363 {
364 static bool canDropTo(Square pos)
365 {
366 static_assert(PtypeTraits<T>::isBasic, "canDropTo");
368 return true;
369
370 if (P==BLACK)
371 return pos.y() >= PtypeTraits<T>::dropBlackFromY;
372 else
374 }
379 static bool mayPromote(Square pos)
380 {
381 static_assert(PtypeTraits<T>::isBasic&&PtypeTraits<T>::canPromote, "mayPromote");
383 return true;
384
385 if (P==BLACK)
386 return pos.y() <= PtypeTraits<T>::mayPromoteToY;
387 else
389 }
393 static bool mustPromote(Square pos)
394 {
395 if(P==BLACK){
396 if(T==PAWN || T==LANCE) return pos.yEq<2>();
397 else if(T==KNIGHT) return pos.yLe<4>();
398 else return false;
399 }
400 else{
401 if(T==PAWN || T==LANCE) return pos.yEq<8>();
402 else if(T==KNIGHT) return pos.yGe<6>();
403 else return false;
404 }
405 }
409 static bool canPromote(Square pos)
410 {
411 if(P==BLACK){
412 if(T==PAWN || T==LANCE) return pos.yLe<4>();
413 else if(T==KNIGHT) return pos.yLe<5>();
414 else return pos.yLe<3>();
415 }
416 else{
417 if(T==PAWN || T==LANCE) return pos.yGe<6>();
418 else if(T==KNIGHT) return pos.yGe<5>();
419 else return pos.yGe<7>();
420 }
421 }
426 static bool checkPromote(Square pos)
427 {
428 if(P==BLACK){
429 if(T==SILVER) return pos.yEq<4>();
430 else if(T==LANCE || T==ROOK || T==BISHOP)
431 return true;
432 else return false;
433 }
434 else{
435 if(T==SILVER) return pos.yEq<6>();
436 else if(T==LANCE || T==ROOK || T==BISHOP)
437 return true;
438 else return false;
439 }
440 }
444 static bool noPromote(Square pos)
445 {
446 if(P==BLACK){
447 if(T==PAWN || T==SILVER) return pos.yGe<5>();
448 else if(T==KNIGHT) return pos.yGe<6>();
449 else if(T==LANCE || T==ROOK || T==BISHOP) return false;
450 else return true;
451 }
452 else{
453 if(T==PAWN || T==SILVER) return pos.yLe<5>();
454 else if(T==KNIGHT) return pos.yLe<4>();
455 else if(T==LANCE || T==ROOK || T==BISHOP) return false;
456 else return true;
457 }
458 }
459 };
460
461
462} // namespace osl
463
464#endif /* OSL_PTYPETRAITS_H */
465// ;;; Local Variables:
466// ;;; mode:c++
467// ;;; c-basic-offset:2
468// ;;; End:
std::enable_if< Y!=7, bool >::type yGe()
Definition: basic_type.h:738
bool yEq()
Definition: basic_type.h:726
int y() const
将棋としてのY座標を返す.
Definition: basic_type.h:567
static int reverseY(int y)
Definition: basic_type.h:652
std::enable_if< Y!=2, bool >::type yLe()
Definition: basic_type.h:730
Ptype
駒の種類を4ビットでコード化する
Definition: basic_type.h:84
@ ROOK
Definition: basic_type.h:100
@ PPAWN
Definition: basic_type.h:87
@ BISHOP
Definition: basic_type.h:99
@ PROOK
Definition: basic_type.h:92
@ PAWN
Definition: basic_type.h:95
@ PTYPE_EDGE
Definition: basic_type.h:86
@ KING
Definition: basic_type.h:93
@ KNIGHT
Definition: basic_type.h:97
@ PTYPE_EMPTY
Definition: basic_type.h:85
@ SILVER
Definition: basic_type.h:98
@ PKNIGHT
Definition: basic_type.h:89
@ GOLD
Definition: basic_type.h:94
@ PLANCE
Definition: basic_type.h:88
@ PBISHOP
Definition: basic_type.h:91
@ LANCE
Definition: basic_type.h:96
@ PSILVER
Definition: basic_type.h:90
bool canPromote(Ptype ptype)
ptypeがpromote可能な型かどうかのチェック promote済みの場合はfalseを返す
Definition: basic_type.h:147
constexpr int playerToIndex(Player player)
Definition: basic_type.h:16
@ D
Definition: basic_type.h:319
@ BLACK
Definition: basic_type.h:9
bool isBasic(Ptype ptype)
ptypeが基本型(promoteしていない)かのチェック
Definition: basic_type.h:128
MoveConstraint
ある方向にある駒が移動可能かを表す.
Definition: ptypeTraits.h:327
@ NoConstraint
promoteしていようが,いまいが可能
Definition: ptypeTraits.h:335
@ OnlyBasic
promoteしていない駒の場合にのみ可能
Definition: ptypeTraits.h:333
@ OnlyPromoted
promote済みの駒の場合にのみ可能
Definition: ptypeTraits.h:331
@ CannotMove
可能でない
Definition: ptypeTraits.h:329
static const int index
Definition: ptypeTraits.h:358
static const bool hasMove
Definition: ptypeTraits.h:341
static const bool canMove
Definition: ptypeTraits.h:342
static const MoveConstraint moveConstraint
Definition: ptypeTraits.h:346
static const Ptype promotePtype
Definition: ptypeTraits.h:319
static const Ptype basicType
Definition: ptypeTraits.h:320
static const uint64_t indexMask
Definition: ptypeTraits.h:318
static const bool hasLongMove
Definition: ptypeTraits.h:317
static bool canDropTo(Square pos)
Definition: ptypeTraits.h:364
static bool checkPromote(Square pos)
posにあるTの駒がpromote可能なdirectionに動く時だけpromote可能 shortの時はその時のみYES
Definition: ptypeTraits.h:426
static bool canPromote(Square pos)
posにあるTの駒がどの方向に動いてもpromote可能
Definition: ptypeTraits.h:409
static bool mayPromote(Square pos)
posにある駒がpromoteする可能性があるか? 先手BISHOPが49,58,59,69などにいる場合は可能性がないが,この時点では排除しない
Definition: ptypeTraits.h:379
static bool noPromote(Square pos)
posにあるTの駒は次に絶対にpromoteできない
Definition: ptypeTraits.h:444
static bool mustPromote(Square pos)
posにあるTの駒がpromoteする手しかない
Definition: ptypeTraits.h:393
static const char * name()
Definition: ptypeTraits.h:197
static const char * csaName()
Definition: ptypeTraits.h:198
static const char * csaName()
Definition: ptypeTraits.h:45
static const char * name()
Definition: ptypeTraits.h:44
static const char * name()
Definition: ptypeTraits.h:276
static const char * csaName()
Definition: ptypeTraits.h:277
static const char * csaName()
Definition: ptypeTraits.h:131
static const char * name()
Definition: ptypeTraits.h:130
static const char * csaName()
Definition: ptypeTraits.h:99
static const char * name()
Definition: ptypeTraits.h:98
static const char * csaName()
Definition: ptypeTraits.h:66
static const char * name()
Definition: ptypeTraits.h:65
static const char * csaName()
Definition: ptypeTraits.h:218
static const char * name()
Definition: ptypeTraits.h:217
static const char * csaName()
Definition: ptypeTraits.h:148
static const char * name()
Definition: ptypeTraits.h:147
static const char * name()
Definition: ptypeTraits.h:115
static const char * csaName()
Definition: ptypeTraits.h:116
static const char * csaName()
Definition: ptypeTraits.h:84
static const char * name()
Definition: ptypeTraits.h:83
static const char * name()
Definition: ptypeTraits.h:256
static const char * csaName()
Definition: ptypeTraits.h:257
static const char * csaName()
Definition: ptypeTraits.h:183
static const char * name()
Definition: ptypeTraits.h:182
static const char * csaName()
Definition: ptypeTraits.h:33
static const char * name()
Definition: ptypeTraits.h:32
static const char * name()
Definition: ptypeTraits.h:21
static const char * csaName()
Definition: ptypeTraits.h:22
static const char * name()
Definition: ptypeTraits.h:236
static const char * csaName()
Definition: ptypeTraits.h:237
static const char * csaName()
Definition: ptypeTraits.h:163
static const char * name()
Definition: ptypeTraits.h:162