00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file CORBA_SeqUtil.py 00006 # @brief CORBA sequence utility template functions 00007 # @date $Date: 2007/09/03 $ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00009 # 00010 # Copyright (C) 2006-2008 00011 # Task-intelligence Research Group, 00012 # Intelligent Systems Research Institute, 00013 # National Institute of 00014 # Advanced Industrial Science and Technology (AIST), Japan 00015 # All rights reserved. 00016 00017 import OpenRTM_aist 00018 00019 ## 00020 # @if jp 00021 # 00022 # @brief CORBA sequence に対して functor を適用する 00023 # 00024 # CORBA sequence 全ての要素に対して、与えられた functor を適用する。 00025 # functor は void functor(CORBA sequence の要素) の形式をとる必要がある。 00026 # 00027 # @param seq Functor を適用する CORBA sequence 00028 # @param f CORBA sequence の要素を処理する Functor 00029 # 00030 # @return 全ての要素を処理した Functor 00031 # 00032 # @since 0.4.0 00033 # 00034 # @else 00035 # 00036 # @brief Apply the functor to all CORBA sequence elements 00037 # 00038 # Apply the given functor to the given CORBA sequence. 00039 # functor should be void functor(CORBA sequence element). 00040 # 00041 # @param seq CORBA sequence to be applied the functor 00042 # @param functor A functor to process CORBA sequence elements 00043 # 00044 # @return Functor that processed all CORBA sequence elements 00045 # 00046 # @endif 00047 def for_each(seq, f): 00048 len_ = len(seq) 00049 for i in range(len_): 00050 f(seq[i]) 00051 return f 00052 00053 00054 ## 00055 # @if jp 00056 # @brief CORBA sequence の中から functor に適合する要素のインデックスを返す 00057 # 00058 # CORBA sequence 全ての要素に対して、与えられた functor を適用し、 00059 # functor が true を返すようそのインデックスを返す。 00060 # functor は bool functor(const CORBA sequence の要素) の形式をとり、 00061 # 適合する要素に対して true を返す必要がある。 00062 # 00063 # @param seq Functor を適用する CORBA sequence 00064 # @param f CORBA sequence から要素を見つける Functor 00065 # 00066 # @return Functor に適合する要素のインデックス。見つからないときは -1 を返す。 00067 # 00068 # @else 00069 # 00070 # @brief Return the index of CORBA sequence element that functor matches 00071 # 00072 # This operation applies the given functor to the given CORBA sequence, 00073 # and returns the index of the sequence element that the functor matches. 00074 # The functor should be bool functor(const CORBA sequence element) type, 00075 # and it would return true, if the element matched the functor. 00076 # 00077 # @param seq CORBA sequence to be applied the functor 00078 # @param functor A functor to process CORBA sequence elements 00079 # 00080 # @return The index of the element that functor matches. 00081 # If no element found, it would return -1. 00082 # 00083 # @endif 00084 def find(seq, f): 00085 len_ = len(seq) 00086 for i in range(len_): 00087 if f(seq[i]): 00088 return i 00089 return -1 00090 00091 00092 ## 00093 # @if jp 00094 # @brief CORBA sequence の最後に要素を追加する 00095 # 00096 # CORBA sequence の最後に与えられた要素を追加する。 00097 # CORBA sequence の長さは自動的に拡張される。 00098 # 00099 # @param seq 要素を追加する CORBA sequence 00100 # @param elem 追加する要素 00101 # 00102 # @else 00103 # 00104 # @brief Push the new element back to the CORBA sequence 00105 # 00106 # Add the given element to the last of CORBA sequence. 00107 # The length of the CORBA sequence will be expanded automatically. 00108 # 00109 # @param seq CORBA sequence to be added a new element 00110 # @param elem The new element to be added to the CORBA sequence 00111 # 00112 # @endif 00113 def push_back(seq, elem): 00114 seq.append(elem) 00115 00116 00117 ## 00118 # @if jp 00119 # @brief CORBA sequence をマージする 00120 # 00121 # 与えられた CORBA sequence をマージする。 00122 # 00123 # @param seq1 マージされる CORBA sequence 00124 # @param seq2 マージされる CORBA sequence 00125 # 00126 # @else 00127 # 00128 # @endif 00129 def push_back_list(seq1, seq2): 00130 for elem in seq2: 00131 seq1.append(elem) 00132 00133 00134 ## 00135 # @if jp 00136 # @brief CORBA sequence に要素を挿入する 00137 # 00138 # CORBA sequence の index の位置に要素を加える。 00139 # index が 与えられた CORBA sequence の最大の index より大きい場合 00140 # 最後の要素として加えられる。 00141 # CORBA sequence の長さは自動的に拡張される。 00142 # 00143 # @param seq 要素を追加する CORBA sequence 00144 # @param elem 追加する要素 00145 # @param index 要素を追加する位置 00146 # 00147 # @else 00148 # 00149 # @brief Insert the element to the CORBA sequence 00150 # 00151 # Insert a new element in the given position to the CORBA sequence. 00152 # If the given index is greater than the length of the sequence, 00153 # the given element is pushed back to the last of the sequence. 00154 # The length of the CORBA sequence will be expanded automatically. 00155 # 00156 # @param seq The CORBA sequence to be inserted a new element 00157 # @param elem The new element to be inserted the sequence 00158 # @param index The inserting position 00159 # 00160 # @endif 00161 def insert(seq, elem, index): 00162 len_ = len(seq) 00163 if index > len: 00164 seq.append(elem) 00165 return 00166 seq.insert(index, elem) 00167 00168 00169 ## 00170 # @if jp 00171 # @brief CORBA sequence の先頭要素を取得する 00172 # 00173 # CORBA sequence の先頭要素を取得する。 00174 # seq[0] と同じ。 00175 # 00176 # @param seq 要素を取得する CORBA sequence 00177 # 00178 # @return 取得した要素 00179 # 00180 # @else 00181 # 00182 # @brief Get the front element of the CORBA sequence 00183 # 00184 # This operation returns seq[0]. 00185 # 00186 # @param seq The CORBA sequence to be get the element 00187 # 00188 # @endif 00189 def front(seq): 00190 return seq[0] 00191 00192 00193 ## 00194 # @if jp 00195 # @brief CORBA sequence の末尾要素を取得する 00196 # 00197 # CORBA sequence の末尾要素を取得する。 00198 # seq[seq.length() - 1] と同じ。 00199 # 00200 # @param seq 要素を取得する CORBA sequence 00201 # 00202 # @return 取得した要素 00203 # 00204 # @else 00205 # 00206 # @brief Get the last element of the CORBA sequence 00207 # 00208 # This operation returns seq[seq.length() - 1]. 00209 # 00210 # @param seq The CORBA sequence to be get the element 00211 # 00212 # @endif 00213 def back(seq): 00214 if len(seq) > 0: 00215 return seq[-1] 00216 00217 00218 ## 00219 # @if jp 00220 # @brief CORBA sequence の指定された位置の要素を削除する 00221 # 00222 # 指定されたインデックスの要素を削除する。 00223 # 削除された要素は詰められ、sequence の長さは1減る。 00224 # 00225 # @param seq 要素を削除する CORBA sequence 00226 # @param index 削除する要素のインデックス 00227 # 00228 # @else 00229 # 00230 # @brief Erase the element of the specified index 00231 # 00232 # This operation removes the element of the given index. 00233 # The other elements are closed up around the hole. 00234 # 00235 # @param seq The CORBA sequence to be get the element 00236 # @param index The index of the element to be removed 00237 # 00238 # @endif 00239 def erase(seq, index): 00240 if index > len(seq): 00241 return 00242 00243 del seq[index] 00244 00245 ## 00246 # @if jp 00247 # 00248 # @brief シーケンスの要素を述語にしたがって削除する 00249 # 00250 # このオペレーションは述語として与えられた関数オブジェクトの 00251 # 条件が真のとき、そのシーケンスの要素を削除する。 00252 # 00253 # @param seq 要素検索対象の CORBA sequence 00254 # @param f 削除するシーケンスを決定する術語 00255 # 00256 # @else 00257 # 00258 # @endif 00259 def erase_if(seq, f): 00260 index = find(seq, f) 00261 if index < 0: 00262 return 00263 del seq[index] 00264 00265 00266 ## 00267 # @if jp 00268 # @brief CORBA sequence の全要素を削除 00269 # 00270 # CORBA sequence の全要素を削除する。 00271 # seq.length(0) と同じ。 00272 # 00273 # @else 00274 # 00275 # @brief Erase all the elements of the CORBA sequence 00276 # 00277 # same as seq.length(0). 00278 # 00279 # @endif 00280 def clear(seq): 00281 del seq[0:] 00282 00283 00284 ## coil::vstring refToVstring(const CorbaRefSequence& objlist) 00285 def refToVstring(objlist): 00286 iorlist = [] 00287 orb = OpenRTM_aist.Manager.instance().getORB() 00288 00289 for obj in objlist: 00290 iorlist.append(orb.object_to_string(obj)) 00291 00292 return iorlist 00293