Skip to content

Commit 6fdb036

Browse files
Fix bug in signal-array that was limiting the number of signals in a signal-array to 20. Moreover I replaced the C array with an std::vector.
1 parent 07f65ae commit 6fdb036

File tree

1 file changed

+40
-57
lines changed

1 file changed

+40
-57
lines changed

include/dynamic-graph/signal-array.h

Lines changed: 40 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
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>
2223

2324
namespace dynamicgraph
2425
{
26+
2527
/// \ingroup dgraph
2628
///
2729
/// \brief TODO
@@ -32,64 +34,54 @@ namespace dynamicgraph
3234
static const int DEFAULT_SIZE = 20;
3335

3436
protected:
35-
const SignalBase<Time> ** const_array;
37+
std::vector< const SignalBase<Time>* > const_array;
3638
unsigned int size,rank;
3739

3840
public:
3941
SignalArray_const<Time> (const unsigned int& sizeARG = DEFAULT_SIZE)
40-
: const_array (NULL),
42+
: const_array (sizeARG),
4143
size (sizeARG),
4244
rank (0)
43-
{
44-
createArray ();
45-
}
45+
{}
4646

4747
SignalArray_const<Time> (const SignalBase<Time>& sig)
48-
: const_array (NULL),
49-
size (1),
48+
: const_array (DEFAULT_SIZE),
49+
size (DEFAULT_SIZE),
5050
rank (0)
5151
{
52-
createArray ();
5352
addElmt(&sig);
5453
}
5554

5655
SignalArray_const<Time> (const SignalArray<Time>& siga)
57-
: const_array (NULL),
58-
size (DEFAULT_SIZE),
56+
: const_array (siga.getSize()),
57+
size (siga.getSize ()),
5958
rank (siga.getSize ())
6059
{
61-
createArray ();
6260
for (unsigned int i = 0; i < rank; ++i)
63-
const_array[i] = &siga[i];
61+
const_array[i] = &siga[i];
6462
}
6563

6664
SignalArray_const<Time> (const SignalArray_const<Time>& siga)
67-
: const_array(NULL),
68-
size(DEFAULT_SIZE),
65+
: const_array(siga.getSize ()),
66+
size(siga.getSize ()),
6967
rank(siga.getSize ())
7068
{
71-
createArray ();
7269
for (unsigned int i = 0; i < rank; ++i)
73-
const_array[i] = &siga[i];
70+
const_array[i] = &siga[i];
7471
}
7572

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

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

8977
void addElmt (const SignalBase<Time>* el)
9078
{
91-
if (rank < size)
92-
const_array[rank++] = el;
79+
if (rank >= size)
80+
{
81+
size += DEFAULT_SIZE;
82+
const_array.resize(size);
83+
}
84+
const_array[rank++] = el;
9385
}
9486

9587
public:
@@ -113,10 +105,9 @@ namespace dynamicgraph
113105

114106
template<class Time>
115107
SignalArray_const<Time> operator<< (const SignalBase<Time>& sig1,
116-
const SignalBase<Time>& sig2)
108+
const SignalBase<Time>& sig2)
117109
{
118-
SignalArray_const<Time> res(20);
119-
res<<sig1;
110+
SignalArray_const<Time> res(sig1);
120111
res<<sig2;
121112
return res;
122113
}
@@ -132,51 +123,45 @@ namespace dynamicgraph
132123
using SignalArray_const<Time>::size;
133124
using SignalArray_const<Time>::rank;
134125
protected:
135-
mutable SignalBase<Time>** array;
126+
mutable std::vector< SignalBase<Time>* > array;
136127

137128
public:
138129
SignalArray<Time> (const unsigned int& sizeARG = DEFAULT_SIZE)
139-
: SignalArray_const<Time> (0)
130+
: SignalArray_const<Time> (0),
131+
array(sizeARG)
140132
{
141133
size=sizeARG;
142-
createArray ();
143134
}
144135

145136
SignalArray<Time> (SignalBase<Time>& sig)
146-
: SignalArray_const<Time> (0)
137+
: SignalArray_const<Time> (0),
138+
array(1)
147139
{
148140
size=1;
149-
createArray ();
150141
addElmt(&sig);
151142
}
152143

153144
SignalArray<Time> (const SignalArray<Time>& siga)
154-
: SignalArray_const<Time> (DEFAULT_SIZE),
155-
array (NULL)
145+
: SignalArray_const<Time> (siga.getSize()),
146+
array ()
156147
{
157148
rank = siga.getSize ();
158-
createArray ();
159149
for (unsigned int i = 0; i < rank; ++i)
160-
array[i]=&siga[i];
150+
array[i]=&siga[i];
161151
}
162152

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

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

176157
void addElmt (SignalBase<Time>* el)
177158
{
178-
if(rank < size)
179-
array[rank++] = el;
159+
if (rank >= size)
160+
{
161+
size += DEFAULT_SIZE;
162+
array.resize(size);
163+
}
164+
array[rank++] = el;
180165
}
181166

182167
public:
@@ -189,8 +174,7 @@ namespace dynamicgraph
189174
virtual SignalArray_const<Time>
190175
operator<< (const SignalBase<Time>& sig) const
191176
{
192-
SignalArray_const<Time> res (size);
193-
res = *this;
177+
SignalArray_const<Time> res (*this);
194178
res << sig;
195179
return res;
196180
}
@@ -204,10 +188,9 @@ namespace dynamicgraph
204188

205189
template<class Time>
206190
SignalArray<Time> operator<< (SignalBase<Time>& sig1,
207-
SignalBase<Time>& sig2)
191+
SignalBase<Time>& sig2)
208192
{
209-
SignalArray<Time> res (20);
210-
res << sig1;
193+
SignalArray<Time> res (sig1);
211194
res << sig2;
212195
return res;
213196
}

0 commit comments

Comments
 (0)