メインページ | モジュール | 名前空間一覧 | クラス階層 | 構成 | ファイル一覧 | 名前空間メンバ | 構成メンバ | ファイルメンバ | 関連ページ

toppers/diagnostics.hpp

解説を見る。
00001 /*
00002  *  TOPPERS/C++ API Template Library
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      C++ API Template Library
00005  *
00006  *  Copyright (C) 2004 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  *  @(#) $Id: diagnostics.hpp,v 1.1.1.1 2004/04/14 09:30:28 takagi-n Exp $
00036  */
00037 
00052 #ifndef TOPPERS_DIAGNOSTICS_HPP_
00053 #define TOPPERS_DIAGNOSTICS_HPP_
00054 
00055 #include <toppers/kernel.hpp>
00056 #include <toppers/assert.hpp>
00057 #include <cstdlib>
00058 
00059 #ifndef TOPPERS_DEFAULT_DIAGNOSTICS
00060 #define TOPPERS_DEFAULT_DIAGNOSTICS null_diagnostics
00061 #endif
00062 
00063 namespace toppers
00064 {
00065 
00077     class null_diagnostics
00078     {
00079     public:
00080         enum
00081         {
00083             use_exception = false
00084         };
00085 
00087         static ER_UINT handle_error(ER_UINT ercd)
00088         {
00089             return ercd;
00090         }
00091 
00093         static ER_UINT static_handle_error(ER_UINT ercd)
00094         {
00095             return ercd;
00096         }
00097 
00099         static void panic()
00100         {
00101             std::abort();
00102         }
00103     };
00104 
00105     typedef ER_UINT (*error_handler_type)(ER_UINT);
00106 
00125     template <class T = void>
00126     class error_handler_diagnostics
00127     {
00128     public:
00129         typedef error_handler_type handler_type;
00130 
00131         enum
00132         {
00134             use_exception = true
00135         };
00136 
00138         static ER_UINT handle_error(ER_UINT ercd)
00139         {
00140             return ercd < 0 ? (*handler_)(ercd) : ercd;
00141         }
00142 
00144         static ER_UINT static_handle_error(ER_UINT ercd)
00145         {
00146             return handle_error(ercd);
00147         }
00148 
00150         static void panic()
00151         {
00152             std::abort();
00153         }
00154 
00156         static handler_type set_error_handler(handler_type handler)
00157         {
00158             handler_type prev = handler_;
00159             handler_ = handler;
00160             return prev;
00161         }
00162 
00163     private:
00164         static error_handler_type handler_;
00165     };
00166 
00167     template <class T>
00168     error_handler_type error_handler_diagnostics<T>::handler_;
00169 
00182     template <class T = void>
00183     class polymorphic_diagnostics : protected error_handler_diagnostics<T>
00184     {
00185         typedef error_handler_diagnostics<T>    super;
00186 
00187     public:
00188         enum
00189         {
00191             use_exception = true
00192         };
00193 
00195         virtual ~polymorphic_diagnostics()
00196         {
00197         }
00198 
00200         virtual ER_UINT handle_error(ER_UINT ercd) const
00201         {
00202             return super::handle_error(ercd);
00203         }
00204 
00206         virtual void panic() const
00207         {
00208             return super::panic();
00209         }
00210     };
00211 
00212     namespace detail
00213     {
00214 
00215         extern "C" const char* itron_strerror(ER) throw();
00216 
00217     }
00218 
00220     inline const char* strerror(ER ercd)
00221     {
00222         return detail::itron_strerror(ercd);
00223     }
00224 
00225 }
00226 
00227 #endif  // ! TOPPERS_DIAGNOSTICS_HPP_