//
// Created by Ben Bergkamp on 1/31/18.
//

#ifndef EECS398_SEARCH_THREADCLASS_H
#define EECS398_SEARCH_THREADCLASS_H
#include <pthread.h>

class ThreadClass
{
public:
    ThreadClass() { };
    virtual ~ThreadClass() { };

    //Returns true if thread was created successfully
    bool StartThread()
        {
        return (pthread_create(&thread, NULL, StaticFuncToRun, this) == 0);
        }

    //Blocks until thread finishes
    void WaitForFinish()
        {
        pthread_join(thread, NULL);
        }

   void Die()
       {
       pthread_cancel(thread);
       }

protected:
    //IMPLEMENT THIS METHOD IN YOUR SUB CLASS WITH CODE YOU WANT YOUR THREAD TO RUN
    virtual void run() = 0;

private:
    static void * StaticFuncToRun(void * This) { ((ThreadClass *)This)->run(); return nullptr;}
    pthread_t thread;
};



#endif //EECS398_SEARCH_THREADCLASS_H