HOPS
HOPS class reference
MHO_FunctorBroadcaster.hh
Go to the documentation of this file.
1 #ifndef MHO_FunctorBroadcaster_HH__
2 #define MHO_FunctorBroadcaster_HH__
3 
4 #include <algorithm>
5 
6 #include "MHO_Message.hh"
7 #include "MHO_NDArrayWrapper.hh"
8 #include "MHO_UnaryOperator.hh"
9 
10 namespace hops
11 {
12 
24 template< class XArrayType, class XFunctorType > class MHO_FunctorBroadcaster: public MHO_UnaryOperator< XArrayType >
25 {
26  public:
27  MHO_FunctorBroadcaster() { fInitialized = false; }
28 
30 
31  //access for configuration
37  XFunctorType* GetFunctor() { return &fFunctor; };
38 
39  protected:
47  virtual bool InitializeInPlace(XArrayType* in) override
48  {
49  if(in != nullptr)
50  {
51  fInitialized = true;
52  }
53  return fInitialized;
54  }
55 
63  virtual bool ExecuteInPlace(XArrayType* in) override
64  {
65  if(fInitialized)
66  {
67  //same array so only increment a single iter
68  auto in_iter = in->begin();
69  auto in_iter_end = in->end();
70  while(in_iter != in_iter_end)
71  {
72  fFunctor(in_iter);
73  ++in_iter;
74  }
75  fInitialized = true;
76  }
77  return fInitialized;
78  }
79 
88  virtual bool InitializeOutOfPlace(const XArrayType* in, XArrayType* out) override
89  {
90  if(in != nullptr && out != nullptr)
91  {
92  //only need to change output size if in != out and size is different
93  if(in != out)
94  {
95  std::size_t in_dim[XArrayType::rank::value];
96  std::size_t out_dim[XArrayType::rank::value];
97  in->GetDimensions(in_dim);
98  out->GetDimensions(out_dim);
99 
100  bool have_to_resize = false;
101  for(std::size_t i = 0; i < XArrayType::rank::value; i++)
102  {
103  if(out_dim[i] != in_dim[i])
104  {
105  have_to_resize = true;
106  break;
107  }
108  }
109 
110  if(have_to_resize)
111  {
112  out->Resize(in_dim);
113  }
114  }
115  fInitialized = true;
116  }
117  return fInitialized;
118  }
119 
128  virtual bool ExecuteOutOfPlace(const XArrayType* in, XArrayType* out) override
129  {
130  //note: this implicitly assumes both intput/output are the same total size
131  if(fInitialized)
132  {
133  auto in_iter = in->cbegin();
134  auto in_iter_end = in->cend();
135  auto out_iter = out->begin();
136  auto out_iter_end = out->end();
137  while(in_iter != in_iter_end && out_iter != out_iter_end)
138  {
139  fFunctor(in_iter, out_iter);
140  ++out_iter;
141  ++in_iter;
142  }
143  return true;
144  }
145  return false;
146  }
147 
148  private:
149  bool fInitialized;
150  XFunctorType fFunctor; //expected to inherit from MHO_UnaryFunctor<XArrayType>
151 };
152 
153 } // namespace hops
154 
155 #endif
Class MHO_FunctorBroadcaster.
Definition: MHO_FunctorBroadcaster.hh:25
virtual bool InitializeOutOfPlace(const XArrayType *in, XArrayType *out) override
Function InitializeOutOfPlace - initialization for out-of-place transformation.
Definition: MHO_FunctorBroadcaster.hh:88
virtual ~MHO_FunctorBroadcaster()
Definition: MHO_FunctorBroadcaster.hh:29
XFunctorType * GetFunctor()
Getter for functor class object.
Definition: MHO_FunctorBroadcaster.hh:37
virtual bool ExecuteOutOfPlace(const XArrayType *in, XArrayType *out) override
Executes an out-of-place operation using a functor and input/output iterators.
Definition: MHO_FunctorBroadcaster.hh:128
MHO_FunctorBroadcaster()
Definition: MHO_FunctorBroadcaster.hh:27
virtual bool ExecuteInPlace(XArrayType *in) override
Applies functor to input array in-place if initialized.
Definition: MHO_FunctorBroadcaster.hh:63
virtual bool InitializeInPlace(XArrayType *in) override
Initializes in-place operation flag if input is not nullptr.
Definition: MHO_FunctorBroadcaster.hh:47
Class MHO_UnaryOperator.
Definition: MHO_UnaryOperator.hh:24
Definition: MHO_ChannelLabeler.hh:17