クラス toppers::itron::kernel_objectカーネルオブジェクト管理クラス
[詳細]
#include "toppers/itron/kernel_object.hpp"
toppers::itron::kernel_objectに対する継承グラフ
[凡例]toppers::itron::kernel_objectのコラボレーション図
[凡例]すべてのメンバ一覧
説明
カーネルオブジェクト管理クラス
kernel_object.hpp の 63 行で定義されています。
関数
bool toppers::itron::kernel_object::analyze |
( |
const static_api & |
api |
) |
[inline] |
|
bool toppers::itron::kernel_object::analyze_id |
( |
const std::string & |
arg |
) |
|
|
|
ID番号の解析
- 引数:
-
- 戻り値:
- 解析に成功すれば true を返す
自動割付け対応整数値パラメータを解析し、数値の場合は id_ に設定し、 識別子の場合は name_ に設定します。
kernel_object.cpp の 238 行で定義されています。
参照元 analyze_parameters(). 00239 {
00240 using namespace boost::spirit;
00241 id_ = -1L;
00242 name_.clear();
00243 if ( parse( arg.begin(), arg.end(), c_int_parser<long>()[ assign_a( id_ ) ] ).full )
00244 {
00245 if ( !do_check_id_range( id_ ) )
00246 {
00247 return false;
00248 }
00249 }
00250 else
00251 {
00252 if ( !parse( arg.begin(), arg.end(), c99_ident_p[ assign_a( name_ ) ] ).full )
00253 {
00254 return false;
00255 }
00256 }
00257 return true;
00258 }
|
bool toppers::itron::kernel_object::analyze_parameters |
( |
const static_api & |
api, |
|
|
const std::string & |
parameters |
|
) |
|
|
|
パラメータリストの解析
- 引数:
-
| api | 静的API情報 |
| parameters | パラメータリスト情報 |
- 戻り値:
- 解析に成功すれば true を返す
パラメータリスト情報に基づいて静的APIの引数を解析します。 パラメータリスト情報 params は次のように、パラメータ文字列を指定します。
const char cre_tsk_params[] = "$tskid { #tskatr exinf task itskpri stksz stk }";
パラメータの種類に応じて、文字列の先頭に記号を付けることができます。 (μITRON 4.0仕様 2.1.11 静的APIの仕様とパラメータを参照)
- '$': 自動割付け対応整数パラメータ
- '': 自動割付け非対応整数パラメータ
- '#': プリプロセッサ定数式パラメータ
- なし: 一般定数式パラメータ
他に、':'で始まるパラメータを記述した場合、静的APIのパラメータから読み取るのでは なく、':'に続く文字列をパラメータの値として設定します。
例えば、":RID"と記述した場合、":RID"をキーとしたフィールドに"RID"を設定します。
パケットの場合は、両端の中括弧("{"および"}")も配列に含めてください。
kernel_object.cpp の 109 行で定義されています。
参照先 _・analyze_id()・toppers::itron::static_api::begin()・toppers::itron::static_api::end()・toppers::error()・toppers::itron::static_api::line()・set(). 00110 {
00111 std::istringstream istr( parameters );
00112 std::vector<std::string> params;
00113 typedef std::istream_iterator<std::string> istream_iterator;
00114 std::copy( istream_iterator( istr ), istream_iterator(), std::back_inserter( params ) );
00115 static_api::const_iterator iter( api.begin() );
00116 static_api::const_iterator last( api.end() );
00117
00118 ++iter;
00119
00120 typedef std::vector<std::string>::const_iterator params_iterator;
00121 for ( params_iterator i( params.begin() ), t( params.end() ); i != t; ++i, ++iter )
00122 {
00123 std::string param( *i );
00124
00125 char ch = param[0];
00126 switch ( ch )
00127 {
00128 case '{':
00129 case '}':
00130 if ( iter == last || *iter != param )
00131 {
00132 static_api::line_type line( api.line() );
00133 std::string token( ")" );
00134 if ( iter != last )
00135 {
00136 token = *iter;
00137 }
00138 error( line.file_.native_file_string(), line.line_, _( "missing `%1%\' before `%2%\'" ) % ch % token );
00139 return false;
00140 }
00141 break;
00142 case '$':
00143 case '%':
00144 if ( iter == last || !analyze_id( *iter ) )
00145 {
00146 static_api::line_type line( api.line() );
00147 std::string token( ")" );
00148 if ( iter != last )
00149 {
00150 token = *iter;
00151 }
00152 error( line.file_.native_file_string(), line.line_, _( "illegal argument `%1%'" ) % token );
00153 return false;
00154 }
00155 set( param, *iter );
00156 break;
00157 case ':':
00158 set( param, param.substr( 1 ) );
00159 break;
00160 case '#':
00161 default:
00162 if ( iter == last )
00163 {
00164 static_api::line_type line( api.line() );
00165 error( line.file_.native_file_string(), line.line_, _( "illegal argument `%1%'" ) % ")" );
00166 return false;
00167 }
00168 set( param, *iter );
00169 break;
00170 }
00171 }
00172 return true;
00173 }
関数の呼び出しグラフ:
|
template<class Iterator> |
static bool toppers::itron::kernel_object::assign_id |
( |
Iterator |
first, |
|
|
Iterator |
last |
|
) |
[inline, static] |
|
|
ID番号に自動割付け
- 引数:
-
- 戻り値:
- ID番号の割付けに成功すれば true を返す
kernel_object.hpp の 124 行で定義されています。
参照元 toppers::itron::cfg_contents::do_classify(). 00125 {
00126 typedef std::vector<kernel_object*> vector_t;
00127 typedef std::map<std::string, vector_t> map_t;
00128 map_t map;
00129 for ( Iterator iter( first ); iter != last; ++iter )
00130 {
00131 std::string key( ( *iter )->get_object_type() );
00132 kernel_object* ptr = &**iter;
00133 map[key].push_back( ptr );
00134 }
00135 for ( map_t::const_iterator iter2( map.begin() ), last2( map.end() ); iter2 != last2; ++iter2 )
00136 {
00137 if ( !iter2->second.empty() && iter2->second.front()->has_id() )
00138 {
00139 if ( !assign_id_helper( iter2->second.begin(), iter2->second.end() ) )
00140 {
00141 return false;
00142 }
00143 }
00144 }
00145 return true;
00146 }
|
bool toppers::itron::kernel_object::assign_id_helper |
( |
std::vector< kernel_object * >::const_iterator |
first, |
|
|
std::vector< kernel_object * >::const_iterator |
last |
|
) |
[static, protected] |
|
|
ID番号の割付補助関数
- 引数:
-
| first | カーネルオブジェクト列の先頭位置 |
| last | カーネルオブジェクト列の終端位置+1 |
- 戻り値:
- ID番号の割付けに成功すれば true を返す
kernel_object.cpp の 266 行で定義されています。
参照先 _・toppers::error()・id()・set(). 00267 {
00268 typedef std::vector<kernel_object*> vector_t;
00269 vector_t::size_type size = last - first;
00270 vector_t t( size, static_cast<kernel_object*>( 0 ) );
00271 std::set<std::string> set;
00272
00273
00274 for ( vector_t::const_iterator iter( first ); iter != last; ++iter )
00275 {
00276 kernel_object* pobj = *iter;
00277 long id = pobj->id();
00278 if ( id > 0 )
00279 {
00280 if ( t[id-1] != 0 )
00281 {
00282 error( _( "id `%1%\' of %2% is duplicated" ) % id % pobj->get_object_type() );
00283 return false;
00284 }
00285 t[id-1] = pobj;
00286 }
00287 else
00288 {
00289 std::string id( pobj->name() );
00290 if ( !set.insert( id ).second )
00291 {
00292 error( _( "id `%1%\' of %2% is duplicated" ) % id % pobj->get_object_type() );
00293 }
00294 }
00295 }
00296
00297 vector_t::size_type pos = 0;
00298 for ( vector_t::const_iterator iter( first ); iter != last; ++iter )
00299 {
00300 kernel_object* pobj = *iter;
00301 long id = pobj->id();
00302 if ( id < 0 )
00303 {
00304 while ( t[pos] != 0 )
00305 {
00306 ++pos;
00307 }
00308 t[pos] = pobj;
00309 pobj->id_ = pos+1;
00310 }
00311 }
00312 return true;
00313 }
関数の呼び出しグラフ:
|
bool toppers::itron::kernel_object::do_analyze |
( |
const static_api & |
api |
) |
[protected, pure virtual] |
|
|
ID情報の取得
- 戻り値:
- ID情報へのスマートポインタを返す
kernel_object.cpp の 223 行で定義されています。
参照元 get_idb(). 00224 {
00225 std::auto_ptr<kernel_id::id_number> ptr( new kernel_id::id_number );
00226 ptr->set( name_, id_ );
00227 return idb_ptr( ptr.release() );
00228 }
|
|
初期化ブロック情報の取得
- 戻り値:
- 初期化ブロック情報へのスマートポインタを返す
kernel_object.cpp の 191 行で定義されています。
参照元 get_inib(). 00192 {
00193 std::auto_ptr<kernel_cfg::initial_block> ptr( new kernel_cfg::initial_block );
00194 ptr->id( id_ );
00195 if ( !name_.empty() )
00196 {
00197 ptr->set( "name", name_ );
00198
00199
00200
00201 if ( id_ < 0 )
00202 {
00203 ptr->id( std::numeric_limits<long>::max() );
00204 }
00205 }
00206 else
00207 {
00208 std::ostringstream osstr;
00209 osstr << id_;
00210 ptr->set( "name", osstr.str() );
00211 }
00212 for ( arg_type::const_iterator iter( args_.begin() ), last( args_.end() ); iter != last; ++iter )
00213 {
00214 ptr->set( iter->first, iter->second );
00215 }
00216 return inib_ptr( ptr.release() );
00217 }
|
const char * toppers::itron::kernel_object::do_get_object_type |
( |
|
) |
const [protected, pure virtual] |
|
bool toppers::itron::kernel_object::do_has_id |
( |
|
) |
const [protected, pure virtual] |
|
const std::string & toppers::itron::kernel_object::get |
( |
const std::string & |
key |
) |
const |
|
const idb_ptr toppers::itron::kernel_object::get_idb |
( |
|
) |
const [inline] |
|
const inib_ptr toppers::itron::kernel_object::get_inib |
( |
|
) |
const [inline] |
|
long toppers::itron::kernel_object::id |
( |
|
) |
const [inline] |
|
const std::string& toppers::itron::kernel_object::name |
( |
|
) |
const [inline] |
|
void toppers::itron::kernel_object::set |
( |
const std::string & |
key, |
|
|
const std::string & |
value |
|
) |
|
|
void toppers::itron::kernel_object::swap |
( |
kernel_object & |
other |
) |
throw () |
|
|
オブジェクトの交換
- 引数:
-
kernel_object.cpp の 74 行で定義されています。 00075 {
00076 std::swap( id_, other.id_ );
00077 name_.swap( other.name_ );
00078 args_.swap( other.args_ );
00079 }
|
このクラスの説明は次のファイルから生成されました:
Copyright © 2006 by TAKAGI Nobuhisa.
このページは Wed Apr 12 16:32:06 2006 に Doxygen によって生成されました。
|
|