Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

CORBA_SeqUtil.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00019 /*
00020  * $Log: CORBA_SeqUtil.h,v $
00021  * Revision 1.3  2006/11/02 09:04:39  n-ando
00022  * CORBA_SeqUtil::insert()'s bug was fixed.
00023  *
00024  * Revision 1.2  2006/10/30 08:09:07  n-ando
00025  * Two functions push_back_lsit(), erase_if() were added.
00026  * Function reference manual was revised.
00027  *
00028  * Revision 1.1  2006/10/27 09:09:46  n-ando
00029  * The first commitment.
00030  *
00031  *
00032  */
00033 
00034 #ifndef CORBA_SeqUtil_h
00035 #define CORBA_SeqUtil_h
00036 
00037 namespace CORBA
00038 {
00039   typedef unsigned long ULong;
00040   typedef long Long;
00041 };
00042 
00084 namespace CORBA_SeqUtil
00085 {
00111   template <class CorbaSequence, class Functor>
00112   Functor for_each(CorbaSequence& seq, Functor f)
00113   {
00114     CORBA::ULong len;
00115     len = seq.length();
00116     for (CORBA::ULong i = 0; i < len; ++i)
00117       {
00118         f(seq[i]);
00119       }
00120     return f;
00121   }
00122 
00123 
00154   template <class CorbaSequence, class Functor>
00155   CORBA::Long find(const CorbaSequence& seq, Functor f)
00156   {
00157     CORBA::ULong len(seq.length());
00158     for (CORBA::ULong i = 0; i < len; ++i)
00159       {
00160         if (f(seq[i])) return (CORBA::Long)i;
00161       }
00162     return -1;
00163   }
00164 
00187   template <class CorbaSequence, class SequenceElement>
00188   void push_back(CorbaSequence& seq, SequenceElement elem)
00189   {
00190     CORBA::ULong len(seq.length());
00191     seq.length(len + 1);
00192     seq[len] = elem;
00193   }
00194 
00195   template <class CorbaSequence>
00196   void push_back_list(CorbaSequence& seq1, const CorbaSequence& seq2)
00197   {
00198     CORBA::ULong len1(seq1.length());
00199     CORBA::ULong len2(seq2.length());
00200     CORBA::ULong len(len1 + len2);
00201     seq1.length(len);
00202 
00203     for (CORBA::ULong i = 0; i < len2; ++i)
00204       {
00205         seq1[len1 + i] = seq2[i];
00206       }
00207   }
00208 
00209 
00238   template <class CorbaSequence, class SequenceElement>
00239   void insert(CorbaSequence& seq, SequenceElement& elem, CORBA::ULong index)
00240   {
00241     CORBA::ULong len(seq.length());
00242     if (index > len)
00243       {
00244         push_back(seq, elem);
00245         return;
00246       }
00247 
00248     seq.length(len + 1);
00249     for (CORBA::ULong i = len; i > index; --i)
00250       {
00251         seq[i] = seq[i - 1];
00252       }
00253     seq[index] = elem;
00254   }
00255 
00256 
00275   template <class CorbaSequence, class SequenceElement>
00276   SequenceElement& front(CorbaSequence& seq)
00277   {
00278     return seq[0];
00279   }
00280 
00281 
00300   template <class CorbaSequence, class SequenceElement>
00301   SequenceElement& back(CorbaSequence& seq)
00302   {
00303     return seq[seq.length() - 1];
00304   }
00305 
00306 
00329   template <class CorbaSequence>
00330   void erase(CorbaSequence& seq, CORBA::ULong index)
00331   {
00332     CORBA::ULong len(seq.length());
00333     if (index > len) return;
00334 
00335     for (CORBA::ULong i = index; i < len - 1; ++i)
00336       {
00337         seq[i] = seq[i + 1];
00338       }
00339     seq.length(len - 1);
00340   }
00341 
00342   template <class CorbaSequence, class Functor>
00343   void erase_if(CorbaSequence& seq, Functor f)
00344   {
00345     CORBA::Long index;
00346     index = find(seq, f);
00347     if (index < 0) return;
00348     CORBA_SeqUtil::erase(seq, index);
00349   }
00350 
00365   template <class CorbaSequence>
00366   void clear(CorbaSequence& seq)
00367   {
00368     seq.length(0);
00369   }
00370   // End of CORBA sequence helper functions
00371 
00372 }; // namespace CORBA_SeqUtil
00373 #endif // CORBA_SeqUtil.h

Generated on Tue May 29 16:45:37 2007 for OpenRTM by  doxygen 1.4.1