12#ifndef __Pulsar_get_extension_h
13#define __Pulsar_get_extension_h
19template<
class T,
class Container>
20T* get_ext (Container* container,
const char* method,
bool verbose)
24 const unsigned next = container->get_nextension();
25 for (
unsigned iext=0; iext<next; iext++)
27 auto ext = container->get_extension (iext);
30 std::cerr << method <<
" name="
31 << ext->get_extension_name() << std::endl;
33 extension =
dynamic_cast<T*
>( ext );
40 std::cerr << method <<
" failed to find extension type="
41 <<
typeid(extension).name() << std::endl;
47void clean_dangling (std::vector<T>& data)
49 auto iterator = std::remove(data.begin(), data.end(),
false);
50 data.erase(iterator, data.end());
54template<
typename E,
typename C,
typename B>
55void foreach (C* container,
void (B::*method)())
57 const unsigned next = container->get_nextension ();
59 for (
unsigned iext=0; iext < next; iext++)
61 E* ext =
dynamic_cast<E*
> (container->get_extension (iext));
68template<
typename E,
typename C,
typename M,
typename A>
69void foreach (C* container, M method, A argument)
71 const unsigned next = container->get_nextension ();
73 for (
unsigned iext=0; iext < next; iext++)
75 E* ext =
dynamic_cast<E*
> (container->get_extension (iext));
77 (ext->*method) (argument);
82template<
typename E,
typename C>
83void foreach (C* container,
Functor<
void(E*) >& functor)
85 const unsigned next = container->get_nextension ();
87 for (
unsigned iext=0; iext < next; iext++)
89 E* ext =
dynamic_cast<E*
> (container->get_extension (iext));
96template<
typename E,
typename C>
97void foreach (
const C* container,
Functor<
void(
const E*) >& functor)
99 const unsigned next = container->get_nextension ();
101 for (
unsigned iext=0; iext < next; iext++)
103 const E* ext =
dynamic_cast<const E*
> (container->get_extension (iext));
Implements an adaptable function object in compliance with the STL.
Definition Functor.h:39