1 #ifndef SimTK_SimTKCOMMON_STABLEARRAY_H_
2 #define SimTK_SimTKCOMMON_STABLEARRAY_H_
59 explicit StableArray(
size_t z,
const T& ival=T()) : stuff(z), nOccupiedSlots(z) {
60 for (
size_t i=0; i<z; ++i) stuff[i] =
new T(ival);
65 for (
size_t i=0; i<s.
size(); ++i)
66 if (!s.
empty(i)) initializeEmptyElement(i, s[i]);
74 for (
size_t i=0; i<s.
size(); ++i)
75 if (!s.
empty(i)) initializeEmptyElement(i, s[i]);
84 assert(i < stuff.
size());
88 size_t nItems()
const {
return nOccupiedSlots;}
94 void resize(
size_t newz,
const T& ival=T()) {
95 const size_t oldz = stuff.
size();
97 for (
size_t i=newz; i < oldz; ++i)
98 eraseElementIfNecessary(i);
101 for (
size_t i=0; i < newz; ++i)
102 initializeElementIfNecessary(i,ival);
107 for (
size_t i=0; i < stuff.
size(); ++i)
108 eraseElementIfNecessary(i);
126 eraseOccupiedElement(stuff.
size()-1);
133 assert(i <= stuff.
size());
135 else initializeEmptyElement(i,t);
141 for (
size_t i=0; i<
size(); ++i)
142 if (
empty(i))
return i;
152 assert(i < stuff.
size());
153 for (; i < stuff.
size() && !stuff[i]; ++i);
174 else eraseElementIfNecessary(i);
180 assert(firstItem < stuff.
size());
181 return *stuff[firstItem];
185 assert(firstItem < stuff.
size());
186 return *stuff[firstItem];
195 assert(i < stuff.
size() && stuff[i]);
199 assert(i < stuff.
size() && stuff[i]);
204 size_t nOccupiedSlots;
210 void eraseOccupiedElement(
size_t i) {
211 assert(i < stuff.
size() && stuff[i]);
212 delete stuff[i]; stuff[i]=0; --nOccupiedSlots;
215 void initializeEmptyElement(
size_t i,
const T& t) {
216 assert(i < stuff.
size() && !stuff[i]);
217 stuff[i] =
new T(t); ++nOccupiedSlots;
220 void eraseElementIfNecessary(
size_t i) {
221 assert(i < stuff.
size());
222 if (stuff[i]) eraseOccupiedElement(i);
225 void initializeElementIfNecessary(
size_t i,
const T& t) {
226 assert(i < stuff.
size());
227 if (!stuff[i]) initializeEmptyElement(i,t);
234 #endif // SimTK_SimTKCOMMON_STABLEARRAY_H_