00001 #ifndef _ADD_EFFECT8_TABLE_H
00002 #define _ADD_EFFECT8_TABLE_H
00003
00004 #include "osl/ptype.h"
00005 #include "osl/offset32.h"
00006 #include "osl/misc/carray.h"
00007 #include "osl/misc/carray2d.h"
00008 #include "osl/misc/carray3d.h"
00009
00010 #include <utility>
00011
00012 namespace osl
00013 {
00014 namespace move_generator
00015 {
00020 typedef std::pair<Offset,Offset> OffsetPair;
00021 typedef std::pair<Position,Offset> PO;
00022 typedef std::pair<Position,OffsetPair> POO;
00023 class AddEffect8Table
00024 {
00025 static const int maxDropPosition=32;
00026 CArray3d<Position,PTYPE_SIZE,Position::SIZE,maxDropPosition> dropPosition;
00027 static const int maxLongDropDirect=8;
00028 CArray3d<Offset,PTYPE_SIZE,Position::SIZE,maxLongDropDirect> longDropDirect;
00029
00030 static const int maxLongDropPosition=32;
00031 CArray3d<PO,PTYPE_SIZE,Position::SIZE,maxLongDropPosition> longDropPosition;
00032 static const int maxLongDrop2Position=8;
00033 CArray3d<POO,PTYPE_SIZE,Position::SIZE,maxLongDrop2Position> longDrop2Position;
00034
00035 static const int maxShortMoveOffset=32;
00036 CArray3d<Offset,PTYPE_SIZE,Offset32::SIZE,maxShortMoveOffset> shortMoveOffset;
00037 static const int maxShortPromoteMoveOffset=32;
00038 CArray3d<Offset,PTYPE_SIZE,Offset32::SIZE,maxShortPromoteMoveOffset> shortPromoteMoveOffset;
00039 static const int maxLongMoveOffset=32;
00040 CArray3d<OffsetPair,PTYPE_SIZE,Offset32::SIZE,maxLongMoveOffset> longMoveOffset;
00041 CArray2d<OffsetPair,PTYPE_SIZE,Offset32::SIZE> betweenOffset;
00042 public:
00043 AddEffect8Table();
00044
00051 Position getDropPosition(Ptype ptype,Position kingPosition,int i) const
00052 {
00053
00054 return dropPosition[ptype](kingPosition.index(),i);
00055 }
00056
00061 Offset getLongDropDirect(Ptype ptype,Position kingPosition,int i) const
00062 {
00063 return longDropDirect[ptype](kingPosition.index(),i);
00064 }
00065
00072 PO getLongDropPosition(Ptype ptype,Position kingPosition,int i) const
00073 {
00074 return longDropPosition[ptype](kingPosition.index(),i);
00075 }
00076
00083 POO getLongDrop2Position(Ptype ptype,Position kingPosition,int i) const
00084 {
00085 return longDrop2Position[ptype](kingPosition.index(),i);
00086 }
00087
00097 Offset getShortMoveOffset(bool isPromote,Ptype ptype,Offset32 o32,int i) const
00098 {
00099 if(!isPromote){
00100 assert(i<maxShortMoveOffset);
00101 return shortMoveOffset[ptype](o32.index(),i);
00102 }
00103 else{
00104 assert(i<maxShortPromoteMoveOffset);
00105 return shortPromoteMoveOffset[ptype](o32.index(),i);
00106 }
00107 }
00116 OffsetPair getLongMoveOffset(Ptype ptype,Offset32 o32,int i) const
00117 {
00118 assert(i<maxLongMoveOffset);
00119 return longMoveOffset[ptype](o32.index(),i);
00120 }
00127 OffsetPair getBetweenOffset(Ptype ptype,Offset32 o32) const
00128 {
00129 return betweenOffset[ptype][o32.index()];
00130 }
00131 private:
00132 void initDropPosition();
00133 void initLongDropPosition();
00134 void initMoveOffset();
00135 };
00136 extern const AddEffect8Table Add_Effect8_Table;
00137
00138 }
00139 }
00140 #endif
00141
00142
00143
00144