ObjectManager.py

説明を見る。
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file ObjectManager.py
00006 # @brief Object management class
00007 # @date $Date: $
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2003-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 
00018 import sys
00019 import string
00020 import threading
00021 
00022 import OpenRTM
00023 
00024 
00025 
00026 ##
00027 # @if jp
00028 # @class ScopedLock
00029 # @brief ScopedLock クラス
00030 #
00031 # 排他処理用ロッククラス。
00032 #
00033 # @since 0.4.0
00034 #
00035 # @else
00036 #
00037 # @endif
00038 class ScopedLock:
00039 
00040 
00041   ##
00042   # @if jp
00043   # @brief コンストラクタ
00044   #
00045   # コンストラクタ
00046   #
00047   # @param self
00048   # @param mutex ロック用ミューテックス
00049   #
00050   # @else
00051   #
00052   # @endif
00053   def __init__(self, mutex):
00054     self.mutex = mutex
00055     self.mutex.acquire()
00056 
00057 
00058   ##
00059   # @if jp
00060   # @brief デストラクタ
00061   #
00062   # デストラクタ
00063   #
00064   # @param self
00065   #
00066   # @else
00067   #
00068   # @endif
00069   def __del__(self):
00070     self.mutex.release()
00071 
00072 
00073 
00074 ##
00075 # @if jp
00076 #
00077 # @brief オブジェクト管理用クラス
00078 #
00079 # 各種オブジェクトを管理するためのクラス。
00080 #
00081 # @since 0.4.0
00082 #
00083 # @else
00084 #
00085 # @endif
00086 class ObjectManager:
00087 
00088 
00089 
00090   ##
00091   # @if jp
00092   #
00093   # @brief コンストラクタ
00094   # 
00095   # コンストラクタ
00096   # 
00097   # @param self
00098   # @param predicate オブジェクト検索用ファンクタ
00099   # 
00100   # @else
00101   #
00102   # @endif
00103   def __init__(self, predicate):
00104     self._objects = self.Objects()
00105     self._predicate = predicate
00106 
00107 
00108 
00109   ##
00110   # @if jp
00111   # @class Objects
00112   # @brief オブジェクト管理用内部クラス
00113   # @endif
00114   class Objects:
00115     def __init__(self):
00116       self._mutex = threading.RLock()
00117       self._obj = []
00118 
00119 
00120   ##
00121   # @if jp
00122   #
00123   # @brief 指定したオブジェクトを登録する
00124   # 
00125   # 指定したオブジェクトを登録する。
00126   # 同一オブジェクトが登録済みの場合は、何も行わない。
00127   #
00128   # @param self
00129   # @param obj 登録対象オブジェクト
00130   #
00131   # @return 登録処理結果(オブジェクトを登録した場合にtrue)
00132   # 
00133   # @else
00134   #
00135   # @endif
00136   def registerObject(self, obj):
00137     guard = ScopedLock(self._objects._mutex)
00138     predi = self._predicate(factory=obj)
00139 
00140     for _obj in self._objects._obj:
00141       if predi(_obj):
00142         return False
00143 
00144     self._objects._obj.append(obj)
00145     return True
00146 
00147 
00148   ##
00149   # @if jp
00150   #
00151   # @brief 指定したオブジェクトを登録解除する
00152   # 
00153   # 指定したオブジェクトの登録を解除し、取得する。
00154   # 指定したオブジェクトが登録されていない場合にはNULLを返す。
00155   #
00156   # @param self
00157   # @param id 登録解除対象オブジェクトのID
00158   #
00159   # @return 登録解除されたオブジェクト
00160   # 
00161   # @else
00162   #
00163   # @endif
00164   def unregisterObject(self, id):
00165     guard = ScopedLock(self._objects._mutex)
00166     predi = self._predicate(name=id)
00167     i = 0
00168     for _obj in self._objects._obj:
00169       if predi(_obj):
00170         ret = _obj
00171         del self._objects._obj[i]
00172         return ret
00173       i+=1
00174       
00175     return None
00176 
00177 
00178   ##
00179   # @if jp
00180   #
00181   # @brief オブジェクトを検索する
00182   # 
00183   # 登録されているオブジェクトの中から指定した条件に合致するオブジェクトを検索
00184   # して取得する。
00185   # 指定した条件に合致するオブジェクトが登録されていない場合にはNULLを返す。
00186   #
00187   # @param self
00188   # @param id 検索対象オブジェクトのID
00189   #
00190   # @return オブジェクトの検索結果
00191   # 
00192   # @else
00193   #
00194   # @endif
00195   def find(self, id):
00196     guard = ScopedLock(self._objects._mutex)
00197     predi = self._predicate(name=id)
00198     for _obj in self._objects._obj:
00199       if predi(_obj):
00200         return _obj
00201       
00202     return None
00203 
00204 
00205   ##
00206   # @if jp
00207   #
00208   # @brief 登録されているオブジェクトのリストを取得する
00209   # 
00210   # 登録されているオブジェクトのリストを取得する。
00211   #
00212   # @param self
00213   #
00214   # @return 登録されているオブジェクト・リスト
00215   # 
00216   # @else
00217   #
00218   # @endif
00219   def getObjects(self):
00220     guard = ScopedLock(self._objects._mutex)
00221     return self._objects._obj
00222 
00223 
00224   ##
00225   # @if jp
00226   # @brief オブジェクトを検索する
00227   #
00228   # 指定された条件に合致するオブジェクトを検索する。
00229   #
00230   # @param self
00231   # @param p オブジェクト検索用ファンクタ
00232   #
00233   # @else
00234   #
00235   # @endif
00236   def for_each(self,p):
00237     guard = ScopedLock(self._objects._mutex)
00238     predi = p()
00239 
00240     for _obj in self._objects._obj:
00241       predi(_obj)
00242 
00243     return predi
00244 

OpenRTMに対してMon Mar 17 15:11:05 2008に生成されました。  doxygen 1.5.4