3 * Toyohashi Open Platform for Embedded Real-Time Systems
5 * Copyright (C) 2005-2008 by TAKAGI Nobuhisa
7 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
22 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * \file toppers/misc.hpp
40 * \brief 雑多なライブラリのための宣言定義
42 #ifndef TOPPERS_MISC_HPP_
43 #define TOPPERS_MISC_HPP_
54 #include "toppers/codeset.hpp"
55 #include <boost/scoped_array.hpp>
61 #define TOPPERS_STRINGIFY( s ) TOPPERS_STRINGIFY_( s )
62 #define TOPPERS_STRINGIFY_( s ) # s
68 * \class conversion_error misc.hpp "toppers/misc.hpp"
71 class conversion_error : public std::runtime_error
78 explicit conversion_error( std::string const& what ) : std::runtime_error( what ) {}
82 * \brief シングルバイト文字から CharT 型(多くは wchar_t 型)文字への変換
84 * \return CharT 型文字を返す
86 template < typename CharT >
87 inline CharT widen( char ch )
89 return std::use_facet< std::ctype< CharT > >( std::locale() ).widen( ch );
93 inline char widen< char >( char ch )
99 inline unsigned char widen< unsigned char >( char ch )
101 return static_cast< unsigned char >( ch );
105 inline wchar_t widen< wchar_t >( char ch )
107 #if defined( __MINGW32__ )
108 wchar_t wc = wchar_t( -1 );
109 if ( std::mbtowc( &wc, &ch, 1 ) < 0 )
114 #elif defined( __CYGWIN__ )
115 return static_cast< wchar_t >( static_cast< unsigned char >( ch ) );
117 return static_cast< wchar_t >( std::btowc( static_cast< unsigned char >( ch ) ) );
122 * \brief シングルバイト文字列から CharT 型文字列への変換
123 * \param str シングルバイト文字列
124 * \return CharT 型文字列を返す
126 template < typename CharT >
127 std::basic_string< CharT > const widen( std::string const& str );
130 inline std::basic_string< char > const widen( std::string const& str )
136 inline std::basic_string< wchar_t > const widen( std::string const& str )
138 boost::scoped_array< wchar_t > t( new wchar_t[str.size()+1] );
139 if ( std::mbstowcs( t.get(), str.c_str(), str.size() ) == size_t( -1 ) )
141 static conversion_error x( "in function widen" );
152 * \return ch が大文字であれば対応する小文字を、それ以外は ch を返す
154 inline char tolower( char ch )
156 return static_cast< char >( std::tolower( static_cast< unsigned char >( ch ) ) );
162 * \return str に含まれる大文字を小文字に変換した文字列を返す
164 inline std::string const tolower( std::string str )
166 char ( *f )( char ) = &tolower;
167 std::transform( str.begin(), str.end(), str.begin(), f );
172 * \brief ワイド文字列を小文字に変換
174 * \return str に含まれる大文字を小文字に変換したワイド文字列を返す
176 template < class Traits, class Allocator >
177 std::basic_string< wchar_t, Traits, Allocator > const tolower( std::basic_string< wchar_t, Traits, Allocator > str )
179 wint_t ( *f )( wint_t ) = &towlower;
180 std::transform( str.begin(), str.end(), str.begin(), f );
189 * \return ch が小文字であれば対応する大文字を、それ以外は ch を返す
191 inline char toupper( char ch )
193 return static_cast< char >( std::toupper( static_cast< unsigned char >( ch ) ) );
199 * \return str に含まれる小文字を大文字に変換した文字列を返す
201 inline std::string const toupper( std::string str )
203 char ( *f )( char ) = &toupper;
204 std::transform( str.begin(), str.end(), str.begin(), f );
209 * \brief ワイド文字列を大文字に変換
211 * \return str に含まれる小文字を大文字に変換したワイド文字列を返す
213 template < class Traits, class Allocator >
214 std::basic_string< wchar_t, Traits, Allocator > const toupper( std::basic_string< wchar_t, Traits, Allocator > str )
216 wint_t ( *f )( wint_t ) = &towupper;
217 std::transform( str.begin(), str.end(), str.begin(), f );
227 inline bool isspace( char ch )
229 return std::isspace( static_cast< unsigned char >( ch ) ) != 0;
233 * \brief 指定文字で区切られたリスト出力
234 * \param first 出力する先頭要素位置
235 * \param last 出力する終端要素位置+1
236 * \param ostr 出力ストリーム
237 * \param pred 各要素を受け取り出力値を返す述語
240 * この関数は区間 [first, last) の各要素を pred に渡して得られる値を delim
241 * で区切って ostr に出力します。\n
242 * 終端の要素の後には delim は出力されず、要素と要素の間にのみ delim が
245 template < class InputIterator, typename CharT, class Traits, class Pred >
246 void output_list( InputIterator first, InputIterator last, std::basic_ostream< CharT, Traits >& ostr, Pred pred, CharT const* delim = 0 )
250 static CharT const null_delim[] = { 0 };
254 for ( bool f = false; first != last; ++first )
260 ostr << pred( *first );
265 template < typename CharT, class Traits, class Allocator >
266 std::basic_string< CharT, Traits, Allocator > trim( std::basic_string< CharT, Traits, Allocator > const& str, std::basic_string< CharT, Traits, Allocator > const& ws )
268 if ( str.empty() || ws.empty() )
272 typename std::basic_string< CharT, Traits, Allocator >::size_type first = str.find_first_not_of( ws, 0 );
273 for ( typename std::basic_string< CharT, Traits, Allocator >::size_type i = str.size() - 1; i >= 0; i-- )
275 if ( ws.find( str[ i ] ) == ws.npos )
277 return str.substr( first, i );
280 return str.substr( first );
285 #endif // ! TOPPERS_MISC_HPP_