00001
00019 #ifndef CORBA_SEQUTIL_H
00020 #define CORBA_SEQUTIL_H
00021
00022 #include <rtm/RTC.h>
00023 #include <rtm/Manager.h>
00024
00066 namespace CORBA_SeqUtil
00067 {
00097 template <class CorbaSequence, class Functor>
00098 Functor for_each(CorbaSequence& seq, Functor f)
00099 {
00100 CORBA::ULong len;
00101 len = seq.length();
00102 for (CORBA::ULong i = 0; i < len; ++i)
00103 {
00104 f(seq[i]);
00105 }
00106 return f;
00107 }
00108
00141 template <class CorbaSequence, class Functor>
00142 CORBA::Long find(const CorbaSequence& seq, Functor f)
00143 {
00144 CORBA::ULong len(seq.length());
00145 for (CORBA::ULong i = 0; i < len; ++i)
00146 {
00147 if (f(seq[i])) { return (CORBA::Long)i; }
00148 }
00149 return -1;
00150 }
00151
00174 template <class CorbaSequence, class SequenceElement>
00175 void push_back(CorbaSequence& seq, SequenceElement elem)
00176 {
00177 CORBA::ULong len(seq.length());
00178 seq.length(len + 1);
00179 seq[len] = elem;
00180 }
00181
00202 template <class CorbaSequence>
00203 void push_back_list(CorbaSequence& seq1, const CorbaSequence& seq2)
00204 {
00205 CORBA::ULong len1(seq1.length());
00206 CORBA::ULong len2(seq2.length());
00207 CORBA::ULong len(len1 + len2);
00208 seq1.length(len);
00209
00210 for (CORBA::ULong i = 0; i < len2; ++i)
00211 {
00212 seq1[len1 + i] = seq2[i];
00213 }
00214 }
00215
00244 template <class CorbaSequence, class SequenceElement>
00245 void insert(CorbaSequence& seq, SequenceElement& elem, CORBA::ULong index)
00246 {
00247 CORBA::ULong len(seq.length());
00248 if (index > len)
00249 {
00250 push_back(seq, elem);
00251 return;
00252 }
00253
00254 seq.length(len + 1);
00255 for (CORBA::ULong i = len; i > index; --i)
00256 {
00257 seq[i] = seq[i - 1];
00258 }
00259 seq[index] = elem;
00260 }
00261
00287 template <class CorbaSequence, class SequenceElement>
00288 SequenceElement& front(CorbaSequence& seq)
00289 {
00290 return seq[0];
00291 }
00292
00316 template <class CorbaSequence, class SequenceElement>
00317 SequenceElement& back(CorbaSequence& seq)
00318 {
00319 return seq[seq.length() - 1];
00320 }
00321
00344 template <class CorbaSequence>
00345 void erase(CorbaSequence& seq, CORBA::ULong index)
00346 {
00347 CORBA::ULong len(seq.length());
00348 if (index > len) return;
00349
00350 for (CORBA::ULong i = index; i < len - 1; ++i)
00351 {
00352 seq[i] = seq[i + 1];
00353 }
00354 seq.length(len - 1);
00355 }
00356
00380 template <class CorbaSequence, class Functor>
00381 void erase_if(CorbaSequence& seq, Functor f)
00382 {
00383 CORBA::Long index;
00384 index = find(seq, f);
00385 if (index < 0) return;
00386 CORBA_SeqUtil::erase(seq, index);
00387 }
00388
00404 template <class CorbaSequence>
00405 void clear(CorbaSequence& seq)
00406 {
00407 seq.length(0);
00408 }
00409
00410
00411
00412 template <class CorbaRefSequence>
00413 coil::vstring refToVstring(const CorbaRefSequence& objlist)
00414 {
00415 coil::vstring iorlist;
00416 CORBA::ORB_ptr orb = ::RTC::Manager::instance().getORB();
00417
00418 for (CORBA::ULong i(0), len(objlist.length()); i < len; ++i)
00419 {
00420 #ifndef ORB_IS_RTORB
00421 CORBA::String_var str_var = orb->object_to_string(objlist[i].in());
00422 #else
00423 CORBA_Object obj = (objlist.cobj())->_buffer[i];
00424 CORBA::String_var str_var = orb->object_to_string2(obj);
00425 #endif
00426 iorlist.push_back(str_var.in());
00427 }
00428 return iorlist;
00429 }
00430 };
00431 #endif // CORBA_SEQUTIL_H