Commit 8a214792 authored by Julien Michel's avatar Julien Michel

DOC: Enhance documentation

parent f5f6bcf0
...@@ -110,46 +110,6 @@ template <class T> struct ImageTypeDeduction<const T &> ...@@ -110,46 +110,6 @@ template <class T> struct ImageTypeDeduction<const T &>
using ImageType = typename ImageTypeDeduction<T>::ImageType; using ImageType = typename ImageTypeDeduction<T>::ImageType;
}; };
/**
* \struct InputImageTraits
* \brief Struct allowing to derive input image types from operator()
* arguments
*
* Defines:
* - PixelType type to the underlying pixel type
* - ScalarType type to the underlying scalar type
* - ImageType type to the mocked up image type
*
* ImageType = Image<T> for T or itk::Neighborhood<T>
* ImageType = VectorImage<T> for itk::VariableLengthVector<T> or itk::Neighborhood<itk::VariableLengthVector<T>>
*/
template<typename T>
struct InputImageTraits
{
using ArgumentType = T;
using PixelType = typename PixelTypeDeduction<T>::PixelType;
using ImageType = typename ImageTypeDeduction<PixelType>::ImageType;
};
/**
* \struct OutputImageTraits
* \brief Struct allowing to derive output image type from operator()
*
* Defines:
* - ScalarType type to the underlying scalar type
* - ImageType type to the mocked up image type
* - ImageType = Image<T> for T
* - ImageType = VectorImage<T> for itk::VariableLengthVector<T>
*/
template<typename T>
struct OutputImageTraits
{
using ResultType = T;
using ImageType = typename ImageTypeDeduction<T>::ImageType;
};
/** /**
* \struct FunctorFilterSuperclassHelper * \struct FunctorFilterSuperclassHelper
* \brief Struct allowing to derive the superclass prototype for the * \brief Struct allowing to derive the superclass prototype for the
...@@ -167,24 +127,24 @@ template <typename T> struct FunctorFilterSuperclassHelper : public FunctorFilte ...@@ -167,24 +127,24 @@ template <typename T> struct FunctorFilterSuperclassHelper : public FunctorFilte
/// Partial specialisation for R(*)(T...) /// Partial specialisation for R(*)(T...)
template <typename R, typename... T> struct FunctorFilterSuperclassHelper<R(*)(T...)> template <typename R, typename... T> struct FunctorFilterSuperclassHelper<R(*)(T...)>
{ {
using OutputImageType = typename OutputImageTraits<R>::ImageType; using OutputImageType = typename ImageTypeDeduction<R>::ImageType;
using FilterType = VariadicInputsImageFilter<OutputImageType,typename InputImageTraits<T>::ImageType...>; using FilterType = VariadicInputsImageFilter<OutputImageType,typename ImageTypeDeduction<typename PixelTypeDeduction<T>::PixelType>::ImageType...>;
using InputHasNeighborhood = std::tuple<typename IsNeighborhood<T>::ValueType...>; using InputHasNeighborhood = std::tuple<typename IsNeighborhood<T>::ValueType...>;
}; };
// Partial specialisation for R(C::*)(T...) const // Partial specialisation for R(C::*)(T...) const
template <typename C, typename R, typename... T> struct FunctorFilterSuperclassHelper<R(C::*)(T...) const> template <typename C, typename R, typename... T> struct FunctorFilterSuperclassHelper<R(C::*)(T...) const>
{ {
using OutputImageType = typename OutputImageTraits<R>::ImageType; using OutputImageType = typename ImageTypeDeduction<R>::ImageType;
using FilterType = VariadicInputsImageFilter<OutputImageType,typename InputImageTraits<T>::ImageType...>; using FilterType = VariadicInputsImageFilter<OutputImageType,typename ImageTypeDeduction<typename PixelTypeDeduction<T>::PixelType>::ImageType...>;
using InputHasNeighborhood = std::tuple<typename IsNeighborhood<T>::ValueType...>; using InputHasNeighborhood = std::tuple<typename IsNeighborhood<T>::ValueType...>;
}; };
// Partial specialisation for R(C::*)(T...) // Partial specialisation for R(C::*)(T...)
template <typename C, typename R, typename... T> struct FunctorFilterSuperclassHelper<R(C::*)(T...)> template <typename C, typename R, typename... T> struct FunctorFilterSuperclassHelper<R(C::*)(T...)>
{ {
using OutputImageType = typename OutputImageTraits<R>::ImageType; using OutputImageType = typename ImageTypeDeduction<R>::ImageType;
using FilterType = VariadicInputsImageFilter<OutputImageType,typename InputImageTraits<T>::ImageType...>; using FilterType = VariadicInputsImageFilter<OutputImageType,typename ImageTypeDeduction<typename PixelTypeDeduction<T>::PixelType>::ImageType...>;
using InputHasNeighborhood = std::tuple<typename IsNeighborhood<T>::ValueType...>; using InputHasNeighborhood = std::tuple<typename IsNeighborhood<T>::ValueType...>;
}; };
...@@ -217,10 +177,11 @@ template <typename Functor> auto NewFunctorFilter(const Functor& f, itk::Size<2> ...@@ -217,10 +177,11 @@ template <typename Functor> auto NewFunctorFilter(const Functor& f, itk::Size<2>
/** \class FunctorImageFilter /** \class FunctorImageFilter
* \brief TODO * \brief A generic functor filter templated by its functor
* *
* \sa VariadicInputsImageFilter
* \sa NewFunctorFilter
* *
*
* \ingroup IntensityImageFilters Multithreaded Streamed * \ingroup IntensityImageFilters Multithreaded Streamed
* *
* \ingroup OTBImageManipulation * \ingroup OTBImageManipulation
...@@ -231,17 +192,21 @@ template <class TFunction> ...@@ -231,17 +192,21 @@ template <class TFunction>
{ {
public: public:
// Standard typedefs
using Self = FunctorImageFilter; using Self = FunctorImageFilter;
using FunctorType = TFunction; using FunctorType = TFunction;
using Pointer = itk::SmartPointer<Self>; using Pointer = itk::SmartPointer<Self>;
using ConstPointer = itk::SmartPointer<const Self>; using ConstPointer = itk::SmartPointer<const Self>;
// Superclass through the helper struct
using Superclass = typename FunctorFilterSuperclassHelper<TFunction>::FilterType; using Superclass = typename FunctorFilterSuperclassHelper<TFunction>::FilterType;
using OutputImageType = typename Superclass::OutputImageType; using OutputImageType = typename Superclass::OutputImageType;
using OutputImageRegionType = typename OutputImageType::RegionType; using OutputImageRegionType = typename OutputImageType::RegionType;
using ProcessObjectType = itk::ProcessObject; using ProcessObjectType = itk::ProcessObject;
// A tuple of bool of the same size as the number of arguments in
// the functor
using InputHasNeighborhood = typename FunctorFilterSuperclassHelper<TFunction>::InputHasNeighborhood; using InputHasNeighborhood = typename FunctorFilterSuperclassHelper<TFunction>::InputHasNeighborhood;
/** Run-time type information (and related methods). */ /** Run-time type information (and related methods). */
...@@ -286,7 +251,7 @@ private: ...@@ -286,7 +251,7 @@ private:
void GenerateInputRequestedRegion(void) override; void GenerateInputRequestedRegion(void) override;
/** /**
* Will use the OutputSize() method if * Will use the OutputSize() method of the functor if output is VectorImage
*/ */
void GenerateOutputInformation() override; void GenerateOutputInformation() override;
...@@ -298,6 +263,7 @@ private: ...@@ -298,6 +263,7 @@ private:
itk::Size<2> m_Radius; itk::Size<2> m_Radius;
}; };
// Actual implementation of NewFunctorFilter free function
template <typename Functor> auto NewFunctorFilter(const Functor& f, itk::Size<2> radius) template <typename Functor> auto NewFunctorFilter(const Functor& f, itk::Size<2> radius)
{ {
using FilterType = FunctorImageFilter<Functor>; using FilterType = FunctorImageFilter<Functor>;
...@@ -308,22 +274,52 @@ template <typename Functor> auto NewFunctorFilter(const Functor& f, itk::Size<2> ...@@ -308,22 +274,52 @@ template <typename Functor> auto NewFunctorFilter(const Functor& f, itk::Size<2>
return p; return p;
} }
/**
* \struct NumberOfOutputBandsDecorator
* \brief This struct allows to forward the operator of template
* parameter, while adding number of ouptut components service.
*
* Its purpose is to enable the use of lambda or functor witht
* Outputsize() method with FunctorImageFilter.
*
* It is used internally in NewFunctorFilter version with
* numberOfOutputBands parameter.
*/
template <typename F> struct NumberOfOutputBandsDecorator : F template <typename F> struct NumberOfOutputBandsDecorator : F
{ {
public: public:
constexpr NumberOfOutputBandsDecorator(const F t, unsigned int nbComp) : F(t), m_NumberOfOutputComponents(nbComp) {} constexpr NumberOfOutputBandsDecorator(const F t, unsigned int nbComp) : F(t), m_NumberOfOutputBands(nbComp) {}
using F::operator(); using F::operator();
constexpr size_t OutputSize(...) const constexpr size_t OutputSize(...) const
{ {
return m_NumberOfOutputComponents; return m_NumberOfOutputBands;
} }
private: private:
unsigned int m_NumberOfOutputComponents; unsigned int m_NumberOfOutputBands;
}; };
/**
* brief This helper method builds a fully functional
* FunctorImageFilter from a functor instance which does not provide
* the OutputSize() service, or a lambda, returing a VariableLengthVector
*
* \param f the Functor to build the filter from
* \param numberOfOutputBands The number of output bands that
* this filter will return
* \param radius The size of neighborhood to use, if there is any
* itk::Neighborhood<T> in the operator() arguments.
* \return A ready to use OTB filter, which accepts n input image of
* type derived from the operator() arguments, and producing an image
* correpsonding to the operator() return type.
*
* Note that this function also works with a lambda as Functor,
* provided it returns a scalar type. If your lambda returns a
* VariableLengthVector, see the other NewFunctorFilter implementation.
*/
template <typename Functor> auto NewFunctorFilter(const Functor& f, unsigned int numberOfOutputBands, itk::Size<2> radius) template <typename Functor> auto NewFunctorFilter(const Functor& f, unsigned int numberOfOutputBands, itk::Size<2> radius)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment