25 #ifndef mia_internal_filter_chain_hh
26 #define mia_internal_filter_chain_hh
39 template <
typename Handler>
42 typedef typename Handler::ProductPtr PFilter;
46 typedef typename PFilter::element_type::plugin_data::Pointer
PData;
81 void init(
const char *filters[],
int nfilters);
82 std::vector<PFilter> m_chain;
90 template <
typename Handler>
91 typename Handler::ProductPtr __get_filter(
const Handler& ,
typename Handler::ProductPtr
filter)
96 template <
typename Handler>
97 typename Handler::ProductPtr __get_filter(
const Handler& h,
const char *
filter)
102 template <
typename Handler>
103 typename Handler::ProductPtr __get_filter(
const Handler& h,
const std::string&
filter)
108 template <
typename PData,
typename Handler,
typename T>
109 PData __run_filters(PData image,
const Handler& h, T filter_descr)
111 auto f = __get_filter(h, filter_descr);
112 return f->filter(image);
115 template <
typename PData,
typename Handler,
typename T,
typename... Filters>
116 PData __run_filters(PData image,
const Handler& h, T filter_descr, Filters ...filters)
118 image = __run_filters(image, h, filter_descr);
119 return __run_filters(image, h, filters...);
134 template <
typename PData,
typename... Filters>
137 typedef std::shared_ptr<TDataFilter<typename PData::element_type>> PFilter;
138 typedef typename FactoryTrait<PFilter>::type Handler;
139 return __run_filters(image, Handler::instance(), filters...);
142 template <
typename Handler>
145 for (
int i = 0; i < nfilters; ++i) {
146 m_chain[i] = Handler::instance().produce(filters[i]);
149 throw create_exception<std::invalid_argument>(
"Can't create filter from '", filters[i],
"'");
155 template <
typename Handler>
159 init(filters, nfilters);
162 template <
typename Handler>
164 m_chain(filters.size())
166 std::transform(filters.begin(), filters.end(), m_chain.begin(),
167 [](
const std::string & s) {
168 return Handler::instance().produce(s);
172 template <
typename Handler>
175 auto f = Handler::instance().produce(
filter);
178 m_chain.insert(m_chain.begin(), f);
180 throw create_exception<std::invalid_argument>(
"Can't create filter from '",
filter,
"'");
183 template <
typename Handler>
186 auto f = Handler::instance().produce(
filter);
189 m_chain.push_back(f);
191 throw create_exception<std::invalid_argument>(
"Can't create filter from '",
filter,
"'");
194 template <
typename Handler>
198 for (
auto i = m_chain.begin(); i != m_chain.end(); ++i) {
199 input = (*i)->filter(input);
205 template <
typename Handler>
208 return m_chain.empty();