GCC Code Coverage Report


Directory: ./
File: include/sot/core/variadic-op.hh
Date: 2025-05-13 12:28:21
Exec Total Coverage
Lines: 0 65 0.0%
Branches: 0 116 0.0%

Line Branch Exec Source
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 */
17 #include <dynamic-graph/linear-algebra.h>
18
19 /* SOT */
20 #include <dynamic-graph/all-signals.h>
21 #include <dynamic-graph/entity.h>
22
23 #include <sot/core/flags.hh>
24 #include <sot/core/matrix-geometry.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 ✗ ")::") {
50 ✗ signalRegistration(SOUT);
51 }
52
53 ✗ virtual ~VariadicAbstract(void) {
54 ✗ for (std::size_t i = 0; i < signalsIN.size(); ++i) {
55 ✗ _removeSignal(i);
56 }
57 ✗ };
58
59 public: /* --- SIGNAL --- */
60 typedef SignalPtr<Tin, int> signal_t;
61 SignalTimeDependent<Tout, int> SOUT;
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 }
106 ✗ updateSignalNumber(n);
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;
143 typedef VariadicOp<Operator> Self;
144
145 public: /* --- CONSTRUCTION --- */
146 Operator op;
147
148 typedef VariadicAbstract<Tin, Tout, int> Base;
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
181