00001
00002
00003 #ifndef _MOVE_CLASSIFIER_MOVE_ADAPTOR_H
00004 #define _MOVE_CLASSIFIER_MOVE_ADAPTOR_H
00005
00006 #include "osl/move.h"
00007 #include "osl/position.h"
00008 #include "osl/ptype.h"
00009 #include "osl/move_classifier/classifierTraits.h"
00010 namespace osl
00011 {
00012 namespace move_classifier
00013 {
00014 template <class Classifier>
00015 struct MoveAdaptor
00016 {
00017 template <class State>
00018 static bool isMember(const State& state, Move m)
00019 {
00020 return Classifier::isMember(state, m.ptype(), m.from(), m.to());
00021 }
00022 };
00023
00024 template <template <Player> class Classifier>
00025 struct PlayerMoveAdaptor
00026 {
00027 template <class State>
00028 static bool isMember(const State& state, Move m)
00029 {
00030 assert(m.player() == state.getTurn());
00031 if (state.getTurn() == BLACK)
00032 return Classifier<BLACK>::isMember(state, m.ptype(), m.from(), m.to());
00033 else
00034 return Classifier<WHITE>::isMember(state, m.ptype(), m.from(), m.to());
00035 }
00036 };
00037
00039 template <template <Player> class Classifier>
00040 struct ConditionAdaptor
00041 {
00042 template <class State>
00043 static bool isMember(const State& state, Move m)
00044 {
00045 if (! ClassifierTraits<Classifier<BLACK> >::drop_suitable
00046 && m.isDrop())
00047 return ClassifierTraits<Classifier<BLACK> >::result_if_drop;
00048 return PlayerMoveAdaptor<Classifier>::isMember(state, m);
00049 }
00050 };
00051 }
00052 }
00053
00054 #endif
00055
00056
00057
00058