/***************************************************************************
*   Original Author: Daniel Muller (dan at verliba dot cz) 2003-05        *
*                                                                         *
*   Copyright (C) 2006-2009 by Verlihub Project                           *
*   devs at verlihub-project dot org                                      *
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
*   This program is distributed in the hope that it will be useful,       *
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
*   GNU General Public License for more details.                          *
*                                                                         *
*   You should have received a copy of the GNU General Public License     *
*   along with this program; if not, write to the                         *
*   Free Software Foundation, Inc.,                                       *
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
***************************************************************************/

#ifndef NTHREADSCTHREADWORK_H
#define NTHREADSCTHREADWORK_H

namespace nThreads
{

/**
a definition of work what a WorkerThread should do..
a base class
@author Daniel Muller
*/

class cThreadWork
{
public:
	cThreadWork();
	virtual ~cThreadWork();
	/**
	 * \brief Thread will call this without parameters
	 * \return 0 on success, otherwise error code
	 **/
	virtual int DoTheWork()=0;
};

template<class ClassType, class Typ1, class Typ2, class Typ3> class tThreadWork3T : public cThreadWork
{
public :
	typedef int (ClassType::*tT3Callback)(Typ1, Typ2, Typ3);
	tThreadWork3T(Typ1 const &par1, Typ2 const & par2, Typ3 const & par3, ClassType *object, tT3Callback cb) : mCB(cb), mObject(object), mPar1(par1), mPar2(par2), mPar3(par3)
	{
	}

	virtual int DoTheWork()
	{
		return (mObject->*mCB)(mPar1, mPar2, mPar3);
	}
protected:
	tT3Callback mCB;
	ClassType * mObject;
	Typ1 mPar1;
	Typ2 mPar2;
	Typ3 mPar3;
};
};


#endif
