Commit d9aa111b authored by Julien Michel's avatar Julien Michel

MRG

parents 4987d73d f34b7ce3
...@@ -293,21 +293,24 @@ public: ...@@ -293,21 +293,24 @@ public:
/** Run-time type information (and related methods). */ /** Run-time type information (and related methods). */
itkTypeMacro(FunctorImageFilter, ImageToImageFilter); itkTypeMacro(FunctorImageFilter, ImageToImageFilter);
/** Get the functor object.
/** Get the functor object. The functor is returned by reference. *
* (Functors do not have to derive from itk::LightObject, so they do * \return A non-const reference to the Functor in use. Note that
* not necessarily have a reference count. So we cannot return a * this call will call the Modified() function of the filter, which
* SmartPointer.) */ * will trigger a full output computation upon Update(). For
FunctorType& GetFunctor() * inspection only, prefer using GetFunctor()
*/
FunctorType& GetModifiableFunctor()
{ {
this->Modified(); this->Modified();
return m_Functor; return m_Functor;
} }
/** Get the functor object. The functor is returned by reference. /** Get the functor object.
* (Functors do not have to derive from itk::LightObject, so they do *
* not necessarily have a reference count. So we cannot return a * \return A const reference to the Functor in use. For a
* SmartPointer.) */ * modifiable version of the functor, see GetModifiableFunctor().
*/
const FunctorType& GetFunctor() const const FunctorType& GetFunctor() const
{ {
return m_Functor; return m_Functor;
......
...@@ -190,13 +190,13 @@ template<class C, class Out, class ... In> struct OperProxy<void(C::*)(Out&, In. ...@@ -190,13 +190,13 @@ template<class C, class Out, class ... In> struct OperProxy<void(C::*)(Out&, In.
// Will be easier to write in c++17 with std::apply and fold expressions // Will be easier to write in c++17 with std::apply and fold expressions
template <class Tuple, class Out, class Oper, size_t...Is> auto CallOperatorImpl(Tuple& t, Out & out, const Oper & oper,std::index_sequence<Is...>) template <class Tuple, class Out, class Oper, size_t...Is> auto CallOperatorImpl(Tuple& t, Out & out, Oper & oper,std::index_sequence<Is...>)
{ {
OperProxy<Oper>::Compute(oper,out,GetProxy<typename std::remove_reference<decltype(std::get<Is>(t))>::type>::Get(std::get<Is>(t))...); OperProxy<Oper>::Compute(oper,out,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 // Will be easier to write in c++17 with std::apply and fold expressions
template <class Out, class Oper, typename ... Args> auto CallOperator(Out & out, const Oper& oper, std::tuple<Args...> & t) template <class Out, class Oper, typename ... Args> auto CallOperator(Out & out, Oper& oper, std::tuple<Args...> & t)
{ {
CallOperatorImpl(t,out,oper,std::make_index_sequence<sizeof...(Args)>{}); CallOperatorImpl(t,out,oper,std::make_index_sequence<sizeof...(Args)>{});
} }
......
...@@ -103,6 +103,21 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn ...@@ -103,6 +103,21 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn
} }
}; };
// 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() template <typename TOut, typename TIn> void TestFilter()
{ {
...@@ -122,11 +137,10 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn ...@@ -122,11 +137,10 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn
// Build and run filter // Build and run filter
auto functor = TestOperator<TOut,TIn>{}; auto functor = TestOperator<TOut,TIn>{};
auto filter = NewFunctorFilter(functor); auto filter = NewFunctorFilter(functor);
using FilterType = typename decltype(filter)::ObjectType; using FilterType = typename decltype(filter)::ObjectType;
static_assert(FilterType::NumberOfInputs == 1,""); static_assert(FilterType::NumberOfInputs == 1,"");
static_assert(std::is_same<typename FilterType::template InputImageType<0>, InputImageType>::value, ""); static_assert(std::is_same<typename FilterType::template InputImageType<0>, InputImageType>::value, "");
filter->SetVariadicInputs(in); filter->SetVariadicInputs(in);
filter->SetInput1(in); filter->SetInput1(in);
filter->template SetVariadicInput<0>(in); // template keyword to avoid C++ parse ambiguity filter->template SetVariadicInput<0>(in); // template keyword to avoid C++ parse ambiguity
...@@ -139,6 +153,12 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn ...@@ -139,6 +153,12 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn
using FilterWithVoidReturnType = typename decltype(filter)::ObjectType; using FilterWithVoidReturnType = typename decltype(filter)::ObjectType;
static_assert(FilterWithVoidReturnType::NumberOfInputs == 1,""); static_assert(FilterWithVoidReturnType::NumberOfInputs == 1,"");
static_assert(std::is_same<typename FilterWithVoidReturnType::template InputImageType<0>, InputImageType>::value, ""); static_assert(std::is_same<typename FilterWithVoidReturnType::template InputImageType<0>, InputImageType>::value, "");
// Test with non const operator
auto functorNonConstOperator = TestOperatorNonConst<TOut,TIn>{};
auto filterWithNonConstOperator = NewFunctorFilter(functorNonConstOperator);
filterWithNonConstOperator->SetInput1(in);
filterWithNonConstOperator->Update();
filterWithVoidReturn->SetVariadicInputs(in); filterWithVoidReturn->SetVariadicInputs(in);
filterWithVoidReturn->SetInput1(in); filterWithVoidReturn->SetInput1(in);
...@@ -154,6 +174,10 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn ...@@ -154,6 +174,10 @@ template <typename TOut,typename TIn> struct TestOperatorVoidReturn
auto filterWithLambda = NewFunctorFilter(lambda,1, {{0,0}}); auto filterWithLambda = NewFunctorFilter(lambda,1, {{0,0}});
filterWithLambda->SetVariadicInputs(in); filterWithLambda->SetVariadicInputs(in);
filterWithLambda->Update(); filterWithLambda->Update();
// Test with standard filter use
using FullFilterType = otb::FunctorImageFilter<TestOperator<TOut,TIn>>;
auto filter2 = FullFilterType::New();
} }
TypesCheck() TypesCheck()
......
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