#ifndef __PLUGIN_NAME__IMAGEFILTER_H__
#define __PLUGIN_NAME__IMAGEFILTER_H__

#include <itkImageToImageFilter.h>

/**	@class		__PLUGIN_NAME__ImageFilter
 *	@author		RITKPluginCreator
 *	@brief	
 *
 *	@details
 *	Created by the RITKPluginCreator. This filter will simply copy the input to the output via an itk::ImageRegionIterator in
 *	a multithreaded manner.
 */
template<class TInput, class TOutput=TInput>
class __PLUGIN_NAME__ImageFilter : public itk::ImageToImageFilter<TInput,TOutput>
{
public:
	/** @name	Typedefs */
	//@{

	/** @name	Standard typedefs */
	//@{
	typedef __PLUGIN_NAME__ImageFilter					Self;
	typedef itk::ImageToImageFilter<TInput,TOutput>		Superclass;
	typedef itk::SmartPointer<Self>						Pointer;
	typedef itk::SmartPointer<const Self>				ConstPointer;
	//@}

	/**	@name	Input and output typedefs */
	//@{
	typedef typename Superclass::InputImageType		InputImageType;
	typedef typename InputImageType::Pointer		InputImagePointer;
	typedef typename InputImageType::ConstPointer	InputImageConstPointer;
	typedef typename Superclass::OutputImageType	OutputImageType;
	typedef typename OutputImageType::Pointer		OutputImagePointer;
	//@}

	//@}

	/// Object creation
	itkNewMacro(Self);

	/// RTTI
	itkTypeMacro(Self, Superclass);

protected:
	/// Constructor
	__PLUGIN_NAME__ImageFilter();
	/// Destructor
	~__PLUGIN_NAME__ImageFilter();

	/// Single threaded data generation
	// void GenerateData();

	/** @name  Threaded data generation */
	//@{
	virtual void BeforeThreadedGenerateData();
	virtual void ThreadedGenerateData(const OutputImageRegionType& OutputRegionForThread,int threadId);
	virtual void AfterThreadedGenerateData();
	//@}

protected:
	itk::SimpleFastMutexLock m_Mutex;

private:
	/// purposely not implemented
	__PLUGIN_NAME__ImageFilter(Self&); 
	/// purposely not implemented
	void operator=(const Self&);
};

// #include "__PLUGIN_NAME__ImageFilter.txx"
typedef class __declspec(dllexport) __PLUGIN_NAME__ImageFilter<itk::Image<float,2>> __PLUGIN_NAME__ImageFilterF2;


#endif // __PLUGIN_NAME__IMAGEFILTER_H__