cfg_factory.cpp

00001 /*
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 によって生成されました。