GCC Code Coverage Report


Directory: ./
File: include/sot/core/switch.hh
Date: 2025-05-13 12:28:21
Exec Total Coverage
Lines: 0 27 0.0%
Branches: 0 46 0.0%

Line Branch Exec Source
1 // Copyright (c) 2018, Joseph Mirabel
2 // Authors: Joseph Mirabel (joseph.mirabel@laas.fr)
3
4 #ifndef __SOT_SWITCH_H__
5 #define __SOT_SWITCH_H__
6
7 #include <dynamic-graph/command-bind.h>
8 #include <dynamic-graph/command-getter.h>
9 #include <dynamic-graph/entity.h>
10 #include <dynamic-graph/pool.h>
11 #include <dynamic-graph/signal-ptr.h>
12 #include <dynamic-graph/signal-time-dependent.h>
13 #include <dynamic-graph/signal.h>
14
15 #include <sot/core/config.hh>
16 #include <sot/core/variadic-op.hh>
17
18 namespace dynamicgraph {
19 namespace sot {
20 /// Switch
21 template <typename Value, typename Time = int>
22 class SOT_CORE_DLLAPI Switch : public VariadicAbstract<Value, Value, Time> {
23 ✗ DYNAMIC_GRAPH_ENTITY_DECL();
24
25 public:
26 typedef VariadicAbstract<Value, Value, Time> Base;
27
28 ✗ Switch(const std::string &name)
29 : Base(name, CLASS_NAME),
30 ✗ selectionSIN(NULL, "Switch(" + name + ")::input(int)::selection"),
31 ✗ boolSelectionSIN(NULL,
32 ✗ "Switch(" + name + ")::input(bool)::boolSelection") {
33 ✗ this->signalRegistration(selectionSIN << boolSelectionSIN);
34 ✗ this->SOUT.setFunction(boost::bind(&Switch::signal, this, _1, _2));
35 ✗ this->SOUT.addDependency(selectionSIN);
36 ✗ this->SOUT.addDependency(boolSelectionSIN);
37
38 using command::makeCommandVoid1;
39 ✗ std::string docstring =
40 "\n"
41 " Set number of input signals\n";
42 ✗ this->addCommand(
43 "setSignalNumber",
44 ✗ makeCommandVoid1(*(Base *)this, &Base::setSignalNumber, docstring));
45
46 ✗ docstring =
47 "\n"
48 " Get number of input signals\n";
49 ✗ this->addCommand("getSignalNumber",
50 ✗ new command::Getter<Base, int>(
51 *this, &Base::getSignalNumber, docstring));
52 }
53
54 ✗ ~Switch() {}
55
56 /// Header documentation of the python class
57 ✗ virtual std::string getDocString() const {
58 ✗ return "Dynamically select a given signal based on a input information.\n";
59 }
60
61 SignalPtr<int, Time> selectionSIN;
62 SignalPtr<bool, Time> boolSelectionSIN;
63
64 private:
65 ✗ Value &signal(Value &ret, const Time &time) {
66 int sel;
67 ✗ if (selectionSIN.isPlugged()) {
68 ✗ sel = selectionSIN(time);
69 } else {
70 ✗ const bool &b = boolSelectionSIN(time);
71 ✗ sel = b ? 1 : 0;
72 }
73 ✗ if (sel < 0 || sel >= int(this->signalsIN.size()))
74 ✗ throw std::runtime_error("Signal selection is out of range.");
75
76 ✗ ret = this->signalsIN[sel]->access(time);
77 ✗ return ret;
78 }
79 };
80 } // namespace sot
81 } // namespace dynamicgraph
82 #endif // __SOT_SWITCH_H__
83