+ static const Value Max = Value(1 << 28);
+
+ const T* operator[](Piece pc) const { return table[pc]; }
+ T* operator[](Piece pc) { return table[pc]; }
+ void clear() { std::memset(table, 0, sizeof(table)); }
+
+ void update(Piece pc, Square to, Move m) {
+
+ if (m != table[pc][to])
+ table[pc][to] = m;
+ }
+
+ void update(Piece pc, Square to, Value v) {
+
+ if (abs(int(v)) >= 324)
+ return;
+
+ table[pc][to] -= table[pc][to] * abs(int(v)) / (CM ? 512 : 324);
+ table[pc][to] += int(v) * (CM ? 64 : 32);
+ }
+
+private:
+ T table[PIECE_NB][SQUARE_NB];
+};
+
+typedef Stats<Move> MovesStats;
+typedef Stats<Value, false> HistoryStats;
+typedef Stats<Value, true> CounterMovesStats;
+typedef Stats<CounterMovesStats> CounterMovesHistoryStats;