00001 #ifndef _GENERATE_OPEN_MOVES_H
00002 #define _GENERATE_OPEN_MOVES_H
00003 #include "osl/move_generator/pieceOnBoard.h"
00004 #include "osl/move_action/concept.h"
00005 #include "osl/state/simpleState.h"
00006 #include <boost/static_assert.hpp>
00007
00008
00009
00010 namespace osl
00011 {
00012 namespace move_generator
00013 {
00019 template<Player P>
00020 class Open
00021 {
00022
00023
00024
00025 template<class Action,Ptype Type,PromoteType CanP,Direction Dir,bool B>
00026 static void generateMoveNotDir3(const SimpleState& state,Piece p,Action& action,Position to,Int2Type<B>);
00027
00028 template<class Action,Ptype Type,PromoteType CanP,Direction Dir>
00029 static void generateMoveNotDir3(const SimpleState& state,Piece p,Action& action,Position to,Int2Type<true>);
00030
00031 template<class Action,Ptype Type,PromoteType CanP,Direction Dir>
00032 static void generateMoveNotDir3(const SimpleState&, Piece, Action&, Position, Int2Type<false>){
00033
00034 }
00035
00036 template<class Action,Ptype Type,Direction Dir,PromoteType CanP,Direction MoveDir>
00037 static void generateMoveNotDir2(const SimpleState& state,Piece p,Action& action,Position to){
00038 generateMoveNotDir3<Action,Type,CanP,MoveDir>(state,p,action,to,
00039 Int2Type<Dir!=DirectionTraitsGen<MoveDir>::primDir && PtypeDirectionTraits<Type,MoveDir>::hasMove>());
00040 }
00041
00042 template<class Action,Ptype Type,Direction Dir,PromoteType CanP>
00043 static void generateMoveNotDir1(const SimpleState& state,Piece p,Action& action,Position to){
00044 generateMoveNotDir2<Action,Type,Dir,CanP,UL>(state,p,action,to);
00045 generateMoveNotDir2<Action,Type,Dir,CanP,U>(state,p,action,to);
00046 generateMoveNotDir2<Action,Type,Dir,CanP,UR>(state,p,action,to);
00047 generateMoveNotDir2<Action,Type,Dir,CanP,L>(state,p,action,to);
00048 generateMoveNotDir2<Action,Type,Dir,CanP,R>(state,p,action,to);
00049 generateMoveNotDir2<Action,Type,Dir,CanP,DL>(state,p,action,to);
00050 generateMoveNotDir2<Action,Type,Dir,CanP,D>(state,p,action,to);
00051 generateMoveNotDir2<Action,Type,Dir,CanP,DR>(state,p,action,to);
00052 generateMoveNotDir2<Action,Type,Dir,CanP,UUL>(state,p,action,to);
00053 generateMoveNotDir2<Action,Type,Dir,CanP,UUR>(state,p,action,to);
00054 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_UL>(state,p,action,to);
00055 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_U>(state,p,action,to);
00056 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_UR>(state,p,action,to);
00057 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_L>(state,p,action,to);
00058 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_R>(state,p,action,to);
00059 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_DL>(state,p,action,to);
00060 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_D>(state,p,action,to);
00061 generateMoveNotDir2<Action,Type,Dir,CanP,LONG_DR>(state,p,action,to);
00062 }
00063
00064 template<class Action,Ptype Type,Direction Dir>
00065 static void generateMoveNotDirSub(const SimpleState& state,Piece p,Action& action,Position to,Int2Type<true>){
00066 if (p.position().template canPromote<P>())
00067 generateMoveNotDir1<Action,Type,Dir,CanPromoteType>(state,p,action,to);
00068 else{
00069
00070 generateMoveNotDir1<Action,Type,Dir,CheckPromoteType>(state,p,action,to);
00071 }
00072 }
00073
00074 template<class Action,Ptype Type,Direction Dir>
00075 static void generateMoveNotDirSub(const SimpleState& state,Piece p,Action& action,Position to,Int2Type<false>){
00076 generateMoveNotDir1<Action,Type,Dir,NoPromoteType>(state,p,action,to);
00077 }
00078
00079 public:
00080 template<class Action,Ptype Type,Direction Dir>
00081 static void generateMoveNotDir(const SimpleState& state,Piece p,Action& action,Position to);
00082
00083
00088 template<class Action,Direction Dir>
00089 static void generateOpenAttack(const SimpleState& state,Piece p,Action& action,Position to);
00090
00091 template<class Action>
00092 static void generate(const SimpleState& state,Piece p,Action& action,Position to,Direction dir);
00093
00094 };
00095
00096 struct GenerateOpen
00097 {
00098 template<class Action>
00099 static void
00100 generate(Player pl,const SimpleState& state,Piece p,
00101 Action& action,Position to,Direction dir)
00102 {
00103 if (pl == BLACK)
00104 Open<BLACK>::generate(state, p, action, to, dir);
00105 else
00106 Open<WHITE>::generate(state, p, action, to, dir);
00107 }
00108 };
00109
00110 }
00111 }
00112 #endif
00113
00114
00115
00116