00001
00019 #ifndef CORBA_SeqUtil_h
00020 #define CORBA_SeqUtil_h
00021
00022 #include <rtm/RTC.h>
00023
00065 namespace CORBA_SeqUtil
00066 {
00096 template <class CorbaSequence, class Functor>
00097 Functor for_each(CorbaSequence& seq, Functor f)
00098 {
00099 CORBA::ULong len;
00100 len = seq.length();
00101 for (CORBA::ULong i = 0; i < len; ++i)
00102 {
00103 f(seq[i]);
00104 }
00105 return f;
00106 }
00107
00140 template <class CorbaSequence, class Functor>
00141 CORBA::Long find(const CorbaSequence& seq, Functor f)
00142 {
00143 CORBA::ULong len(seq.length());
00144 for (CORBA::ULong i = 0; i < len; ++i)
00145 {
00146 if (f(seq[i])) return (CORBA::Long)i;
00147 }
00148 return -1;
00149 }
00150
00173 template <class CorbaSequence, class SequenceElement>
00174 void push_back(CorbaSequence& seq, SequenceElement elem)
00175 {
00176 CORBA::ULong len(seq.length());
00177 seq.length(len + 1);
00178 seq[len] = elem;
00179 }
00180
00201 template <class CorbaSequence>
00202 void push_back_list(CorbaSequence& seq1, const CorbaSequence& seq2)
00203 {
00204 CORBA::ULong len1(seq1.length());
00205 CORBA::ULong len2(seq2.length());
00206 CORBA::ULong len(len1 + len2);
00207 seq1.length(len);
00208
00209 for (CORBA::ULong i = 0; i < len2; ++i)
00210 {
00211 seq1[len1 + i] = seq2[i];
00212 }
00213 }
00214
00243 template <class CorbaSequence, class SequenceElement>
00244 void insert(CorbaSequence& seq, SequenceElement& elem, CORBA::ULong index)
00245 {
00246 CORBA::ULong len(seq.length());
00247 if (index > len)
00248 {
00249 push_back(seq, elem);
00250 return;
00251 }
00252
00253 seq.length(len + 1);
00254 for (CORBA::ULong i = len; i > index; --i)
00255 {
00256 seq[i] = seq[i - 1];
00257 }
00258 seq[index] = elem;
00259 }
00260
00286 template <class CorbaSequence, class SequenceElement>
00287 SequenceElement& front(CorbaSequence& seq)
00288 {
00289 return seq[0];
00290 }
00291
00315 template <class CorbaSequence, class SequenceElement>
00316 SequenceElement& back(CorbaSequence& seq)
00317 {
00318 return seq[seq.length() - 1];
00319 }
00320
00343 template <class CorbaSequence>
00344 void erase(CorbaSequence& seq, CORBA::ULong index)
00345 {
00346 CORBA::ULong len(seq.length());
00347 if (index > len) return;
00348
00349 for (CORBA::ULong i = index; i < len - 1; ++i)
00350 {
00351 seq[i] = seq[i + 1];
00352 }
00353 seq.length(len - 1);
00354 }
00355
00379 template <class CorbaSequence, class Functor>
00380 void erase_if(CorbaSequence& seq, Functor f)
00381 {
00382 CORBA::Long index;
00383 index = find(seq, f);
00384 if (index < 0) return;
00385 CORBA_SeqUtil::erase(seq, index);
00386 }
00387
00403 template <class CorbaSequence>
00404 void clear(CorbaSequence& seq)
00405 {
00406 seq.length(0);
00407 }
00408
00409
00410 };
00411 #endif // CORBA_SeqUtil.h