|
|
cfg_factory.cpp00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2005 by Takagi Nobuhisa 00007 * 00008 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00009 * によって公表されている GNU General Public License の Version 2 に記 00010 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00011 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00012 * 利用と呼ぶ)することを無償で許諾する. 00013 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00014 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00015 * スコード中に含まれていること. 00016 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00017 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00018 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00019 * の無保証規定を掲載すること. 00020 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00021 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00022 * と. 00023 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00024 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00025 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00026 * 報告すること. 00027 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00028 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00029 * 00030 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00031 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00032 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00033 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00034 * 00035 */ 00036 00037 /* 00038 * toppers/itron/cfg_factory.cpp 00039 */ 00040 #include "toppers/itron/cfg_factory.hpp" 00041 #include "toppers/itron/cfg_kernel_id.hpp" 00042 #include "toppers/itron/cfg_kernel_cfg.hpp" 00043 #include "toppers/itron/static_api.hpp" 00044 #include "toppers/itron/cfg_contents.hpp" 00045 #include "toppers/cmdline.hpp" 00046 #include "toppers/itron/specified_factory.hpp" 00047 #include <cassert> 00048 00049 namespace toppers 00050 { 00051 namespace itron 00052 { 00053 00060 cfg_factory::cfg_factory( const cmdline::option_array& options, const std::string& version, long prid ) 00061 : factory( options, version ), prid_( prid ) 00062 { 00063 } 00064 00065 const boost::shared_ptr<cfg_contents> cfg_factory::create_cfg_contents( text::const_iterator& next, text::const_iterator last, bool ucn, codeset_t codeset ) const 00066 { 00067 return do_create_cfg_contents( next, last, ucn, ascii ); 00068 } 00069 00076 const boost::shared_ptr<kernel_object> cfg_factory::create_kernel_object( const static_api& api, std::vector<boost::shared_ptr<kernel_object> >& container ) 00077 { 00078 boost::shared_ptr<std::vector<kernel_object::builder_type> > builders( do_get_kernel_object_builders() ); 00079 std::vector<boost::shared_ptr<kernel_object> > t( container ); 00080 boost::shared_ptr<kernel_object> ptr; 00081 typedef std::vector<kernel_object::builder_type>::const_iterator const_iterator; 00082 00083 for ( const_iterator iter( builders->begin() ), last( builders->end() ); iter != last; ++iter ) 00084 { 00085 ptr = ( **iter )( api, t ); 00086 if ( !!ptr ) 00087 { 00088 t.swap( container ); 00089 return ptr; 00090 } 00091 } 00092 if ( !options()->find( "-iapi" ) ) 00093 { 00094 error( api.line().file_.native_file_string(), api.line().line_, _( "static API `%1%\' cannot be unresolved" ) % api[0] ); 00095 } 00096 return ptr; 00097 } 00098 00109 const boost::shared_ptr<cfg_factory> cfg_factory::build( const cmdline::option_array& options, const std::string& version ) 00110 { 00111 typedef std::vector<builder_type>::const_iterator const_iterator; 00112 for ( const_iterator iter( builders().begin() ), last( builders().end() ); iter != last; ++iter ) 00113 { 00114 boost::shared_ptr<cfg_factory> ptr( ( *iter )( options, version ) ); 00115 if ( ptr ) 00116 { 00117 return ptr; 00118 } 00119 } 00120 return boost::shared_ptr<cfg_factory>(); 00121 } 00122 00129 void cfg_factory::register_builder( builder_type builder ) 00130 { 00131 if ( builder != 0 ) 00132 { 00133 builders().push_back( builder ); 00134 } 00135 } 00136 00140 void cfg_factory::clear_builders() 00141 { 00142 builders().clear(); 00143 } 00144 00145 const boost::shared_ptr<cfg_contents> cfg_factory::do_create_cfg_contents( text::const_iterator& next, text::const_iterator last, bool ucn, codeset_t codeset ) const 00146 { 00147 boost::shared_ptr<cfg_contents> ptr( new cfg_contents( ucn, codeset ) ); 00148 if ( !ptr->parse( next, last ) || next != last ) 00149 { 00150 ptr.reset(); 00151 } 00152 return ptr; 00153 } 00154 00155 const boost::shared_ptr<kernel_id> cfg_factory::do_create_kernel_id( const std::string& file ) const 00156 { 00157 return boost::shared_ptr<kernel_id>( new cfg_kernel_id( file ) ); 00158 } 00159 00160 const boost::shared_ptr<kernel_cfg> cfg_factory::do_create_kernel_cfg( const std::string& file, const std::string& id_file ) const 00161 { 00162 return boost::shared_ptr<kernel_cfg>( new cfg_kernel_cfg( file, id_file, prid() ) ); 00163 } 00164 00169 void cfg_factory::global( const boost::shared_ptr<cfg_factory>& factory ) 00170 { 00171 global_factory() = factory; 00172 } 00173 00178 const boost::shared_ptr<cfg_factory> cfg_factory::global() 00179 { 00180 return global_factory(); 00181 } 00182 00190 std::vector<cfg_factory::builder_type>& cfg_factory::builders() 00191 { 00192 static std::vector<builder_type> builders_array; 00193 return builders_array; 00194 } 00195 00203 boost::shared_ptr<cfg_factory>& cfg_factory::global_factory() 00204 { 00205 static boost::shared_ptr<cfg_factory> instance( build( cmdline::option_array(), "" ) ); 00206 return instance; 00207 } 00208 00215 } 00216 } Copyright © 2006 by TAKAGI Nobuhisa. このページは Wed Apr 12 16:31:56 2006 に Doxygen によって生成されました。 |