-private:
- void score_captures();
- void score_noncaptures();
- void score_evasions();
- void score_qcaptures();
- Move pick_move_from_list();
-
- const Position& pos;
- Move ttMove, mateKiller, killer1, killer2;
- Bitboard pinned, dc;
- MoveStack moves[256], badCaptures[64];
- bool pvNode;
- Depth depth;
- int phaseIndex;
- int numOfMoves, numOfBadCaptures;
- int movesPicked, badCapturesPicked;
- bool finished;
+ assert(abs(bonus) <= D); // Ensure range is [-W * D, W * D]
+ assert(W * D < std::numeric_limits<T>::max()); // Ensure we don't overflow
+
+ entry += bonus * W - entry * abs(bonus) / D;
+
+ assert(abs(entry) <= W * D);
+ }
+};
+
+/// Stats is a generic N-dimensional array used to store various statistics.
+/// The first template T parameter is the base type of the array, the W parameter
+/// is the weight applied to the bonuses when we update values with the << operator,
+/// the D parameter limits the range of updates (range is [-W * D, W * D]), and
+/// the last parameters (Size and Sizes) encode the dimensions of the array.
+template <typename T, int W, int D, int Size, int... Sizes>
+struct Stats : public std::array<Stats<T, W, D, Sizes...>, Size>
+{
+ T* get() { return this->at(0).get(); }
+
+ void fill(const T& v) {
+ T* p = get();
+ std::fill(p, p + sizeof(*this) / sizeof(*p), v);
+ }
+};
+
+template <typename T, int W, int D, int Size>
+struct Stats<T, W, D, Size> : public std::array<StatsEntry<T, W, D>, Size> {
+ T* get() { return this->at(0).get(); }