/*=========================================================================

  Copyright Brigham and Women's Hospital (BWH) All Rights Reserved.

  See COPYRIGHT.txt
  or http://www.slicer.org/copyright/copyright.txt for details.

  Program:   vtkITK
  Module:    $HeadURL$
  Date:      $Date$
  Version:   $Revision$

==========================================================================*/

#ifndef __vtkITKGradientAnisotropicDiffusionImageFilter_h
#define __vtkITKGradientAnisotropicDiffusionImageFilter_h

#include "vtkITKImageToImageFilterFF.h"
#include "itkGradientAnisotropicDiffusionImageFilter.h"

/// \brief Wrapper class around itk::GradientAnisotropicDiffusionImageFilterImageFilter.
///
/// vtkITKGradientAnisotropicDiffusionImageFilter
class VTK_ITK_EXPORT vtkITKGradientAnisotropicDiffusionImageFilter : public vtkITKImageToImageFilterFF
{
public:
  static vtkITKGradientAnisotropicDiffusionImageFilter* New();
  vtkTypeMacro(vtkITKGradientAnisotropicDiffusionImageFilter, vtkITKImageToImageFilterFF);

  double GetTimeStep() { DelegateITKOutputMacro(GetTimeStep); };

  double GetConductanceParameter() { DelegateITKOutputMacro(GetConductanceParameter); };

  unsigned int GetNumberOfIterations() { DelegateITKOutputMacro(GetNumberOfIterations); };

  void SetNumberOfIterations(unsigned int value) { DelegateITKInputMacro(SetNumberOfIterations, value); };

  void SetTimeStep(double value) { DelegateITKInputMacro(SetTimeStep, value); };

  void SetConductanceParameter(double value) { DelegateITKInputMacro(SetConductanceParameter, value); };

protected:
  typedef itk::GradientAnisotropicDiffusionImageFilter<Superclass::InputImageType, Superclass::InputImageType> ImageFilterType;
  vtkITKGradientAnisotropicDiffusionImageFilter()
    : Superclass(ImageFilterType::New()) {};
  ~vtkITKGradientAnisotropicDiffusionImageFilter() override = default;
  ImageFilterType* GetImageFilterPointer() { return dynamic_cast<ImageFilterType*>(m_Filter.GetPointer()); }

private:
  vtkITKGradientAnisotropicDiffusionImageFilter(const vtkITKGradientAnisotropicDiffusionImageFilter&) = delete;
  void operator=(const vtkITKGradientAnisotropicDiffusionImageFilter&) = delete;
};

#endif
