Skip to content

Commit 2fb56de

Browse files
author
Olivier Stasse
authored
Merge pull request #17 from andreadelprete/master
Fix bug in signal-array (max number of signals was 20)
2 parents 53e3345 + a3e983b commit 2fb56de

File tree

1 file changed

+42
-58
lines changed

1 file changed

+42
-58
lines changed

include/dynamic-graph/signal-array.h

Lines changed: 42 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@
1919
# define DYNAMIC_GRAPH_SIGNAL_ARRAY_H
2020
# include <dynamic-graph/signal-base.h>
2121
# include <dynamic-graph/dynamic-graph-api.h>
22+
# include <vector>
23+
#include <stdio.h>
2224

2325
namespace dynamicgraph
2426
{
27+
2528
/// \ingroup dgraph
2629
///
2730
/// \brief TODO
@@ -32,64 +35,54 @@ namespace dynamicgraph
3235
static const int DEFAULT_SIZE = 20;
3336

3437
protected:
35-
const SignalBase<Time> ** const_array;
38+
std::vector< const SignalBase<Time>* > const_array;
3639
unsigned int size,rank;
3740

3841
public:
3942
SignalArray_const<Time> (const unsigned int& sizeARG = DEFAULT_SIZE)
40-
: const_array (NULL),
43+
: const_array (sizeARG),
4144
size (sizeARG),
4245
rank (0)
43-
{
44-
createArray ();
45-
}
46+
{}
4647

4748
SignalArray_const<Time> (const SignalBase<Time>& sig)
48-
: const_array (NULL),
49-
size (1),
49+
: const_array (DEFAULT_SIZE),
50+
size (DEFAULT_SIZE),
5051
rank (0)
5152
{
52-
createArray ();
5353
addElmt(&sig);
5454
}
5555

5656
SignalArray_const<Time> (const SignalArray<Time>& siga)
57-
: const_array (NULL),
58-
size (DEFAULT_SIZE),
57+
: const_array (siga.getSize()),
58+
size (siga.getSize ()),
5959
rank (siga.getSize ())
6060
{
61-
createArray ();
6261
for (unsigned int i = 0; i < rank; ++i)
63-
const_array[i] = &siga[i];
62+
const_array[i] = &siga[i];
6463
}
6564

6665
SignalArray_const<Time> (const SignalArray_const<Time>& siga)
67-
: const_array(NULL),
68-
size(DEFAULT_SIZE),
66+
: const_array(siga.getSize ()),
67+
size(siga.getSize ()),
6968
rank(siga.getSize ())
7069
{
71-
createArray ();
7270
for (unsigned int i = 0; i < rank; ++i)
73-
const_array[i] = &siga[i];
71+
const_array[i] = &siga[i];
7472
}
7573

76-
virtual ~SignalArray_const<Time> ()
77-
{
78-
if (const_array)
79-
delete[] const_array;
80-
}
74+
virtual ~SignalArray_const<Time> (){}
8175

8276
protected:
83-
void createArray ()
84-
{
85-
if (0 < size)
86-
const_array = new const SignalBase<Time>*[size];
87-
}
8877

8978
void addElmt (const SignalBase<Time>* el)
9079
{
91-
if (rank < size)
92-
const_array[rank++] = el;
80+
if (rank >= size)
81+
{
82+
size += DEFAULT_SIZE;
83+
const_array.resize(size);
84+
}
85+
const_array[rank++] = el;
9386
}
9487

9588
public:
@@ -113,10 +106,9 @@ namespace dynamicgraph
113106

114107
template<class Time>
115108
SignalArray_const<Time> operator<< (const SignalBase<Time>& sig1,
116-
const SignalBase<Time>& sig2)
109+
const SignalBase<Time>& sig2)
117110
{
118-
SignalArray_const<Time> res(20);
119-
res<<sig1;
111+
SignalArray_const<Time> res(sig1);
120112
res<<sig2;
121113
return res;
122114
}
@@ -132,51 +124,45 @@ namespace dynamicgraph
132124
using SignalArray_const<Time>::size;
133125
using SignalArray_const<Time>::rank;
134126
protected:
135-
mutable SignalBase<Time>** array;
127+
mutable std::vector< SignalBase<Time>* > array;
136128

137129
public:
138130
SignalArray<Time> (const unsigned int& sizeARG = DEFAULT_SIZE)
139-
: SignalArray_const<Time> (0)
131+
: SignalArray_const<Time> (0),
132+
array(sizeARG)
140133
{
141134
size=sizeARG;
142-
createArray ();
143135
}
144136

145137
SignalArray<Time> (SignalBase<Time>& sig)
146-
: SignalArray_const<Time> (0)
138+
: SignalArray_const<Time> (0),
139+
array(DEFAULT_SIZE)
147140
{
148-
size=1;
149-
createArray ();
141+
size=DEFAULT_SIZE;
150142
addElmt(&sig);
151143
}
152144

153145
SignalArray<Time> (const SignalArray<Time>& siga)
154-
: SignalArray_const<Time> (DEFAULT_SIZE),
155-
array (NULL)
146+
: SignalArray_const<Time> (siga.getSize()),
147+
array (siga.getSize())
156148
{
157149
rank = siga.getSize ();
158-
createArray ();
159150
for (unsigned int i = 0; i < rank; ++i)
160-
array[i]=&siga[i];
151+
array[i]=&siga[i];
161152
}
162153

163-
virtual ~SignalArray<Time> ()
164-
{
165-
if (array)
166-
delete[] array;
167-
}
154+
virtual ~SignalArray<Time> (){}
168155

169156
protected:
170-
void createArray ()
171-
{
172-
if( 0 < size)
173-
array = new SignalBase<Time>*[size];
174-
}
175157

176158
void addElmt (SignalBase<Time>* el)
177159
{
178-
if(rank < size)
179-
array[rank++] = el;
160+
if (rank >= size)
161+
{
162+
size += DEFAULT_SIZE;
163+
array.resize(size);
164+
}
165+
array[rank++] = el;
180166
}
181167

182168
public:
@@ -189,8 +175,7 @@ namespace dynamicgraph
189175
virtual SignalArray_const<Time>
190176
operator<< (const SignalBase<Time>& sig) const
191177
{
192-
SignalArray_const<Time> res (size);
193-
res = *this;
178+
SignalArray_const<Time> res (*this);
194179
res << sig;
195180
return res;
196181
}
@@ -204,10 +189,9 @@ namespace dynamicgraph
204189

205190
template<class Time>
206191
SignalArray<Time> operator<< (SignalBase<Time>& sig1,
207-
SignalBase<Time>& sig2)
192+
SignalBase<Time>& sig2)
208193
{
209-
SignalArray<Time> res (20);
210-
res << sig1;
194+
SignalArray<Time> res (sig1);
211195
res << sig2;
212196
return res;
213197
}

0 commit comments

Comments
 (0)