variadic-op.hh
Go to the documentation of this file.
1 /*
2  * Copyright 2018,
3  * Mirabel Joseph
4  *
5  * CNRS/AIST
6  *
7  */
8 
9 #ifndef SOT_CORE_VARIADICOP_HH
10 #define SOT_CORE_VARIADICOP_HH
11 
12 /* --------------------------------------------------------------------- */
13 /* --- INCLUDE --------------------------------------------------------- */
14 /* --------------------------------------------------------------------- */
15 
16 /* Matrix */
18 
19 /* SOT */
21 #include <dynamic-graph/entity.h>
22 
23 #include <sot/core/flags.hh>
25 #include <sot/core/pool.hh>
26 
27 /* STD */
28 #include <boost/function.hpp>
29 #include <string>
30 
31 namespace dynamicgraph {
32 namespace sot {
33 
34 /* --------------------------------------------------------------------- */
35 /* --- CLASS ----------------------------------------------------------- */
36 /* --------------------------------------------------------------------- */
37 
38 template <typename Tin, typename Tout, typename Time>
39 class VariadicAbstract : public Entity {
40  public: /* --- CONSTRUCTION --- */
41  static std::string getTypeInName(void);
42  static std::string getTypeOutName(void);
43 
44  VariadicAbstract(const std::string &name, const std::string &className)
45  : Entity(name),
46  SOUT(className + "(" + name + ")::output(" + getTypeOutName() +
47  ")::sout"),
48  baseSigname(className + "(" + name + ")::input(" + getTypeInName() +
49  ")::") {
51  }
52 
53  virtual ~VariadicAbstract(void) {
54  for (std::size_t i = 0; i < signalsIN.size(); ++i) {
56  }
57  };
58 
59  public: /* --- SIGNAL --- */
62 
63  std::size_t addSignal() {
64  std::ostringstream oss;
65  oss << "sin" << signalsIN.size();
66  return addSignal(oss.str());
67  }
68 
69  std::size_t addSignal(const std::string &name) {
70  signal_t *sig = new signal_t(NULL, baseSigname + name);
71  try {
72  _declareSignal(sig);
73  signalsIN.push_back(sig);
74  // names.push_back (name);
75  return signalsIN.size() - 1;
76  } catch (const ExceptionAbstract &) {
77  delete sig;
78  throw;
79  }
80  }
81 
82  void removeSignal() {
83  assert(signalsIN.size() > 0);
84  _removeSignal(signalsIN.size() - 1);
85  // names.pop_back();
86  signalsIN.pop_back();
87  }
88 
89  void setSignalNumber(const int &n) {
90  assert(n >= 0);
91  const std::size_t oldSize = signalsIN.size();
92  for (std::size_t i = n; i < oldSize; ++i) _removeSignal(i);
93  signalsIN.resize(n, NULL);
94  // names.resize(n);
95 
96  for (std::size_t i = oldSize; i < (std::size_t)n; ++i) {
97  assert(signalsIN[i] == NULL);
98  std::ostringstream oss;
99  oss << baseSigname << "sin" << i;
100  // names[i] = oss.str();
101  // signal_t* s = new signal_t (NULL,names[i]);
102  signal_t *s = new signal_t(NULL, oss.str());
103  signalsIN[i] = s;
104  _declareSignal(s);
105  }
107  }
108 
109  int getSignalNumber() const { return (int)signalsIN.size(); }
110 
111  signal_t *getSignalIn(int i) {
112  if (i < 0 || i >= (int)signalsIN.size())
113  throw std::out_of_range("Wrong signal index");
114  return signalsIN[i];
115  }
116 
117  protected:
118  std::vector<signal_t *> signalsIN;
119  // Use signal->shortName instead
120  // std::vector< std::string > names;
121 
122  virtual void updateSignalNumber(int n) { (void)n; };
123 
124  private:
125  void _removeSignal(const std::size_t i) {
126  // signalDeregistration(names[i]);
127  signalDeregistration(signalsIN[i]->shortName());
128  SOUT.removeDependency(*signalsIN[i]);
129  delete signalsIN[i];
130  }
131  void _declareSignal(signal_t *s) {
132  signalRegistration(*s);
133  SOUT.addDependency(*s);
134  }
135  const std::string baseSigname;
136 };
137 
138 template <typename Operator>
139 class VariadicOp : public VariadicAbstract<typename Operator::Tin,
140  typename Operator::Tout, int> {
141  typedef typename Operator::Tin Tin;
142  typedef typename Operator::Tout Tout;
144 
145  public: /* --- CONSTRUCTION --- */
146  Operator op;
147 
149 
150  // static std::string getTypeInName ( void ) { return Operator::nameTypeIn ();
151  // } static std::string getTypeOutName( void ) { return
152  // Operator::nameTypeOut(); }
153  static const std::string CLASS_NAME;
154  virtual const std::string &getClassName() const { return CLASS_NAME; }
155  std::string getDocString() const { return op.getDocString(); }
156 
157  VariadicOp(const std::string &name) : Base(name, CLASS_NAME) {
158  this->SOUT.setFunction(boost::bind(&Self::computeOperation, this, _1, _2));
159  op.initialize(this, this->commandMap);
160  }
161 
162  virtual ~VariadicOp(void){};
163 
164  protected:
165  Tout &computeOperation(Tout &res, int time) {
166  std::vector<const Tin *> in(this->signalsIN.size());
167  for (std::size_t i = 0; i < this->signalsIN.size(); ++i) {
168  const Tin &x = this->signalsIN[i]->access(time);
169  in[i] = &x;
170  }
171  op(in, res);
172  return res;
173  }
174 
175  inline void updateSignalNumber(int n) { op.updateSignalNumber(n); }
176 };
177 } // namespace sot
178 } // namespace dynamicgraph
179 
180 #endif // #ifndef SOT_CORE_VARIADICOP_HH
void _removeSignal(const std::size_t i)
Definition: variadic-op.hh:125
void setSignalNumber(const int &n)
Definition: variadic-op.hh:89
s
Vec3f n
VariadicAbstract< Tin, Tout, int > Base
Definition: variadic-op.hh:148
int i
void signalRegistration(const SignalArray< int > &signals)
std::vector< signal_t * > signalsIN
Definition: variadic-op.hh:118
Signal< dynamicgraph::Matrix, int > sig("matrix")
VariadicOp(const std::string &name)
Definition: variadic-op.hh:157
VariadicOp< Operator > Self
Definition: variadic-op.hh:143
Tout & computeOperation(Tout &res, int time)
Definition: variadic-op.hh:165
CommandMap_t commandMap
VariadicAbstract(const std::string &name, const std::string &className)
Definition: variadic-op.hh:44
SignalPtr< Tin, int > signal_t
Definition: variadic-op.hh:57
x
static std::string getTypeOutName(void)
Definition: operator.hh:826
virtual void removeDependency(const SignalBase< Time > &signal)
virtual void addDependency(const SignalBase< Time > &signal)
SignalTimeDependent< Tout, int > SOUT
Definition: variadic-op.hh:61
std::string getDocString() const
Definition: variadic-op.hh:155
std::size_t addSignal(const std::string &name)
Definition: variadic-op.hh:69
virtual void updateSignalNumber(int n)
Definition: variadic-op.hh:122
void signalDeregistration(const std::string &name)
virtual void setFunction(boost::function2< T &, T &, Time > t, Mutex *mutexref=NULL)
static const std::string CLASS_NAME
Definition: variadic-op.hh:153
static std::string getTypeInName(void)
Definition: operator.hh:822
virtual const std::string & getClassName() const
Definition: variadic-op.hh:154


sot-core
Author(s): Olivier Stasse, ostasse@laas.fr
autogenerated on Wed Jun 21 2023 02:51:26