00001
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef CORBA_SeqUtil_h
00038 #define CORBA_SeqUtil_h
00039
00040 #include <rtm/RTC.h>
00041
00083 namespace CORBA_SeqUtil
00084 {
00110 template <class CorbaSequence, class Functor>
00111 Functor for_each(CorbaSequence& seq, Functor f)
00112 {
00113 CORBA::ULong len;
00114 len = seq.length();
00115 for (CORBA::ULong i = 0; i < len; ++i)
00116 {
00117 f(seq[i]);
00118 }
00119 return f;
00120 }
00121
00122
00153 template <class CorbaSequence, class Functor>
00154 CORBA::Long find(const CorbaSequence& seq, Functor f)
00155 {
00156 CORBA::ULong len(seq.length());
00157 for (CORBA::ULong i = 0; i < len; ++i)
00158 {
00159 if (f(seq[i])) return (CORBA::Long)i;
00160 }
00161 return -1;
00162 }
00163
00186 template <class CorbaSequence, class SequenceElement>
00187 void push_back(CorbaSequence& seq, SequenceElement elem)
00188 {
00189 CORBA::ULong len(seq.length());
00190 seq.length(len + 1);
00191 seq[len] = elem;
00192 }
00193
00194 template <class CorbaSequence>
00195 void push_back_list(CorbaSequence& seq1, const CorbaSequence& seq2)
00196 {
00197 CORBA::ULong len1(seq1.length());
00198 CORBA::ULong len2(seq2.length());
00199 CORBA::ULong len(len1 + len2);
00200 seq1.length(len);
00201
00202 for (CORBA::ULong i = 0; i < len2; ++i)
00203 {
00204 seq1[len1 + i] = seq2[i];
00205 }
00206 }
00207
00208
00237 template <class CorbaSequence, class SequenceElement>
00238 void insert(CorbaSequence& seq, SequenceElement& elem, CORBA::ULong index)
00239 {
00240 CORBA::ULong len(seq.length());
00241 if (index > len)
00242 {
00243 push_back(seq, elem);
00244 return;
00245 }
00246
00247 seq.length(len + 1);
00248 for (CORBA::ULong i = len; i > index; --i)
00249 {
00250 seq[i] = seq[i - 1];
00251 }
00252 seq[index] = elem;
00253 }
00254
00255
00274 template <class CorbaSequence, class SequenceElement>
00275 SequenceElement& front(CorbaSequence& seq)
00276 {
00277 return seq[0];
00278 }
00279
00280
00299 template <class CorbaSequence, class SequenceElement>
00300 SequenceElement& back(CorbaSequence& seq)
00301 {
00302 return seq[seq.length() - 1];
00303 }
00304
00305
00328 template <class CorbaSequence>
00329 void erase(CorbaSequence& seq, CORBA::ULong index)
00330 {
00331 CORBA::ULong len(seq.length());
00332 if (index > len) return;
00333
00334 for (CORBA::ULong i = index; i < len - 1; ++i)
00335 {
00336 seq[i] = seq[i + 1];
00337 }
00338 seq.length(len - 1);
00339 }
00340
00341 template <class CorbaSequence, class Functor>
00342 void erase_if(CorbaSequence& seq, Functor f)
00343 {
00344 CORBA::Long index;
00345 index = find(seq, f);
00346 if (index < 0) return;
00347 CORBA_SeqUtil::erase(seq, index);
00348 }
00349
00364 template <class CorbaSequence>
00365 void clear(CorbaSequence& seq)
00366 {
00367 seq.length(0);
00368 }
00369
00370
00371 };
00372 #endif // CORBA_SeqUtil.h