X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovepick.h;fp=src%2Fmovepick.h;h=9a9144d21a48bd0d751bd125557c15de523ca5ad;hp=141454a812b5f2f95eff4e7979d1ddd43465b82f;hb=571f54b176b5c30aaac35bc7bbd255c79cdcb926;hpb=fae57273b20468f534cce5843152a21214b5da05 diff --git a/src/movepick.h b/src/movepick.h index 141454a8..9a9144d2 100644 --- a/src/movepick.h +++ b/src/movepick.h @@ -36,18 +36,16 @@ template class StatsEntry { - static const bool IsInt = std::is_integral::value; - typedef typename std::conditional::type TT; - T entry; public: - T* get() { return &entry; } void operator=(const T& v) { entry = v; } - operator TT() const { return entry; } + T* operator&() { return &entry; } + T* operator->() { return &entry; } + operator const T&() const { return entry; } void operator<<(int bonus) { - assert(abs(bonus) <= D); // Ensure range is [-D, D] + assert(abs(bonus) <= D); // Ensure range is [-D, D] static_assert(D <= std::numeric_limits::max(), "D overflows T"); entry += bonus - entry * abs(bonus) / D; @@ -64,18 +62,21 @@ public: template struct Stats : public std::array, Size> { - T* get() { return this->at(0).get(); } + typedef Stats stats; void fill(const T& v) { - T* p = get(); - std::fill(p, p + sizeof(*this) / sizeof(*p), v); + + // For standard-layout 'this' points to first struct member + assert(std::is_standard_layout::value); + + typedef StatsEntry entry; + entry* p = reinterpret_cast(this); + std::fill(p, p + sizeof(*this) / sizeof(entry), v); } }; template -struct Stats : public std::array, Size> { - T* get() { return this->at(0).get(); } -}; +struct Stats : public std::array, Size> {}; /// In stats table, D=0 means that the template parameter is not used enum StatsParams { NOT_USED = 0 };