extutil.h
1//-*-C++-*-
2
3/***************************************************************************
4 *
5 * Copyright (C) 2008 by Willem van Straten
6 * Licensed under the Academic Free License version 2.1
7 *
8 ***************************************************************************/
9
10// psrchive/Util/genutil/extutil.h
11
12#ifndef __Pulsar_get_extension_h
13#define __Pulsar_get_extension_h
14
15#include "Functor.h"
16#include <algorithm>
17
19template<class T, class Container>
20T* get_ext (Container* container, const char* method, bool verbose)
21{
22 T* extension = 0;
23
24 const unsigned next = container->get_nextension();
25 for (unsigned iext=0; iext<next; iext++)
26 {
27 auto ext = container->get_extension (iext);
28
29 if (verbose)
30 std::cerr << method << " name="
31 << ext->get_extension_name() << std::endl;
32
33 extension = dynamic_cast<T*>( ext );
34
35 if (extension)
36 return extension;
37 }
38
39 if (verbose)
40 std::cerr << method << " failed to find extension type="
41 << typeid(extension).name() << std::endl;
42
43 return extension;
44}
45
46template<class T>
47void clean_dangling (std::vector<T>& data)
48{
49 auto iterator = std::remove(data.begin(), data.end(), false);
50 data.erase(iterator, data.end());
51}
52
54template<typename E, typename C, typename B>
55void foreach (C* container, void (B::*method)())
56{
57 const unsigned next = container->get_nextension ();
58
59 for (unsigned iext=0; iext < next; iext++)
60 {
61 E* ext = dynamic_cast<E*> (container->get_extension (iext));
62 if (ext)
63 (ext->*method) ();
64 }
65}
66
68template<typename E, typename C, typename M, typename A>
69void foreach (C* container, M method, A argument)
70{
71 const unsigned next = container->get_nextension ();
72
73 for (unsigned iext=0; iext < next; iext++)
74 {
75 E* ext = dynamic_cast<E*> (container->get_extension (iext));
76 if (ext)
77 (ext->*method) (argument);
78 }
79}
80
82template<typename E, typename C>
83void foreach (C* container, Functor< void(E*) >& functor)
84{
85 const unsigned next = container->get_nextension ();
86
87 for (unsigned iext=0; iext < next; iext++)
88 {
89 E* ext = dynamic_cast<E*> (container->get_extension (iext));
90 if (ext)
91 functor (ext);
92 }
93}
94
96template<typename E, typename C>
97void foreach (const C* container, Functor< void(const E*) >& functor)
98{
99 const unsigned next = container->get_nextension ();
100
101 for (unsigned iext=0; iext < next; iext++)
102 {
103 const E* ext = dynamic_cast<const E*> (container->get_extension (iext));
104 if (ext)
105 functor (ext);
106 }
107}
108
109
110#endif
111
Implements an adaptable function object in compliance with the STL.
Definition Functor.h:39

Generated using doxygen 1.14.0