OpenRTM-aist
1.2.1
|
ExecutionContext用基底クラス [詳解]
#include <ExecutionContextBase.h>
公開メンバ関数 | |
ExecutionContextBase (const char *name) | |
仮想デストラクタ [詳解] | |
virtual | ~ExecutionContextBase (void) |
仮想デストラクタ [詳解] | |
virtual void | init (coil::Properties &props) |
ExecutionContextの初期化を行う [詳解] | |
virtual RTC::ReturnCode_t | bindComponent (RTC::RTObject_impl *rtc) |
コンポーネントをバインドする。 [詳解] | |
CORBA::Boolean | isRunning () |
ExecutionContext 実行状態確認関数 [詳解] | |
RTC::ReturnCode_t | start (void) |
ExecutionContext の実行を開始 [詳解] | |
virtual RTC::ReturnCode_t | stop (void) |
ExecutionContext の実行を停止 [詳解] | |
double | getRate (void) const |
ExecutionContext の実行周期(Hz)を取得する [詳解] | |
coil::TimeValue | getPeriod (void) const |
RTC::ReturnCode_t | setRate (double rate) |
ExecutionContext の実行周期(Hz)を設定する [詳解] | |
RTC::ReturnCode_t | addComponent (RTC::LightweightRTObject_ptr comp) |
RTコンポーネントを追加する [詳解] | |
RTC::ReturnCode_t | removeComponent (RTC::LightweightRTObject_ptr comp) |
RTコンポーネントを参加者リストから削除する [詳解] | |
RTC::ReturnCode_t | activateComponent (RTC::LightweightRTObject_ptr comp) |
RTコンポーネントをアクティブ化する [詳解] | |
RTC::ReturnCode_t | deactivateComponent (RTC::LightweightRTObject_ptr comp) |
RTコンポーネントを非アクティブ化する [詳解] | |
RTC::ReturnCode_t | resetComponent (RTC::LightweightRTObject_ptr comp) |
RTコンポーネントをリセットする [詳解] | |
RTC::LifeCycleState | getComponentState (RTC::LightweightRTObject_ptr comp) |
RTコンポーネントの状態を取得する [詳解] | |
const char * | getStateString (RTC::LifeCycleState state) |
RTC::ExecutionKind | getKind (void) const |
ExecutionKind を取得する [詳解] | |
RTC::ExecutionContextProfile * | getProfile (void) |
Profileを取得する [詳解] | |
void | setObjRef (RTC::ExecutionContextService_ptr ec_ptr) |
CORBA オブジェクト参照の取得 [詳解] | |
RTC::ExecutionContextService_ptr | getObjRef (void) const |
CORBA オブジェクト参照の取得 [詳解] | |
const char * | getKindString (RTC::ExecutionKind kind) const |
ExecutionKind を文字列化する [詳解] | |
RTC::ReturnCode_t | setKind (RTC::ExecutionKind kind) |
ExecutionKind を設定する [詳解] | |
RTC::ReturnCode_t | setOwner (RTC::LightweightRTObject_ptr comp) |
Ownerコンポーネントをセットする。 [詳解] | |
const RTC::RTObject_ptr | getOwner () const |
Ownerコンポーネントの参照を取得する [詳解] | |
const RTC::RTCList & | getComponentList () const |
RTコンポーネントの参加者リストを取得する [詳解] | |
void | setProperties (coil::Properties &props) |
Propertiesをセットする [詳解] | |
const coil::Properties | getProperties () const |
Propertiesを取得する [詳解] | |
const RTC::ExecutionContextProfile & | getProfile (void) const |
Profileを取得する [詳解] | |
bool | isAllCurrentState (RTC::LifeCycleState state) |
bool | isAllNextState (RTC::LifeCycleState state) |
bool | isOneOfCurrentState (RTC::LifeCycleState state) |
bool | isOneOfNextState (RTC::LifeCycleState state) |
void | invokeWorker () |
void | invokeWorkerPreDo () |
void | invokeWorkerDo () |
void | invokeWorkerPostDo () |
限定公開メンバ関数 | |
virtual bool | onIsRunning (bool running) |
virtual RTC::ReturnCode_t | onStarting () |
virtual RTC::ReturnCode_t | onStarted () |
virtual RTC::ReturnCode_t | onStopping () |
virtual RTC::ReturnCode_t | onStopped () |
virtual double | onGetRate (double rate) const |
virtual double | onSettingRate (double rate) |
virtual RTC::ReturnCode_t | onSetRate (double rate) |
virtual RTC::ReturnCode_t | onAddingComponent (RTC::LightweightRTObject_ptr rtobj) |
virtual RTC::ReturnCode_t | onAddedComponent (RTC::LightweightRTObject_ptr rtobj) |
virtual RTC::ReturnCode_t | onRemovingComponent (RTC::LightweightRTObject_ptr rtobj) |
virtual RTC::ReturnCode_t | onRemovedComponent (RTC::LightweightRTObject_ptr rtobj) |
virtual RTC::ReturnCode_t | onActivating (RTC::LightweightRTObject_ptr comp) |
virtual RTC::ReturnCode_t | onWaitingActivated (RTC_impl::RTObjectStateMachine *comp, long int count) |
virtual RTC::ReturnCode_t | onActivated (RTC_impl::RTObjectStateMachine *comp, long int count) |
virtual RTC::ReturnCode_t | onDeactivating (RTC::LightweightRTObject_ptr comp) |
virtual RTC::ReturnCode_t | onWaitingDeactivated (RTC_impl::RTObjectStateMachine *comp, long int count) |
virtual RTC::ReturnCode_t | onDeactivated (RTC_impl::RTObjectStateMachine *comp, long int count) |
virtual RTC::ReturnCode_t | onResetting (RTC::LightweightRTObject_ptr comp) |
virtual RTC::ReturnCode_t | onWaitingReset (RTC_impl::RTObjectStateMachine *comp, long int count) |
virtual RTC::ReturnCode_t | onReset (RTC_impl::RTObjectStateMachine *comp, long int count) |
virtual RTC::LifeCycleState | onGetComponentState (RTC::LifeCycleState state) |
virtual RTC::ExecutionKind | onGetKind (RTC::ExecutionKind kind) const |
virtual RTC::ExecutionContextProfile * | onGetProfile (RTC::ExecutionContextProfile *&profile) |
ExecutionContext用基底クラス
ECの実装クラスでは、この基底クラスを継承し、かつECのCORBAオペレー ションを実装しなければならない。さらに、実際にロジックを駆動するた め、幾つかの約束に則りExecutionContextBaseの関数を呼び出す必要があ る。ECのCORBAオペレーションは以下のものがあり、それぞれ ExecutionContextBaseのメンバ関数に対応している。
実行状態に関係する関数は、is_running(), start(), stop() の3つがあ る。ExecutionContextBaseでは単純に running/stopped のフラグを持っ ており、start/stopでフラグのON/OFF切り替え、is_running()で状態読み 出しを行っている。通常、ECの実装クラスでは、protected な仮想メン バ関数 onStarting(), onStarted(), onStopping(), onStopped() 関数を 実装したうえで、CORBAオペレーションを以下のように実装する必要がある。
is_running() のCORBAオペレーションでは、単純に ExecutionContextBase の isRunning() を呼び出すだけである。この関数 に関連する protected 仮想関数はonIsRunning() が用意されているが、 通常特に実装する必要はない。あえて、現在の running/stopped 状態を 書き換えたい場合にこの関数を利用することができるが推奨はされない。
public: CORBA::Boolean is_runing() { return ExecutionContextBase::isRunning(); } protected: CORBA::Boolean onIsRunning(CORBA::Boolean running) { return running; }
start(), stop() CORBAオペレーションでは、通常 ExecutionContextBase の start(), stop() 関数を呼び出すよう実装する。 この関数に関連する protected 仮想関数は、start() および stop() に ついてそれぞれ2つづつの onStarting(), onStarted(), および onStopping(), onStopped() 関数がある。ECの実装クラスにおいては、そ れぞれ以下のように実装する。
RTC::ReturnCode_t start() { return ExecutionContextBase::start(); } RTC::ReturnCode_t stop() { return ExecutionContextBase::stop(); } protected: RTC::ReturnCode_t onStarting() { RTC::ReturnCode_t ret = // スレッドを開始する処理など return ret; } RTC::ReturnCode_t onStarted() { RTC::ReturnCode_t ret = // スレッドを開始する処理など return ret; } RTC::ReturnCode_t onStopping() { // スレッドを停止する処理など return retcode; } RTC::ReturnCode_t onStopped() { // スレッドを停止する処理など return retcode; }
実行周期に関する関数は set_rate(), get_rate() の2種類がある。実装 する実行コンテキストがもし set_rate() により指定される周期を利用する 場合、テンプレート関数 onSetRate() をオーバーライドし実装する。 onSetRate() は引数に double 型の周期を取り、この値は正当な値である ことが保証されている。onSetRate() がRTC::RTC_OK 以外の値を返した場 合、ECのProfileの周期は設定される以前の値を保持することが保証され る。
set_rate() 同様 get_rate() 呼び出し時にonGetRate() が呼び出される が、これは通常オーバーライド剃る必要はない。ただし、get_rate() が 返す値を変更したい場合、onGetRate() をオーバーライドすることでその 値を書き換えることができる。ただし、これは推奨されない。
public: RTC::ReturnCode_t set_rate(double rate) { return setRate(rate); } double get_rate(void) const { return getRate(); } protected: virtual RTC::ReturnCode_t onSetRate(double rate) { RTC::ReturnCode_t ret = // 周期を設定する何らかの処理 if (ret != RTC::RTC_OK) { RTC_ERROR(("Error message")); } return ret; } virtual double onGetRate(rate) { // get_rate() が返す値を加工したい場合 // 通常はこの関数を実装する必要はない。 return rate; }
コンポーネントの追加と削除に関する関数は、add_component(), remove_component() の二種類がある。実行コンテキストの実装クラスに おいては、ExecutionContextBase のそれぞれ addComponent(), removeComponent() を呼び出す形で実装を行う。これらの関数に関連する protected 仮想関数は onAddingComponent(), onAddedComponent(), onRemovingComponent(), onRemovedComponent() の4種類ある。ただし、 これらの仮想関数は通常オーバーライドする必要はなく、使用は推奨され ない。
public: RTC::ReturnCode_t add_component(RTC::LightweightRTObject_ptr comp) { return ExecutionContextBase::addComponent(comp); } RTC::ReturnCode_t remove_component(RTC::LightweightRTObject_ptr comp) { return ExecutionContextBase::removeComponent(comp); } protected: virtual RTC::ReturnCode_t onAddingComponent(RTC::LightweightRTObject rtobj) { // コンポーネント追加時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、コンポーネントの追加は行われない。 return RTC::RTC_OK; } virtual RTC::ReturnCode_t onAddedComponent(RTC::LightweightRTObject rtobj) { // コンポーネント追加時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、removeComponent() が呼び出され、 // 追加されたコンポーネントが削除される。 return RTC::RTC_OK; } virtual RTC::ReturnCode_t onRemovingComponent(RTC::LightweightRTObject rtobj) { // コンポーネント削除時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、コンポーネントの削除は行われない。 return RTC::RTC_OK; } virtual RTC::ReturnCode_t onRemovedComponent(RTC::LightweightRTObject rtobj) { // コンポーネント追加時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、addComponent() が呼び出され、 // 削除されたコンポーネントが再び追加される。 return RTC::RTC_OK; }
コンポーネントのアクティブ化等に関する関数は、 activate_component(), deactivate_component(), reset_component() の 三種類がある。実行コンテキストの実装クラスにおいては、 ExecutionContextBase のそれぞれ activateComponent(), deactivateComponent(), resetComponent() を呼び出す形で実装を行う。 これらの関数に関連する protected 仮想関数は onActivatingComponent(), onAtivatingComponent(), onActivatedComponent(), onDeactivatingComponent(), onDeactivatedComponent(), onResettingComponent(), onResetComponent() の6種類ある。ただし、これらの仮想関数は通常オー バーライドする必要はなく、使用は推奨されない。
public: RTC::ReturnCode_t add_component(RTC::LightweightRTObject_ptr comp) { return ExecutionContextBase::addComponent(comp); } RTC::ReturnCode_t remove_component(RTC::LightweightRTObject_ptr comp) { return ExecutionContextBase::removeComponent(comp); } protected: virtual RTC::ReturnCode_t onAddingComponent(RTC::LightweightRTObject rtobj) { // コンポーネント追加時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、コンポーネントの追加は行われない。 return RTC::RTC_OK; } virtual RTC::ReturnCode_t onAddedComponent(RTC::LightweightRTObject rtobj) { // コンポーネント追加時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、removeComponent() が呼び出され、 // 追加されたコンポーネントが削除される。 return RTC::RTC_OK; } virtual RTC::ReturnCode_t onRemovingComponent(RTC::LightweightRTObject rtobj) { // コンポーネント削除時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、コンポーネントの削除は行われない。 return RTC::RTC_OK; } virtual RTC::ReturnCode_t onRemovedComponent(RTC::LightweightRTObject rtobj) { // コンポーネント追加時に実行したい処理を記述 // RTC::RTC_OK 以外を返した場合、addComponent() が呼び出され、 // 削除されたコンポーネントが再び追加される。 return RTC::RTC_OK; }
実行コンテキストの情報取得に関する関数は、get_component_state(), get_kind(), get_profile() の3種類がある。実行コンテキストの実装ク ラスにおいては、ExecutionContextBase のそれぞれ getComponentState(), getKind(), getProfile() を呼び出す形で実装を 行う。これらの関数に関連する protected 仮想関数は onGetComponentState(), onGetKind(), onGetProfile() の3種類ある。こ れらの仮想関数は通常オーバーライドする必要はなく、使用は推奨されな い。ただし、返す情報を変更したい場合は、これらの関数を適切に実装す ることで、呼び出し側に返す値を上書きすることができる。
public: LifeCycleState get_component_state(RTC::LightweightRTObject_ptr comp) { return getComponentState(comp); } ExecutionKind PeriodicExecutionContext::get_kind() { return getKind(); } ExecutionContextProfile* get_profile() { return getProfile(); }
protected: virtual LifeCycleState onGetComponentState(LifeCycleState state) { // 返すstateを書き換えたい場合はこの関数を実装する return state; } virtual ExecutionKind onGetKind(ExecutionKind kind) { // 返すkindを書き換えたい場合はこの関数を実装する return kind; } virtual ExecutionContextProfile* onGetProfile(ExecutionContextProfile*& profile) { // 返すprofileを書き換えたい場合はこの関数を実装する return profile; }
[ExecutionContextBase] <> | +–(1 1) [ExecutionContextWorker ] : EC の worker | <> | +–(1 0..) [RTObjectStateMachine] : StateMachine | +–(1 1) [ExecutionContextProfile] : EC Profileの管理
RTC::ExecutionContextBase::ExecutionContextBase | ( | const char * | name | ) |
仮想デストラクタ
仮想デストラクタ
|
virtual |
仮想デストラクタ
仮想デストラクタ
RTC::ReturnCode_t RTC::ExecutionContextBase::activateComponent | ( | RTC::LightweightRTObject_ptr | comp | ) |
RTコンポーネントをアクティブ化する
Inactive 状態にあるRTコンポーネントをActive に遷移させ、アクティ ブ化する。この操作が呼ばれた結果、on_activate が呼び出される。指 定したRTコンポーネントが参加者リストに含まれない場合は、 BAD_PARAMETER が返される。指定したRTコンポーネントの状態が Inactive 以外の場合は、PRECONDITION_NOT_MET が返される。
comp | アクティブ化対象RTコンポーネント |
RTC::ReturnCode_t RTC::ExecutionContextBase::addComponent | ( | RTC::LightweightRTObject_ptr | comp | ) |
RTコンポーネントを追加する
指定したRTコンポーネントを参加者リストに追加する。追加されたRTコ ンポーネントは attach_context が呼ばれ、Inactive 状態に遷移する。 指定されたRTコンポーネントがnullの場合は、BAD_PARAMETER が返され る。指定されたRTコンポーネントが DataFlowComponent 以外の場合は、 BAD_PARAMETER が返される。
comp | 追加対象RTコンポーネント |
|
virtual |
コンポーネントをバインドする。
コンポーネントをバインドする。
RTC::ReturnCode_t RTC::ExecutionContextBase::deactivateComponent | ( | RTC::LightweightRTObject_ptr | comp | ) |
RTコンポーネントを非アクティブ化する
Inactive 状態にあるRTコンポーネントを非アクティブ化し、Inactive に遷移させる。この操作が呼ばれた結果、on_deactivate が呼び出され る。指定したRTコンポーネントが参加者リストに含まれない場合は、 BAD_PARAMETER が返される。指定したRTコンポーネントの状態が Active 以外の場合は、PRECONDITION_NOT_MET が返される。
|
comp | 非アクティブ化対象RTコンポーネント |
const RTC::RTCList& RTC::ExecutionContextBase::getComponentList | ( | ) | const |
RTコンポーネントの参加者リストを取得する
現在登録されている参加者RTCのリストを取得する。
RTC::LifeCycleState RTC::ExecutionContextBase::getComponentState | ( | RTC::LightweightRTObject_ptr | comp | ) |
RTコンポーネントの状態を取得する
指定したRTコンポーネントの状態(LifeCycleState)を取得する。指定し たRTコンポーネントが参加者リストに含まれない場合は、 UNKNOWN_STATE が返される。
comp | 状態取得対象RTコンポーネント |
RTC::ExecutionKind RTC::ExecutionContextBase::getKind | ( | void | ) | const |
ExecutionKind を取得する
本 ExecutionContext の ExecutionKind を取得する
const char* RTC::ExecutionContextBase::getKindString | ( | RTC::ExecutionKind | kind | ) | const |
ExecutionKind を文字列化する
RTC::ExecutionKind で定義されている PERIODIC, EVENT_DRIVEN, OTHER を文字列化する。
kind | ExecutionKind |
RTC::ExecutionContextService_ptr RTC::ExecutionContextBase::getObjRef | ( | void | ) | const |
CORBA オブジェクト参照の取得
本オブジェクトの ExecutioncontextService としての CORBA オブジェ クト参照を取得する。
const RTC::RTObject_ptr RTC::ExecutionContextBase::getOwner | ( | ) | const |
Ownerコンポーネントの参照を取得する
このECのOwnerであるRTCの参照を取得する。
coil::TimeValue RTC::ExecutionContextBase::getPeriod | ( | void | ) | const |
RTC::ExecutionContextProfile* RTC::ExecutionContextBase::getProfile | ( | void | ) |
Profileを取得する
RTC::ExecutionContextProfile を取得する。取得した ExecutionContextProfile の所有権は呼び出し側にある。取得されたオ ブジェクトが不要になった場合、呼び出し側が開放する責任を負う。
const RTC::ExecutionContextProfile& RTC::ExecutionContextBase::getProfile | ( | void | ) | const |
Profileを取得する
RTC::ExecutionContextProfile を取得する。
const coil::Properties RTC::ExecutionContextBase::getProperties | ( | ) | const |
Propertiesを取得する
ExecutionContextProfile::properties を取得する。
double RTC::ExecutionContextBase::getRate | ( | void | ) | const |
ExecutionContext の実行周期(Hz)を取得する
Active 状態にてRTコンポーネントが実行される周期(単位:Hz)を取得す る。
const char* RTC::ExecutionContextBase::getStateString | ( | RTC::LifeCycleState | state | ) |
|
virtual |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
CORBA::Boolean RTC::ExecutionContextBase::isRunning | ( | ) |
ExecutionContext 実行状態確認関数
この操作は ExecutionContext が Runnning 状態の場合に true を返す。 返り値は、start() 関数が呼ばれたあとはRunning状態となり true を、stop() 関数が呼ばれたあとはStopped状態となりfalseを返す。
|
inlineprotectedvirtual |
RTC_exp::PeriodicExecutionContextで再実装されています。
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
RTC_exp::PeriodicExecutionContextで再実装されています。
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
RTC_exp::PeriodicExecutionContextで再実装されています。
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
RTC_exp::PeriodicExecutionContextで再実装されています。
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
RTC::ReturnCode_t RTC::ExecutionContextBase::removeComponent | ( | RTC::LightweightRTObject_ptr | comp | ) |
RTコンポーネントを参加者リストから削除する
指定したRTコンポーネントを参加者リストから削除する。削除された RTコンポーネントは detach_context が呼ばれる。指定されたRTコンポー ネントが参加者リストに登録されていない場合は、BAD_PARAMETER が返 される。
comp | 削除対象RTコンポーネント |
RTC::ReturnCode_t RTC::ExecutionContextBase::resetComponent | ( | RTC::LightweightRTObject_ptr | comp | ) |
RTコンポーネントをリセットする
Error 状態のRTコンポーネントの復帰を試みる。この操作が呼ばれた結 果、on_reset が呼び出される。指定したRTコンポーネントが参加者リ ストに含まれない場合は、BAD_PARAMETER が返される。指定したRTコン ポーネントの状態が Error 以外の場合は、PRECONDITION_NOT_MET が返 される。
comp | リセット対象RTコンポーネント |
RTC::ReturnCode_t RTC::ExecutionContextBase::setKind | ( | RTC::ExecutionKind | kind | ) |
ExecutionKind を設定する
この ExecutionContext の ExecutionKind を設定する
kind | ExecutionKind |
void RTC::ExecutionContextBase::setObjRef | ( | RTC::ExecutionContextService_ptr | ec_ptr | ) |
CORBA オブジェクト参照の取得
本オブジェクトの ExecutioncontextService としての CORBA オブジェ クト参照を取得する。
RTC::ReturnCode_t RTC::ExecutionContextBase::setOwner | ( | RTC::LightweightRTObject_ptr | comp | ) |
Ownerコンポーネントをセットする。
このECのOwnerとなるRTCをセットする。
comp | OwnerとなるRTコンポーネント |
void RTC::ExecutionContextBase::setProperties | ( | coil::Properties & | props | ) |
Propertiesをセットする
ExecutionContextProfile::properties をセットする。
props | ExecutionContextProfile::properties にセットするプ ロパティー |
RTC::ReturnCode_t RTC::ExecutionContextBase::setRate | ( | double | rate | ) |
ExecutionContext の実行周期(Hz)を設定する
Active 状態にてRTコンポーネントが実行される周期(単位:Hz)を設定す る。実行周期の変更は、DataFlowComponentAction の on_rate_changed によって各RTコンポーネントに伝達される。
rate | 処理周期(単位:Hz) |
RTC::ReturnCode_t RTC::ExecutionContextBase::start | ( | void | ) |
ExecutionContext の実行を開始
ExecutionContext の実行状態を Runnning とするためのリクエストを 発行する。ExecutionContext の状態が遷移すると ComponentAction::on_startup が呼び出される。参加しているRTコンポー ネントが、初期化されるまで ExecutionContext を開始することはでき ない。ExecutionContext は複数回開始/停止を繰り返すことができる。
|
virtual |
ExecutionContext の実行を停止
ExecutionContext の状態を Stopped とするためのリクエストを発行す る。遷移が発生した場合は、ComponentAction::on_shutdown が呼び出 される。参加しているRTコンポーネントが終了する前に ExecutionContext を停止する必要がある。ExecutionContext は複数回 開始/停止を繰り返すことができる。
RTC_exp::PeriodicExecutionContext, RTC::ExtTrigExecutionContext, RTC::OpenHRPExecutionContextで再実装されています。
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
mutableprotected |