GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: tests/signal/test_depend.cpp Lines: 66 66 100.0 %
Date: 2023-03-13 12:09:37 Branches: 102 200 51.0 %

Line Branch Exec Source
1
/*
2
 * Copyright 2010,
3
 * François Bleibel,
4
 * Olivier Stasse,
5
 *
6
 * CNRS/AIST
7
 *
8
 */
9
10
/* -------------------------------------------------------------------------- */
11
/* --- INCLUDES ------------------------------------------------------------- */
12
/* -------------------------------------------------------------------------- */
13
#include <dynamic-graph/all-signals.h>
14
#include <dynamic-graph/linear-algebra.h>
15
16
#include <iostream>
17
#include <sot/core/debug.hh>
18
19
using namespace std;
20
using namespace dynamicgraph;
21
22
template <class Res = double>
23
class DummyClass {
24
 public:
25
  std::string proname;
26
  list<SignalTimeDependent<double, int> *> inputsig;
27
  list<SignalTimeDependent<dynamicgraph::Vector, int> *> inputsigV;
28
29
 public:
30
12
  DummyClass(const std::string &n) : proname(n), res(), appel(0), timedata(0) {}
31
32
26
  Res &fun(Res &res, int t) {
33
26
    appel++;
34
26
    timedata = t;
35
36
26
    cout << "Inside " << proname << " -> " << this << endl;
37
12
    for (list<SignalTimeDependent<double, int> *>::iterator it =
38
26
             inputsig.begin();
39
50
         it != inputsig.end(); ++it) {
40

12
      cout << *(*it) << endl;
41
12
      (*it)->access(timedata);
42
    }
43
28
    for (list<SignalTimeDependent<dynamicgraph::Vector, int> *>::iterator it =
44
26
             inputsigV.begin();
45
82
         it != inputsigV.end(); ++it) {
46

28
      cout << *(*it) << endl;
47
28
      (*it)->access(timedata);
48
    }
49
50
26
    return res = (*this)();
51
  }
52
53
6
  void add(SignalTimeDependent<double, int> &sig) { inputsig.push_back(&sig); }
54
7
  void add(SignalTimeDependent<dynamicgraph::Vector, int> &sig) {
55
14
    inputsigV.push_back(&sig);
56
14
  }
57
58
  Res operator()(void);
59
60
  Res res;
61
  int appel;
62
  int timedata;
63
};
64
65
template <class Res>
66
Res DummyClass<Res>::operator()(void) {
67
  return this->res;
68
}
69
70
template <>
71
8
double DummyClass<double>::operator()(void) {
72
8
  res = appel * timedata;
73
8
  return res;
74
}
75
template <>
76
5
dynamicgraph::Vector DummyClass<dynamicgraph::Vector>::operator()(void) {
77
5
  res.resize(3);
78
5
  res.fill(appel * timedata);
79
5
  return res;
80
}
81
82
1
int main(void) {
83



5
  DummyClass<double> pro1("pro1"), pro3("pro3"), pro5("pro5");
84



5
  DummyClass<dynamicgraph::Vector> pro2("pro2"), pro4("pro4"), pro6("pro6");
85
86

3
  SignalTimeDependent<double, int> sig5("Sig5");
87

3
  SignalTimeDependent<dynamicgraph::Vector, int> sig6("Sig6");
88
89

3
  SignalTimeDependent<dynamicgraph::Vector, int> sig4(sig5, "Sig4");
90
  SignalTimeDependent<dynamicgraph::Vector, int> sig2(
91


3
      sig4 << sig4 << sig4 << sig6, "Sig2");
92


3
  SignalTimeDependent<double, int> sig3(sig2 << sig5 << sig6, "Sig3");
93
  SignalTimeDependent<double, int> sig1(
94
2
      boost::bind(&DummyClass<double>::fun, &pro1, _1, _2), sig2 << sig3,
95


4
      "Sig1");
96
97
  //    cout << "--- Test Array ------ "<<endl;
98
  //    SignalArray<int> tarr(12);
99
  //    tarr<<sig3<<sig2;//+sig2+sig3;
100
  //    dispArray(sig4<<sig2<<sig3);
101
  //    dispArray(tarr);
102
103

1
  sig2.setFunction(
104
      boost::bind(&DummyClass<dynamicgraph::Vector>::fun, &pro2, _1, _2));
105

1
  sig3.setFunction(boost::bind(&DummyClass<double>::fun, &pro3, _1, _2));
106

1
  sig4.setFunction(
107
      boost::bind(&DummyClass<dynamicgraph::Vector>::fun, &pro4, _1, _2));
108

1
  sig5.setFunction(boost::bind(&DummyClass<double>::fun, &pro5, _1, _2));
109

1
  sig6.setFunction(
110
      boost::bind(&DummyClass<dynamicgraph::Vector>::fun, &pro6, _1, _2));
111
112
1
  pro1.add(sig2);
113
1
  pro1.add(sig3);
114
1
  pro2.add(sig4);
115
1
  pro2.add(sig4);
116
1
  pro2.add(sig4);
117
1
  pro3.add(sig2);
118
1
  pro4.add(sig5);
119
1
  pro2.add(sig6);
120
1
  pro3.add(sig5);
121
1
  pro3.add(sig6);
122
123
1
  sig5.setDependencyType(TimeDependency<int>::ALWAYS_READY);
124
1
  sig6.setDependencyType(TimeDependency<int>::BOOL_DEPENDENT);
125
126
1
  sig6.setReady();
127
128


1
  sig1.displayDependencies(cout) << endl;
129
130


1
  cout << "Needs update?" << endl << sig1.needUpdate(2) << endl;
131
  dgDEBUG(1) << "Access sig1(2) " << endl;
132
1
  sig1.access(2);
133


1
  sig1.displayDependencies(cout) << endl;
134
  dgDEBUG(1) << "Access sig2(4) " << endl;
135
1
  sig2.access(4);
136


1
  sig1.displayDependencies(cout) << endl;
137
  dgDEBUG(1) << "Access sig1(4) " << endl;
138
1
  sig1.access(4);
139


1
  sig1.displayDependencies(cout) << endl;
140
141
1
  sig1.needUpdate(6);
142
1
  sig1.needUpdate(6);
143
144
1
  return 0;
145
}