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 
9 namespace osl
10 {
11  template<Ptype T>
12  struct PtypeTraits;
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 <>
38  struct PtypeTraits<GOLD>
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 <>
58  struct PtypeTraits<PAWN>
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>
290  struct PtypeFunsSub;
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>
310  struct PtypeFuns
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=
349  ? NoConstraint : OnlyBasic )
351  ? OnlyPromoted : CannotMove));
352  };
353 
354 
355  template<Player T>
356  struct KingTraits
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:
osl::PtypeTraits< PROOK >::csaName
static const char * csaName()
Definition: ptypeTraits.h:257
osl::PtypeTraits< PPAWN >::csaName
static const char * csaName()
Definition: ptypeTraits.h:84
osl::PtypeTraits< KNIGHT >::name
static const char * name()
Definition: ptypeTraits.h:130
osl::PtypePlayerTraits::canDropTo
static bool canDropTo(Square pos)
Definition: ptypeTraits.h:364
osl::Square
Definition: basic_type.h:532
osl::PtypePlayerTraits::checkPromote
static bool checkPromote(Square pos)
posにあるTの駒がpromote可能なdirectionに動く時だけpromote可能 shortの時はその時のみYES
Definition: ptypeTraits.h:426
osl::Square::reverseY
static int reverseY(int y)
Definition: basic_type.h:652
osl::PtypeTraits< PTYPE_EDGE >::name
static const char * name()
Definition: ptypeTraits.h:32
osl::PtypeTraits< PLANCE >::csaName
static const char * csaName()
Definition: ptypeTraits.h:116
osl::PtypeDirectionTraits::canMove
static const bool canMove
Definition: ptypeTraits.h:342
osl::PLANCE
@ PLANCE
Definition: basic_type.h:88
osl::PtypeTraits< PAWN >::csaName
static const char * csaName()
Definition: ptypeTraits.h:66
directionTraits.h
osl::PtypeTraits< PROOK >::name
static const char * name()
Definition: ptypeTraits.h:256
osl::PtypeTraits< KNIGHT >::csaName
static const char * csaName()
Definition: ptypeTraits.h:131
osl::PtypeTraits< GOLD >::csaName
static const char * csaName()
Definition: ptypeTraits.h:45
osl::PtypeFuns
Definition: ptypeTraits.h:311
osl::PtypeTraits< PTYPE_EMPTY >::csaName
static const char * csaName()
Definition: ptypeTraits.h:22
osl::PtypeTraits< GOLD >::name
static const char * name()
Definition: ptypeTraits.h:44
osl::PSILVER
@ PSILVER
Definition: basic_type.h:90
osl::MoveConstraint
MoveConstraint
ある方向にある駒が移動可能かを表す.
Definition: ptypeTraits.h:327
basic_type.h
osl::PtypeDirectionTraits::moveConstraint
static const MoveConstraint moveConstraint
Definition: ptypeTraits.h:346
osl::PtypeTraits
Definition: ptypeTraits.h:12
osl::PtypeTraits< PLANCE >::name
static const char * name()
Definition: ptypeTraits.h:115
osl::PtypeDirectionTraits::hasMove
static const bool hasMove
Definition: ptypeTraits.h:341
osl::NoConstraint
@ NoConstraint
promoteしていようが,いまいが可能
Definition: ptypeTraits.h:335
osl::Ptype
Ptype
駒の種類を4ビットでコード化する
Definition: basic_type.h:84
osl::LANCE
@ LANCE
Definition: basic_type.h:96
osl::D
@ D
Definition: basic_type.h:319
osl::PtypeFuns::promotePtype
static const Ptype promotePtype
Definition: ptypeTraits.h:319
osl::PtypeFuns::indexMask
static const uint64_t indexMask
Definition: ptypeTraits.h:318
osl::PtypeTraits< BISHOP >::csaName
static const char * csaName()
Definition: ptypeTraits.h:198
osl::GOLD
@ GOLD
Definition: basic_type.h:94
osl::Square::yEq
bool yEq()
Definition: basic_type.h:726
osl::PtypePlayerTraits::canPromote
static bool canPromote(Square pos)
posにあるTの駒がどの方向に動いてもpromote可能
Definition: ptypeTraits.h:409
osl::PtypeTraits< ROOK >::name
static const char * name()
Definition: ptypeTraits.h:236
osl::PtypeFuns::hasLongMove
static const bool hasLongMove
Definition: ptypeTraits.h:317
osl::OnlyBasic
@ OnlyBasic
promoteしていない駒の場合にのみ可能
Definition: ptypeTraits.h:333
osl::KING
@ KING
Definition: basic_type.h:93
osl::PtypeFuns::basicType
static const Ptype basicType
Definition: ptypeTraits.h:320
osl::BISHOP
@ BISHOP
Definition: basic_type.h:99
osl::PtypeTraits< PKNIGHT >::csaName
static const char * csaName()
Definition: ptypeTraits.h:148
osl::PtypeTraits< ROOK >::csaName
static const char * csaName()
Definition: ptypeTraits.h:237
osl::PtypeTraits< PSILVER >::csaName
static const char * csaName()
Definition: ptypeTraits.h:183
osl::PtypeTraits< SILVER >::name
static const char * name()
Definition: ptypeTraits.h:162
osl::PtypeTraits< KING >::csaName
static const char * csaName()
Definition: ptypeTraits.h:277
osl::PtypePlayerTraits::mayPromote
static bool mayPromote(Square pos)
posにある駒がpromoteする可能性があるか? 先手BISHOPが49,58,59,69などにいる場合は可能性がないが,この時点では排除しない
Definition: ptypeTraits.h:379
osl::PAWN
@ PAWN
Definition: basic_type.h:95
osl::PPAWN
@ PPAWN
Definition: basic_type.h:87
osl::PKNIGHT
@ PKNIGHT
Definition: basic_type.h:89
osl::isBasic
bool isBasic(Ptype ptype)
ptypeが基本型(promoteしていない)かのチェック
Definition: basic_type.h:128
osl::PtypeTraits< PTYPE_EMPTY >::name
static const char * name()
Definition: ptypeTraits.h:21
osl::PtypeTraits< PKNIGHT >::name
static const char * name()
Definition: ptypeTraits.h:147
osl::PtypeTraits< PTYPE_EDGE >::csaName
static const char * csaName()
Definition: ptypeTraits.h:33
osl::PBISHOP
@ PBISHOP
Definition: basic_type.h:91
osl::PtypeDirectionTraits
Definition: ptypeTraits.h:340
osl::Square::yGe
std::enable_if< Y!=7, bool >::type yGe()
Definition: basic_type.h:738
osl::PtypePlayerTraits
Definition: ptypeTraits.h:363
osl::playerToIndex
constexpr int playerToIndex(Player player)
Definition: basic_type.h:16
osl::PtypePlayerTraits::mustPromote
static bool mustPromote(Square pos)
posにあるTの駒がpromoteする手しかない
Definition: ptypeTraits.h:393
osl::ROOK
@ ROOK
Definition: basic_type.h:100
osl::PtypeTraits< PPAWN >::name
static const char * name()
Definition: ptypeTraits.h:83
osl::Square::y
int y() const
将棋としてのY座標を返す.
Definition: basic_type.h:567
osl::PtypeTraits< LANCE >::name
static const char * name()
Definition: ptypeTraits.h:98
osl::KingTraits
Definition: ptypeTraits.h:357
osl::PtypeTraits< LANCE >::csaName
static const char * csaName()
Definition: ptypeTraits.h:99
osl::PtypeTraits< BISHOP >::name
static const char * name()
Definition: ptypeTraits.h:197
osl::BLACK
@ BLACK
Definition: basic_type.h:9
osl::PtypeTraits< PBISHOP >::csaName
static const char * csaName()
Definition: ptypeTraits.h:218
osl::canPromote
bool canPromote(Ptype ptype)
ptypeがpromote可能な型かどうかのチェック promote済みの場合はfalseを返す
Definition: basic_type.h:147
osl::PtypeTraits< PBISHOP >::name
static const char * name()
Definition: ptypeTraits.h:217
osl::PTYPE_EDGE
@ PTYPE_EDGE
Definition: basic_type.h:86
osl::SILVER
@ SILVER
Definition: basic_type.h:98
osl::PtypePlayerTraits::noPromote
static bool noPromote(Square pos)
posにあるTの駒は次に絶対にpromoteできない
Definition: ptypeTraits.h:444
osl::PTYPE_EMPTY
@ PTYPE_EMPTY
Definition: basic_type.h:85
osl::PROOK
@ PROOK
Definition: basic_type.h:92
osl::Square::yLe
std::enable_if< Y!=2, bool >::type yLe()
Definition: basic_type.h:730
osl::PtypeTraits< KING >::name
static const char * name()
Definition: ptypeTraits.h:276
osl::PtypeTraits< PSILVER >::name
static const char * name()
Definition: ptypeTraits.h:182
osl::CannotMove
@ CannotMove
可能でない
Definition: ptypeTraits.h:329
osl::KingTraits::index
static const int index
Definition: ptypeTraits.h:358
osl::DirectionTraits
Definition: directionTraits.h:225
osl::PtypeFunsSub
Definition: ptypeTraits.h:290
osl::PtypeTraits< SILVER >::csaName
static const char * csaName()
Definition: ptypeTraits.h:163
osl::OnlyPromoted
@ OnlyPromoted
promote済みの駒の場合にのみ可能
Definition: ptypeTraits.h:331
osl::PtypeTraits< PAWN >::name
static const char * name()
Definition: ptypeTraits.h:65
osl
Definition: additionalEffect.h:6
osl::KNIGHT
@ KNIGHT
Definition: basic_type.h:97