My Project
numSimpleEffect.cc
Go to the documentation of this file.
1/* numSimpleEffect.cc
2 */
4#if (defined(__i386__) || defined(__x86_64__)) && !defined(OSL_NO_SSE)
5#include <emmintrin.h>
6typedef __v2di v2di;
7#endif
8#include <iostream>
9
12{
13 std::fill(effects.begin(), effects.end(),NumBitmapEffect());
14 for(int num=0;num<40;num++){
15 if (state.isOnBoard(num)){
16 Piece p=state.pieceOf(num);
17 doEffect<NumBitmapEffect::Add,true>(state,p);
18 }
19 }
20}
21
24{
25 this->effected_mask = src.effected_mask;
26 this->mobilityTable = src.mobilityTable;
27 this->changed_effects = src.changed_effects;
28 this->changed_effect_pieces = src.changed_effect_pieces;
29 this->effected_changed_mask = src.effected_changed_mask;
30
31#if (defined(__i386__) || defined(__x86_64__)) && !defined(OSL_NO_SSE)
32 {
33 v2di en0=*((v2di*)&src.effectedNumTable[0]);
34 v2di en2=*((v2di*)&src.effectedNumTable[2]);
35 v2di en4=*((v2di*)&src.effectedNumTable[4]);
36 v2di en6=*((v2di*)&src.effectedNumTable[6]);
37 v2di en8=*((v2di*)&src.effectedNumTable[8]);
38 v2di en10=*((v2di*)&src.effectedNumTable[10]);
39 v2di en12=*((v2di*)&src.effectedNumTable[12]);
40 v2di en14=*((v2di*)&src.effectedNumTable[14]);
41 v2di en16=*((v2di*)&src.effectedNumTable[16]);
42 v2di en18=*((v2di*)&src.effectedNumTable[18]);
43
44 *((v2di*)&(*this).effectedNumTable[0])=en0;
45 *((v2di*)&(*this).effectedNumTable[2])=en2;
46 *((v2di*)&(*this).effectedNumTable[4])=en4;
47 *((v2di*)&(*this).effectedNumTable[6])=en6;
48 *((v2di*)&(*this).effectedNumTable[8])=en8;
49 *((v2di*)&(*this).effectedNumTable[10])=en10;
50 *((v2di*)&(*this).effectedNumTable[12])=en12;
51 *((v2di*)&(*this).effectedNumTable[14])=en14;
52 *((v2di*)&(*this).effectedNumTable[16])=en16;
53 *((v2di*)&(*this).effectedNumTable[18])=en18;
54
55 v2di en20=*((v2di*)&src.effectedNumTable[20]);
56 v2di en22=*((v2di*)&src.effectedNumTable[22]);
57 v2di en24=*((v2di*)&src.effectedNumTable[24]);
58 v2di en26=*((v2di*)&src.effectedNumTable[26]);
59 v2di en28=*((v2di*)&src.effectedNumTable[28]);
60 v2di en30=*((v2di*)&src.effectedNumTable[30]);
61 v2di en32=*((v2di*)&src.effectedNumTable[32]);
62 v2di en34=*((v2di*)&src.effectedNumTable[34]);
63 v2di en36=*((v2di*)&src.effectedNumTable[36]);
64 v2di en38=*((v2di*)&src.effectedNumTable[38]);
65
66 *((v2di*)&(*this).effectedNumTable[20])=en20;
67 *((v2di*)&(*this).effectedNumTable[22])=en22;
68 *((v2di*)&(*this).effectedNumTable[24])=en24;
69 *((v2di*)&(*this).effectedNumTable[26])=en26;
70 *((v2di*)&(*this).effectedNumTable[28])=en28;
71 *((v2di*)&(*this).effectedNumTable[30])=en30;
72 *((v2di*)&(*this).effectedNumTable[32])=en32;
73 *((v2di*)&(*this).effectedNumTable[34])=en34;
74 *((v2di*)&(*this).effectedNumTable[36])=en36;
75 *((v2di*)&(*this).effectedNumTable[38])=en38;
76 }
77#else
78 for(int i=0;i<40;i++)
79 (*this).effectedNumTable[i]=src.effectedNumTable[i];
80#endif
81
82#if (defined(__i386__) || defined(__x86_64__)) && !defined(OSL_NO_SSE)
83 {
84 v2di e18=*((v2di*)&src.effects[18]);
85 v2di e20=*((v2di*)&src.effects[20]);
86 v2di e22=*((v2di*)&src.effects[22]);
87 v2di e24=*((v2di*)&src.effects[24]);
88 v2di e26=*((v2di*)&src.effects[26]);
89
90 v2di e34=*((v2di*)&src.effects[34]);
91 v2di e36=*((v2di*)&src.effects[36]);
92 v2di e38=*((v2di*)&src.effects[38]);
93 v2di e40=*((v2di*)&src.effects[40]);
94 v2di e42=*((v2di*)&src.effects[42]);
95
96 *((v2di*)&(*this).effects[18])=e18;
97 *((v2di*)&(*this).effects[20])=e20;
98 *((v2di*)&(*this).effects[22])=e22;
99 *((v2di*)&(*this).effects[24])=e24;
100 *((v2di*)&(*this).effects[26])=e26;
101
102 *((v2di*)&(*this).effects[34])=e34;
103 *((v2di*)&(*this).effects[36])=e36;
104 *((v2di*)&(*this).effects[38])=e38;
105 *((v2di*)&(*this).effects[40])=e40;
106 *((v2di*)&(*this).effects[42])=e42;
107
108 v2di e50=*((v2di*)&src.effects[50]);
109 v2di e52=*((v2di*)&src.effects[52]);
110 v2di e54=*((v2di*)&src.effects[54]);
111 v2di e56=*((v2di*)&src.effects[56]);
112 v2di e58=*((v2di*)&src.effects[58]);
113
114 v2di e66=*((v2di*)&src.effects[66]);
115 v2di e68=*((v2di*)&src.effects[68]);
116 v2di e70=*((v2di*)&src.effects[70]);
117 v2di e72=*((v2di*)&src.effects[72]);
118 v2di e74=*((v2di*)&src.effects[74]);
119
120 *((v2di*)&(*this).effects[50])=e50;
121 *((v2di*)&(*this).effects[52])=e52;
122 *((v2di*)&(*this).effects[54])=e54;
123 *((v2di*)&(*this).effects[56])=e56;
124 *((v2di*)&(*this).effects[58])=e58;
125
126 *((v2di*)&(*this).effects[66])=e66;
127 *((v2di*)&(*this).effects[68])=e68;
128 *((v2di*)&(*this).effects[70])=e70;
129 *((v2di*)&(*this).effects[72])=e72;
130 *((v2di*)&(*this).effects[74])=e74;
131
132 v2di e82=*((v2di*)&src.effects[82]);
133 v2di e84=*((v2di*)&src.effects[84]);
134 v2di e86=*((v2di*)&src.effects[86]);
135 v2di e88=*((v2di*)&src.effects[88]);
136 v2di e90=*((v2di*)&src.effects[90]);
137
138 v2di e98=*((v2di*)&src.effects[98]);
139 v2di e100=*((v2di*)&src.effects[100]);
140 v2di e102=*((v2di*)&src.effects[102]);
141 v2di e104=*((v2di*)&src.effects[104]);
142 v2di e106=*((v2di*)&src.effects[106]);
143
144 *((v2di*)&(*this).effects[82])=e82;
145 *((v2di*)&(*this).effects[84])=e84;
146 *((v2di*)&(*this).effects[86])=e86;
147 *((v2di*)&(*this).effects[88])=e88;
148 *((v2di*)&(*this).effects[90])=e90;
149
150 *((v2di*)&(*this).effects[98])=e98;
151 *((v2di*)&(*this).effects[100])=e100;
152 *((v2di*)&(*this).effects[102])=e102;
153 *((v2di*)&(*this).effects[104])=e104;
154 *((v2di*)&(*this).effects[106])=e106;
155
156 v2di e114=*((v2di*)&src.effects[114]);
157 v2di e116=*((v2di*)&src.effects[116]);
158 v2di e118=*((v2di*)&src.effects[118]);
159 v2di e120=*((v2di*)&src.effects[120]);
160 v2di e122=*((v2di*)&src.effects[122]);
161
162 v2di e130=*((v2di*)&src.effects[130]);
163 v2di e132=*((v2di*)&src.effects[132]);
164 v2di e134=*((v2di*)&src.effects[134]);
165 v2di e136=*((v2di*)&src.effects[136]);
166 v2di e138=*((v2di*)&src.effects[138]);
167
168 *((v2di*)&(*this).effects[114])=e114;
169 *((v2di*)&(*this).effects[116])=e116;
170 *((v2di*)&(*this).effects[118])=e118;
171 *((v2di*)&(*this).effects[120])=e120;
172 *((v2di*)&(*this).effects[122])=e122;
173
174 *((v2di*)&(*this).effects[130])=e130;
175 *((v2di*)&(*this).effects[132])=e132;
176 *((v2di*)&(*this).effects[134])=e134;
177 *((v2di*)&(*this).effects[136])=e136;
178 *((v2di*)&(*this).effects[138])=e138;
179
180 v2di e146=*((v2di*)&src.effects[146]);
181 v2di e148=*((v2di*)&src.effects[148]);
182 v2di e150=*((v2di*)&src.effects[150]);
183 v2di e152=*((v2di*)&src.effects[152]);
184 v2di e154=*((v2di*)&src.effects[154]);
185
186 *((v2di*)&(*this).effects[146])=e146;
187 *((v2di*)&(*this).effects[148])=e148;
188 *((v2di*)&(*this).effects[150])=e150;
189 *((v2di*)&(*this).effects[152])=e152;
190 *((v2di*)&(*this).effects[154])=e154;
191 }
192#else
193 for(int x=1;x<=9;x++)
194 for(int y=1;y<=9;y++)
195 this->effects[Square(x,y).index()]=src.effects[Square(x,y).index()];
196#endif
197}
198
200{
201 for(int y=1;y<=9;y++)
202 for(int x=9;x>0;x--){
203 Square pos(x,y);
204 if (!(et1.effectSetAt(pos)==et2.effectSetAt(pos))) return false;
205 }
206 if (! (et1.effected_mask == et2.effected_mask))
207 return false;
208 if(!(et1.mobilityTable==et2.mobilityTable)) return false;
209 if(!(et1.effectedNumTable==et2.effectedNumTable)) return false;
210 // intentionally ignore history dependent members: changed_effects, changed_effect_pieces, effected_changed_mask
211 return true;
212}
213
214#ifndef MINIMAL
215std::ostream& osl::effect::operator<<(std::ostream& os,const NumSimpleEffectTable& effectTable)
216{
217 os << "Effect" << std::endl;
218 for(int y=1;y<=9;y++){
219 for(int x=9;x>0;x--){
220 Square pos(x,y);
221 os << effectTable.effectSetAt(pos) << " ";
222 }
223 os << std::endl;
224 }
225 os << "Effect" << std::endl;
226 for(int y=1;y<=9;y++){
227 for(int x=9;x>0;x--){
228 Square pos(x,y);
229 os << effectTable.effectSetAt(pos) << " ";
230 }
231 os << std::endl;
232 }
233 return os;
234}
235#endif
236// ;;; Local Variables:
237// ;;; mode:c++
238// ;;; c-basic-offset:2
239// ;;; End:
bool isOnBoard(int num) const
const Piece pieceOf(int num) const
Definition simpleState.h:76
unsigned int index() const
Definition basic_type.h:572
現在の定義 (2005/3/4以降)
局面全体の利きデータ.
void copyFrom(const NumSimpleEffectTable &src)
主要部分を高速にコピーする.
EffectedNumTable effectedNumTable
effected num
const NumBitmapEffect effectSetAt(Square pos) const
ある位置の利きデータを取り出す.
void init(const SimpleState &state)
盤面のデータを元に初期化する.
CArray< NumBitmapEffect, Square::SIZE > effects
mobility::MobilityTable mobilityTable
mobility
CArray< PieceMask, 2 > effected_mask
CArray< BoardMask, 2 > changed_effects
CArray< PieceMask, 2 > effected_changed_mask
NumBitmapEffect changed_effect_pieces
set of pieces whose effect changed by previous move
std::ostream & operator<<(std::ostream &, const EffectedNumTable &)
bool operator==(const EffectedNumTable &, const EffectedNumTable &)