directionTraits.h
Go to the documentation of this file.
1 /* directionTraits.h
2  */
3 #ifndef OSL_DIRECTIONTRAITS_H
4 #define OSL_DIRECTIONTRAITS_H
5 
6 #include "osl/basic_type.h"
7 
8 namespace osl
9 {
10  template<Direction Dir>
12 
13  template<>
15  static const int blackDx=1;
16  static const int blackDy=-1;
17  static const bool canPromoteTo=true;
18  static const Direction altDir=DR;
19  static const Direction longDir=LONG_UL;
20  static const Direction primDir=UL;
21  static const int ptypeMask=
22  (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
23  (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<SILVER)|(1<<BISHOP);
24  };
25 
26  template<>
28  static const int blackDx=0;
29  static const int blackDy=-1;
30  static const bool canPromoteTo=true;
31  static const Direction altDir=D;
32  static const Direction longDir=LONG_U;
33  static const Direction primDir=U;
34  static const int ptypeMask=
35  (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
36  (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<PAWN)|(1<<LANCE)|(1<<SILVER)|(1<<ROOK);
37  };
38 
39  template<>
41  static const int blackDx=-1;
42  static const int blackDy=-1;
43  static const bool canPromoteTo=true;
44  static const Direction altDir=DL;
45  static const Direction longDir=LONG_UR;
46  static const Direction primDir=UR;
47  static const int ptypeMask=
48  (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
49  (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<SILVER)|(1<<BISHOP);
50  };
51  template<>
53  static const int blackDx=1;
54  static const int blackDy=0;
55  static const bool canPromoteTo=false;
56  static const Direction altDir=R;
57  static const Direction longDir=LONG_L;
58  static const Direction primDir=L;
59  static const int ptypeMask=
60  (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
61  (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<ROOK);
62  };
63  template<>
65  static const int blackDx=-1;
66  static const int blackDy=0;
67  static const bool canPromoteTo=false;
68  static const Direction altDir=L;
69  static const Direction longDir=LONG_R;
70  static const Direction primDir=L;
71  static const int ptypeMask=
72  (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
73  (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<ROOK);
74  };
75  template<>
77  static const int blackDx=1;
78  static const int blackDy=1;
79  static const bool canPromoteTo=false;
80  static const Direction altDir=UR;
81  static const Direction longDir=LONG_DL;
82  static const Direction primDir=UR;
83  static const int ptypeMask=
84  (1<<PBISHOP)|(1<<PROOK)|(1<<KING)|(1<<SILVER)|(1<<BISHOP);
85  };
86  template<>
88  static const int blackDx=0;
89  static const int blackDy=1;
90  static const bool canPromoteTo=false;
91  static const Direction altDir=U;
92  static const Direction longDir=LONG_D;
93  static const Direction primDir=U;
94  static const int ptypeMask=
95  (1<<PPAWN)|(1<<PLANCE)|(1<<PKNIGHT)|(1<<PSILVER)|(1<<PBISHOP)|
96  (1<<PROOK)|(1<<KING)|(1<<GOLD)|(1<<ROOK);
97  };
98  template<>
100  static const int blackDx=-1;
101  static const int blackDy=1;
102  static const bool canPromoteTo=false;
103  static const Direction altDir=UL;
104  static const Direction longDir=LONG_DR;
105  static const Direction primDir=UL;
106  static const int ptypeMask=
107  (1<<PBISHOP)|(1<<PROOK)|(1<<KING)|(1<<SILVER)|(1<<BISHOP);
108  };
109  template<>
111  static const int blackDx=1;
112  static const int blackDy=-2;
113  static const bool canPromoteTo=true;
114  // no meaning
115  static const Direction altDir=UUL;
116  static const Direction longDir=UUL;
117  static const Direction primDir=UUL;
118  static const int ptypeMask=
119  (1<<KNIGHT);
120  };
121  template<>
123  static const int blackDx=-1;
124  static const int blackDy=-2;
125  static const bool canPromoteTo=true;
126  // no meaning
127  static const Direction altDir=UUR;
128  static const Direction longDir=UUR;
129  static const Direction primDir=UUR;
130  static const int ptypeMask=
131  (1<<KNIGHT);
132  };
133 
134  template<>
136  static const bool canPromoteTo=true;
137  static const Direction altDir=LONG_DR;
138  static const Direction longDir=LONG_UL;
139  static const Direction primDir=UL;
140  static const int blackDx=DirectionTraitsGen<UL>::blackDx;
141  static const int blackDy=DirectionTraitsGen<UL>::blackDy;
142  static const int ptypeMask=
143  (1<<PBISHOP)|(1<<BISHOP);
144  };
145 
146  template<>
148  static const bool canPromoteTo=true;
149  static const Direction altDir=LONG_D;
150  static const Direction longDir=LONG_U;
151  static const Direction primDir=U;
152  static const int blackDx=DirectionTraitsGen<U>::blackDx;
153  static const int blackDy=DirectionTraitsGen<U>::blackDy;
154  static const int ptypeMask=
155  (1<<LANCE)|(1<<ROOK)|(1<<PROOK);
156  };
157 
158  template<>
160  static const bool canPromoteTo=true;
161  static const Direction altDir=LONG_DL;
162  static const Direction longDir=LONG_UR;
163  static const Direction primDir=UR;
164  static const int blackDx=DirectionTraitsGen<UR>::blackDx;
165  static const int blackDy=DirectionTraitsGen<UR>::blackDy;
166  static const int ptypeMask=
167  (1<<PBISHOP)|(1<<BISHOP);
168  };
169  template<>
171  static const bool canPromoteTo=false;
172  static const Direction altDir=LONG_R;
173  static const Direction longDir=LONG_L;
174  static const Direction primDir=L;
175  static const int blackDx=DirectionTraitsGen<L>::blackDx;
176  static const int blackDy=DirectionTraitsGen<L>::blackDy;
177  static const int ptypeMask=
178  (1<<ROOK)|(1<<PROOK);
179  };
180  template<>
182  static const bool canPromoteTo=false;
183  static const Direction altDir=LONG_L;
184  static const Direction longDir=LONG_R;
185  static const Direction primDir=L;
186  static const int blackDx=DirectionTraitsGen<R>::blackDx;
187  static const int blackDy=DirectionTraitsGen<R>::blackDy;
188  static const int ptypeMask=
189  (1<<ROOK)|(1<<PROOK);
190  };
191  template<>
193  static const bool canPromoteTo=false;
194  static const Direction altDir=LONG_UR;
195  static const Direction longDir=LONG_DL;
196  static const Direction primDir=UR;
197  static const int blackDx=DirectionTraitsGen<DL>::blackDx;
198  static const int blackDy=DirectionTraitsGen<DL>::blackDy;
199  static const int ptypeMask=
200  (1<<PBISHOP)|(1<<BISHOP);
201  };
202  template<>
204  static const bool canPromoteTo=false;
205  static const Direction altDir=LONG_U;
206  static const Direction longDir=LONG_D;
207  static const Direction primDir=U;
208  static const int blackDx=DirectionTraitsGen<D>::blackDx;
209  static const int blackDy=DirectionTraitsGen<D>::blackDy;
210  static const int ptypeMask=
211  (1<<ROOK)|(1<<PROOK);
212  };
213  template<>
215  static const bool canPromoteTo=false;
216  static const Direction altDir=LONG_UL;
217  static const Direction longDir=LONG_DR;
218  static const Direction primDir=UL;
219  static const int blackDx=DirectionTraitsGen<DR>::blackDx;
220  static const int blackDy=DirectionTraitsGen<DR>::blackDy;
221  static const int ptypeMask=
222  (1<<PBISHOP)|(1<<BISHOP);
223  };
224  template<Direction Dir>
226  // これらを関数にすると押し込められる
227  static const unsigned int mask=1<<static_cast<int>(Dir);
228  static const bool isLong=(static_cast<int>(Dir) >= LONG_UL);
229  static const int blackDx=DirectionTraitsGen<Dir>::blackDx;
230  static const int blackDy=DirectionTraitsGen<Dir>::blackDy;
231  static const Offset blackOffset() { return Offset(blackDx,blackDy); }
232  static const bool canPromoteTo=DirectionTraitsGen<Dir>::canPromoteTo;
234  static const int ptypeMask=DirectionTraitsGen<Dir>::ptypeMask;
235  static const int ptypeMaskNotKing=DirectionTraitsGen<Dir>::ptypeMask &
236  ~(1<<KING);
239  };
240 
241  template<Direction Dir,Player P>
243 
244  template<Direction Dir>
246  static const Offset offset() {
248  }
249  static const Direction directionByBlack=Dir;
250  };
251  template<Direction Dir>
253 
254  template<Direction Dir>
256  static const Offset offset() {
258  }
259  static const Direction directionByBlack=DirectionTraitsGen<Dir>::altDir;
260  };
261  template<Direction Dir>
263 
264  template <Player P, Direction D>
267  }
268 } // namespace osl
269 
270 #endif /* OSL_DIRECTIONTRAITS_H */
271 // ;;; Local Variables:
272 // ;;; mode:c++
273 // ;;; c-basic-offset:2
274 // ;;; coding:utf-8
275 // ;;; End:
static const Offset blackOffset()
座標の差分
Definition: basic_type.h:429
constexpr Direction primDir(Direction d)
8方向について,primitiveな4方向を求める
Definition: basic_type.h:366
static Offset make()
Direction
Definition: basic_type.h:310
constexpr bool isLong(Direction d)
Definition: basic_type.h:350