class_id.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/fdmp/class_id.cpp
00039  */
00040 #include "toppers/itron/fdmp/class_id.hpp"
00041 #include "toppers/itron/cfg_factory.hpp"
00042 #include "toppers/itron/cfg_contents.hpp"
00043 #include "toppers/reporter.hpp"
00044 #include <sstream>
00045 #include <fstream>
00046 #include <boost/format.hpp>
00047 #include <boost/filesystem/path.hpp>
00048 #include <boost/filesystem/fstream.hpp>
00049 #include <boost/filesystem/exception.hpp>
00050 
00051 namespace toppers
00052 {
00053   namespace itron
00054   {
00055     namespace fdmp
00056     {
00057 
00062       class_id::class_id( const std::string& file ) : kernel_id( file )
00063       {
00064       }
00065 
00066       void class_id::load( const boost::shared_ptr<itron::cfg_contents>& contents )
00067       {
00068         typedef cfg_contents::group_container::const_iterator group_iterator;
00069         const cfg_contents::group_container& container = contents->groups();
00070 
00071         for ( group_iterator giter( contents->groups().begin() ), glast( contents->groups().end() ); giter != glast; ++giter )
00072         {
00073           typedef cfg_group::object_container::const_iterator object_iterator;
00074           const boost::shared_ptr<cfg_group> group( *giter );
00075           for ( object_iterator oiter( group->objects().begin() ), olast( group->objects().end() ); oiter != olast; ++oiter )
00076           {
00077             std::string key;
00078             key = contents->name() + ' ' + ( *oiter )->get_object_type();
00079             insert_id( key, ( *oiter )->get_idb() );
00080           }
00081           classes_.push_back( contents->name() );
00082         }
00083       }
00084    
00085       void class_id::save() const
00086       {
00087         std::ostringstream osstr;
00088         if ( do_save( osstr ) )
00089         {
00090           for ( std::vector<std::string>::const_iterator iter( classes_.begin() ), last( classes_.end() ); iter != last; ++iter )
00091           {
00092             using namespace boost::filesystem;
00093             ofstream ofstr( path( *iter, native )/path( file(), native ) );
00094             if ( ofstr.fail() )
00095             {
00096               error( _( "cannot create file `%1%\'" ) % *iter );
00097             }
00098             ofstr << osstr.str() << std::endl;
00099             ofstr.close();
00100             do_depend();
00101           }
00102         }
00103       }
00104 
00105       void class_id::do_body( std::ostream& ostr ) const
00106       {
00107         std::vector<std::string> object_types( do_get_object_types() );
00108         typedef std::vector<std::string>::const_iterator const_iterator;
00109         long id = 0;
00110 
00111         for ( const_iterator citer( classes_.begin() ), clast( classes_.end() ); citer != clast; ++citer )
00112         {
00113           ++id; // クラスID番号はとりあえず単純な連番
00114           ostr << boost::format( "#define %1%_CLASS_ID\t%2%" ) % *citer % id << "\n\n";
00115           for ( const_iterator titer( object_types.begin() ), tlast( object_types.end() ); titer != tlast; ++titer )
00116           {
00117             const kernel_id::id_array* pids = get_id_array( *citer + ' ' + *titer );
00118             if ( pids != 0 )
00119             {
00120               typedef kernel_id::id_array::const_iterator idb_iterator;
00121               for ( idb_iterator iter( pids->begin() ), last( pids->end() ); iter != last; ++iter )
00122               {
00123                 std::string name( ( *iter )->name() );
00124                 if ( !name.empty() )
00125                 {
00126                   ostr << boost::format( "#define %1%_%2%\t((%1%_CLASS_ID << 16) | %3%)" ) % *citer % name % ( *iter )->value() << '\n';
00127                 }
00128               }
00129             }
00130           }
00131           ostr << '\n';
00132         }
00133       }
00134 
00135       const std::vector<std::string>& class_id::do_get_object_types() const
00136       {
00137         static const char* object_types[] =
00138         {
00139           "task", "semaphore", "eventflag", "dataqueue", "mailbox", "mempfix", "cyclic"
00140         };
00141         static std::vector<std::string> object_type_array( object_types, object_types + sizeof( object_types )/sizeof( object_types[0] ) );
00142         return object_type_array;
00143       }
00144 
00145     }
00146   }
00147 }

Copyright © 2006 by TAKAGI Nobuhisa.
このページは Wed Apr 12 16:31:56 2006 に Doxygen によって生成されました。