+#include "thread_win32.h"
+
+
+/// Thread struct keeps together all the thread-related stuff. We also use
+/// per-thread pawn and material hash tables so that once we get a pointer to an
+/// entry its life time is unlimited and we don't have to care about someone
+/// changing the entry under our feet.
+
+class Thread {
+
+ std::thread nativeThread;
+ Mutex mutex;
+ ConditionVariable sleepCondition;
+ bool exit, searching;
+
+public:
+ Thread();
+ virtual ~Thread();
+ virtual void search();
+ void idle_loop();
+ void start_searching(bool resume = false);
+ void wait_for_search_finished();
+ void wait(std::atomic_bool& condition);
+
+ Pawns::Table pawnsTable;
+ Material::Table materialTable;
+ Endgames endgames;
+ size_t idx, PVIdx;
+ int maxPly, callsCnt;
+ uint64_t tbHits;
+
+ Position rootPos;
+ Search::RootMoves rootMoves;
+ Depth rootDepth;
+ Depth completedDepth;
+ std::atomic_bool resetCalls;
+ MoveStats counterMoves;
+ HistoryStats history;
+ CounterMoveHistoryStats counterMoveHistory;
+};
+
+
+/// MainThread is a derived class with a specific overload for the main thread