diff --git a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx index f0a1dc9100410f2d2eb9a71d0f8efab54b35158e..7ca368763e9afc1d089679b52895fd9552413526 100644 --- a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx +++ b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx @@ -139,13 +139,13 @@ template <typename T> struct GetProxy<itk::ConstNeighborhoodIterator<T> > }; // Will be easier to write in c++17 with std::apply and fold expressions -template <class Tuple, class Oper, size_t...Is> auto CallOperatorImpl(Tuple& t, const Oper & oper,std::index_sequence<Is...>) +template <class Tuple, class Oper, size_t...Is> auto CallOperatorImpl(Tuple& t, Oper & oper,std::index_sequence<Is...>) { return oper(GetProxy<typename std::remove_reference<decltype(std::get<Is>(t))>::type>::Get(std::get<Is>(t))...); } // Will be easier to write in c++17 with std::apply and fold expressions -template <class Oper, typename ... Args> auto CallOperator(const Oper& oper, std::tuple<Args...> & t) +template <class Oper, typename ... Args> auto CallOperator(Oper& oper, std::tuple<Args...> & t) { return CallOperatorImpl(t,oper,std::make_index_sequence<sizeof...(Args)>{}); } diff --git a/Modules/Core/Functor/test/otbFunctorImageFilter.cxx b/Modules/Core/Functor/test/otbFunctorImageFilter.cxx index 44fe64ea55b3c369094cfc7fb1c5f1325a2cb07d..6fb272317960780ca426b42953f15bf54e6c8079 100644 --- a/Modules/Core/Functor/test/otbFunctorImageFilter.cxx +++ b/Modules/Core/Functor/test/otbFunctorImageFilter.cxx @@ -90,6 +90,21 @@ template <typename T> struct TypesCheck } }; + // Fake test operator non const + template <typename TOut,typename TIn> struct TestOperatorNonConst + { + auto operator()(const TIn&) + { + TOut res(OutputSize()); + return res; + } + + constexpr size_t OutputSize(...) const + { + return 1; + } + }; + template <typename TOut, typename TIn> void TestFilter() { @@ -109,16 +124,22 @@ template <typename T> struct TypesCheck // Build and run filter auto functor = TestOperator<TOut,TIn>{}; auto filter = NewFunctorFilter(functor); - + using FilterType = typename decltype(filter)::ObjectType; static_assert(FilterType::NumberOfInputs == 1,""); static_assert(std::is_same<typename FilterType::template InputImageType<0>, InputImageType>::value, ""); - filter->SetVariadicInputs(in); filter->SetInput1(in); filter->template SetVariadicInput<0>(in); // template keyword to avoid C++ parse ambiguity filter->Update(); + // Test with non const operator + auto functorNonConstOperator = TestOperatorNonConst<TOut,TIn>{}; + auto filterWithNonConstOperator = NewFunctorFilter(functorNonConstOperator); + filterWithNonConstOperator->SetInput1(in); + filterWithNonConstOperator->Update(); + + // Test with simple lambda auto lambda = [] (const TIn &) { @@ -128,6 +149,10 @@ template <typename T> struct TypesCheck auto filterWithLambda = NewFunctorFilter(lambda,1, {{0,0}}); filterWithLambda->SetVariadicInputs(in); filterWithLambda->Update(); + + // Test with standard filter use + using FullFilterType = otb::FunctorImageFilter<TestOperator<TOut,TIn>>; + auto filter2 = FullFilterType::New(); } TypesCheck()