28
28
#include < dynamic-graph/command-getter.h>
29
29
30
30
#include < sot/core/config.hh>
31
+ #include < sot/core/variadic-op.hh>
31
32
32
33
namespace dynamicgraph {
33
34
namespace sot {
34
35
// / Switch
35
36
template <typename Value, typename Time = int >
36
- class SOT_CORE_DLLAPI Switch : public dynamicgraph::Entity
37
+ class SOT_CORE_DLLAPI Switch : public VariadicAbstract<Value,Value,Time>
37
38
{
38
39
DYNAMIC_GRAPH_ENTITY_DECL ();
39
40
41
+ typedef VariadicAbstract<Value,Value,Time> Base;
42
+
40
43
Switch (const std::string& name) :
41
- Entity (name),
44
+ Base (name,CLASS_NAME ),
42
45
selectionSIN (NULL ," Switch(" +name+" )::input(int)::selection" ),
43
- boolSelectionSIN (NULL ," Switch(" +name+" )::input(bool)::boolSelection" ),
44
- signalSOUT (" Switch(" +name+" )::output(" + typeName() + " )::sout" )
46
+ boolSelectionSIN (NULL ," Switch(" +name+" )::input(bool)::boolSelection" )
45
47
{
46
- signalSOUT.setFunction (boost::bind (&Switch::signal, this , _1, _2));
47
- signalRegistration (selectionSIN << boolSelectionSIN << signalSOUT);
48
+ this ->signalRegistration (selectionSIN << boolSelectionSIN);
49
+ this ->SOUT .setFunction (boost::bind (&Switch::signal,this ,_1,_2));
50
+ this ->SOUT .addDependency (selectionSIN);
51
+ this ->SOUT .addDependency (boolSelectionSIN);
48
52
49
53
using command::makeCommandVoid1;
50
54
std::string docstring =
51
55
" \n "
52
56
" Set number of input signals\n " ;
53
- addCommand (" setSignalNumber" , makeCommandVoid1
54
- (*this , &Switch ::setSignalNumber, docstring));
57
+ this -> addCommand (" setSignalNumber" , makeCommandVoid1
58
+ (*(Base*) this , &Base ::setSignalNumber, docstring));
55
59
56
60
docstring =
57
61
" \n "
58
62
" Get number of input signals\n " ;
59
- addCommand (" getSignalNumber" ,
60
- new command::Getter<Switch , int > (*this , &Switch ::getSignalNumber, docstring));
63
+ this -> addCommand (" getSignalNumber" ,
64
+ new command::Getter<Base , int > (*this , &Base ::getSignalNumber, docstring));
61
65
}
62
66
63
67
~Switch () {}
@@ -69,39 +73,7 @@ namespace dynamicgraph {
69
73
" Dynamically select a given signal based on a input information.\n " ;
70
74
}
71
75
72
- void setSignalNumber (const int & n)
73
- {
74
- assert (n>=0 );
75
- const std::size_t oldSize = signals.size ();
76
- for (std::size_t i = n; i < oldSize; ++i)
77
- {
78
- std::ostringstream oss; oss << " sin" << i;
79
- signalDeregistration (oss.str ());
80
- delete signals[i];
81
- }
82
- signals.resize (n,NULL );
83
-
84
- for (std::size_t i = oldSize; i < (std::size_t )n; ++i)
85
- {
86
- assert (signals[i]==NULL );
87
- std::ostringstream oss;
88
- oss << " Switch(" << getName ()<< " )::input(" << typeName () << " )::sin" << i;
89
- signals[i] = new Signal_t (NULL ,oss.str ());
90
- signalRegistration (*signals[i]);
91
- }
92
- }
93
-
94
- int getSignalNumber () const
95
- {
96
- return (int )signals.size ();
97
- }
98
-
99
76
private:
100
- typedef SignalPtr<Value, Time> Signal_t;
101
- typedef std::vector<Signal_t*> Signals_t;
102
-
103
- static const std::string& typeName ();
104
-
105
77
Value& signal (Value& ret, const Time& time)
106
78
{
107
79
int sel;
@@ -111,18 +83,15 @@ namespace dynamicgraph {
111
83
const bool & b = boolSelectionSIN (time);
112
84
sel = b ? 1 : 0 ;
113
85
}
114
- if (sel < 0 || sel >= int (signals .size ()))
86
+ if (sel < 0 || sel >= int (this -> signalsIN .size ()))
115
87
throw std::runtime_error (" Signal selection is out of range." );
116
88
117
- ret = (*signals [sel]) (time);
89
+ ret = this -> signalsIN [sel]-> access (time);
118
90
return ret;
119
91
}
120
92
121
- Signals_t signals;
122
93
SignalPtr <int , Time> selectionSIN;
123
94
SignalPtr <bool , Time> boolSelectionSIN;
124
-
125
- Signal <Value, Time> signalSOUT;
126
95
};
127
96
} // namespace sot
128
97
} // namespace dynamicgraph
0 commit comments