GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/sot/core/switch.hh Lines: 0 25 0.0 %
Date: 2023-03-13 12:09:37 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__