Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
u8string.h
[詳解]
1 //############################################################################
2 /*!
3  @brief Unicode文字列用補助ツール群
4  @ingroup TheolizerLib
5  @file u8string.h
6  @author Yoshinori Tahara
7  @date 2015/09/02 Created
8 
9 @par ①u8string:下記文字エンコード間のコンバート機能を提供する
10  char UTF-8<br>
11  wchar_t UTF-16/32<br>
12  char16_t UTF-16<br>
13  char32_t UTF-32<br>
14 
15 @par ②Windows用Multi Byte対応機能を提供する<br>
16  registerStream()にて登録したiostreamに対して、<br>
17  Windows APIを用いてu8stringのMulti Byteとのコンバートを行う。<br>
18  デフォルトにて、std::cint, std::cout, std::cerrを登録している。<br>
19  - std::istream : ulti Byte → UTF-8, UTF-16, UTF-32<br>
20  - std::ostream : UTF-8, UTF-16, UTF-32 → Multi Byte<br>
21 
22 @par ③コンバート・エラー発生時、ConvertError例外を投げる
23 
24 @note
25 Visual Studioのchar型文字列リテラルは、デフォルトではMulti Byte文字エンコードである。<br>
26 Visual Studio 2015以降ならば、u8"任意文字列"の書式にてUTF-8文字エンコードできる。<br>
27 
28 */
29 
30 /*
31  © 2016 Theoride Technology (http://theolizer.com/) All Rights Reserved.
32  "Theolizer" is a registered trademark of Theoride Technology.
33 
34  "Theolizer" License
35  In the case where you are in possession of a valid “Theolizer” License,
36  you may use this file in accordance with the terms and conditions of
37  the use license determined by Theoride Technology.
38 
39  General Public License Version 3 ("GPLv3")
40  You may use this file in accordance with the terms and conditions of
41  GPLv3 published by Free Software Foundation.
42  Please confirm the contents of GPLv3 at https://www.gnu.org/licenses/gpl.txt .
43  A copy of GPLv3 is also saved in a LICENSE.TXT file.
44 
45  商用ライセンス
46  あなたが有効なTheolizer商用ライセンスを保持している場合、
47  セオライド テクノロジーの定める使用許諾書の条件に従って、
48  このファイルを取り扱うことができます。
49 
50  General Public License Version 3(以下GPLv3)
51  Free Software Foundationが公表するGPLv3の使用条件に従って、
52  あなたはこのファイルを取り扱うことができます。
53  GPLv3の内容を https://www.gnu.org/licenses/gpl.txt にて確認して下さい。
54  またGPLv3のコピーをLICENSE.TXTファイルにおいてます。
55 */
56 //############################################################################
57 
58 #if !defined(THEOLIZER_INTERNAL_U8STRING_H)
59 #define THEOLIZER_INTERNAL_U8STRING_H
60 
61 #include "internal/external.h" // インクルード漏れチェックのため
62 
63 // iosfwd警告抑止(DLL用ビルド時に発生する)
64 #ifdef _MSC_VER
65  #pragma warning(push)
66  #pragma warning(disable:4702)
67 #endif
68 #include <string>
69 #ifdef _MSC_VER
70  #pragma warning(pop)
71 #endif
72 
73 #include <iostream>
74 
75 //############################################################################
76 // Begin
77 //############################################################################
78 
79 // ***************************************************************************
80 // DLL用の警告禁止
81 // ***************************************************************************
82 
83 #ifdef _MSC_VER
84  #pragma warning(push)
85  #pragma warning(disable:4251)
86 #endif
87 
88 namespace theolizer
89 {
90 
91 //############################################################################
92 // Multi Byte文字エンコード管理
93 //############################################################################
94 
95 // ***************************************************************************
96 // Multi Byteのコードページ管理
97 // 下記Windows APIで用いるコードページを管理する
98 // MultiByteToWideChar
99 // WideCharToMultiByte
100 // デフォルトは::GetACP()で取得した値(システム・ロケールのコードページ)
101 // 非Windowsの場合、65001(UTF-8)固定
102 // ***************************************************************************
103 
104 //! @ingroup Unicode
105 //! WindowsのCP_ACPと同じ値
106 extern const THEOLIZER_INTERNAL_DLL unsigned kCP_ACP;
107 
108 //! @ingroup Unicode
109 //! WindowsのCP_UTF8と同じ値
110 extern const THEOLIZER_INTERNAL_DLL unsigned kCP_UTF8;
111 
112 //! @ingroup Unicode
113 //! 現在のコード・ページ獲得
114 unsigned THEOLIZER_INTERNAL_DLL getACP();
115 
116 //! @ingroup Unicode
117 //! コード・ページ設定:失敗時false返却(非Windowsは常にtrue)
118 bool THEOLIZER_INTERNAL_DLL setACP(unsigned iCodePage);
119 
120 // ***************************************************************************
121 // istream/ostream管理
122 //
123 // ***************************************************************************
124 
125 // ---<<< i/ostreamの登録 >>>---
126 
127 //! @ingroup Unicode
128 //! Multi Byte変換する対象としてstd::istreamを登録する。
129 bool THEOLIZER_INTERNAL_DLL registerStream(std::istream* iIStream);
130 
131 //! @ingroup Unicode
132 //! Multi Byte変換する対象としてstd::ostreamを登録する。
133 bool THEOLIZER_INTERNAL_DLL registerStream(std::ostream* iOStream);
134 
135 //! @ingroup Unicode
136 //! Multi Byte変換する対象としてstd::iostreamを登録する。
137 bool THEOLIZER_INTERNAL_DLL registerStream(std::iostream* iIOStream);
138 
139 // ---<<< i/ostreamの解除 >>>---
140 
141 //! @ingroup Unicode
142 //! std::istreamをMulti Byte変換する対象から解除する。
143 bool THEOLIZER_INTERNAL_DLL unregisterStream(std::istream* iIStream);
144 
145 //! @ingroup Unicode
146 //! std::ostreamをMulti Byte変換する対象から解除する。
147 bool THEOLIZER_INTERNAL_DLL unregisterStream(std::ostream* iOStream);
148 
149 //! @ingroup Unicode
150 //! std::iostreamをMulti Byte変換する対象から解除する。
151 bool THEOLIZER_INTERNAL_DLL unregisterStream(std::iostream* iIOStream);
152 
153 // ---<<< UTF-8でやりとりするi/ostream判定 >>>---
154 
155 //! @ingroup Unicode
156 //! Multi Byte変換しない(UTF-8で入力する)時、true返却。
157 bool THEOLIZER_INTERNAL_DLL isInputByUtf8(std::istream* iIStream);
158 
159 //! @ingroup Unicode
160 //! Multi Byte変換しない(UTF-8で出力する)時、true返却。
161 bool THEOLIZER_INTERNAL_DLL isOutputByUtf8(std::ostream* iOStream);
162 
163 //############################################################################
164 // 文字列エンコード・コンバーター
165 // tCharIn*を受け取り、文字エンコードを変換して
166 // basic_string<tCharOut>として出力する。
167 //
168 // tCharIn, tCharOutは、下記を使用可能。
169 // char UTF-8
170 // wchar_t UTF-16/32
171 // char16_t UTF-16
172 // char32_t UTF-32
173 //############################################################################
174 
175 //! @ingroup Unicode
176 //! Multi Byteを指定するマーカー・クラス
177 struct MultiByte { };
178 
179 // ***************************************************************************
180 // UTF-8/UTF-16/32変換用クラス・テンプレート
181 // ***************************************************************************
182 
183 namespace internal
184 {
185 #ifndef THEOLIZER_INTERNAL_DOXYGEN
186 
187 template<class tCharOut, class tCharIn>
188 struct Converter
189 {
190  static std::basic_string<tCharOut> THEOLIZER_INTERNAL_DLL conv(tCharIn const* iIn) noexcept;
191  static std::basic_string<tCharOut> conv(std::basic_string<tCharIn> const& iIn) noexcept
192  {
193  return conv(iIn.c_str());
194  }
195 };
196 
197 // ***************************************************************************
198 // Multi Byte用特殊化
199 // ***************************************************************************
200 
201 // ---<<< Multi Byteを入力する >>>---
202 
203 template<class tCharOut>
204 struct Converter<tCharOut, MultiByte>
205 {
206  static std::basic_string<tCharOut> THEOLIZER_INTERNAL_DLL conv(char const* iIn) noexcept;
207  static std::basic_string<tCharOut> conv(std::string const& iIn) noexcept
208  {
209  return conv(iIn.c_str());
210  }
211 };
212 
213 // ---<<< Multi Byteを出力する >>>---
214 
215 template<class tCharIn>
216 struct Converter<MultiByte, tCharIn>
217 {
218  static std::string THEOLIZER_INTERNAL_DLL conv(tCharIn const* iIn) noexcept;
219  static std::string conv(std::basic_string<tCharIn> const& iIn) noexcept
220  {
221  return conv(iIn.c_str());
222  }
223 };
224 
225 #endif // THEOLIZER_INTERNAL_DOXYGEN
226 } // namespace internal
227 
228 //############################################################################
229 /*!
230  @section u8string UTF-8文字列クラス
231 
232  @brief Unicode記録用文字列クラスu8string
233  @details std::stringを派生し、Unicode間のエンコード変換機能を追加したクラス<br>
234  Multi Byte文字エンコードとの変換も提供する。<br>
235  テンプレート・パラメータとして、下記を使用可能。<br>
236    char UTF-8<br>
237    wchar_t UTF-16/32<br>
238    char16_t UTF-16<br>
239    char32_t UTF-32<br>
240 
241  下記コンバート機能を追加する<br>
242    コンストラクタ<br>
243    代入演算子<br>
244    明示的basic_string<他char型>取出し<br>
245      std::string get_string() const;<br>
246      std::wstring get_wstring() const;<br>
247      std::u16string get_u16string() const;<br>
248      std::u32string get_u32string() const;<br>
249    basic_string<他char型>へのキャスト演算子<br>
250      operator std::string() const;<br>
251      operator std::wstring() const;<br>
252      operator std::u16string() const;<br>
253      operator std::u32string() const;<br>
254    Multi Byte用コンバータ<br>
255      basic_string<char> getMultiByte() const;<br>
256      void setMultiByte(char const*);<br>
257    fstream用ファイル名返却<br>
258      ?string getXString() const;<br>
259 <br>
260  スレッド・セーフ性:basic_string<>と同等<br>
261  const指定されている関数同士は別スレッドからアクセスしても問題ない。<br>
262  しかし、そうでない関数を別スレッドから呼び出してはいけない。<br>
263 <br>
264  備忘録:<br>
265  各中継マクロは、mStringデータ・メンバのみの前提で作っている。<br>
266  @ingroup Unicode
267 */
268 //############################################################################
269 
270 // ***************************************************************************
271 // 本体
272 // ***************************************************************************
273 
274 class THEOLIZER_INTERNAL_DLL u8string
275 {
276 //----------------------------------------------------------------------------
277 // データ実体
278 //----------------------------------------------------------------------------
279 
280  std::string mString;
281 
282 public:
283 
284 //----------------------------------------------------------------------------
285 // コンストラクタ
286 //----------------------------------------------------------------------------
287 
288 // ---<<< mStringのコンストラクタへ中継 >>>---
289 
290  /*! コンストラクタ */
291  u8string() : mString() { }
292  /*! コンストラクタ */
293  u8string(std::string const& str) : mString(str) { }
294  /*! コンストラクタ */
295  u8string(std::string const& str, std::size_t pos, std::size_t len = std::string::npos)
296  : mString(str, pos, len) { }
297  /*! コンストラクタ */
298  u8string(char const* s) : mString(s) { }
299  /*! コンストラクタ */
300  u8string(char const* s, std::size_t n) : mString(s, n) { }
301  /*! コンストラクタ */
302  u8string(std::size_t n, char c) : mString(n, c) { }
303  /*! コンストラクタ */
304  template <class InputIterator>
305  u8string(InputIterator first, InputIterator last)
306  : mString(first, last) { }
307  /*! コンストラクタ */
308  u8string(std::initializer_list<char> il) : mString(il) { }
309  /*! コンストラクタ */
310  u8string(std::string&& str) noexcept : mString(str) { }
311 
312 // ---<<< コンバーター・コンストラクタ >>>---
313 
314  /*! 内部マクロ */
315  #define THEOLIZER_INTERNAL_CONSTRUCTOR(dFromChar) \
316  /*! コンストラクタ */ \
317  u8string(const dFromChar* iIn) : \
318  mString(internal::Converter<char, dFromChar>::conv(iIn)) { } \
319  /*! コンストラクタ */ \
320  u8string(const std::basic_string<dFromChar>& iIn) : \
321  mString(internal::Converter<char, dFromChar>::conv(iIn)) { }
322 
326  #undef THEOLIZER_INTERNAL_CONSTRUCTOR
327 
328  /*! Multi Byte文字列からコンストラクト */
329  u8string(char const* iIn, MultiByte) :
330  mString(internal::Converter<char, MultiByte>::conv(iIn)) { }
331  /*! Multi Byte文字列からコンストラクト */
332  u8string(std::string const& iIn, MultiByte) :
333  mString(internal::Converter<char, MultiByte>::conv(iIn)) { }
334 
335 //----------------------------------------------------------------------------
336 // 各種関数中継
337 // メンバ 関数:パラメータが文字列1つだけのものについて対応。
338 // フレンド関数:パラメータが文字列2つだけのものについて対応。
339 //----------------------------------------------------------------------------
340 
341 // ---<<< メンバ関数 >>>---
342 
343  /*! 内部マクロ */
344  #define THEOLIZER_INTERNAL_FUNCTION(dFunc) \
345  u8string& dFunc(const u8string& iIn) { \
346  mString.dFunc(iIn.mString); \
347  return *this; \
348  }
349 
350  /*! 代入演算子 */
352  /*! 代入演算子 */
354  /*! 代入演算子 */
356  /*! 代入演算子 */
358  #undef THEOLIZER_INTERNAL_FUNCTION
359 
360 // ---<<< フレンド関数 >>>---
361 
362  /*! 連結演算子 */
363  friend u8string operator+(u8string const& lhs, u8string const& rhs)
364  {
365  return std::operator+(lhs.mString, rhs.mString);
366  }
367  /*! 連結演算子 */
368  friend u8string operator+(u8string const& lhs, char const* rhs)
369  {
370  return std::operator+(lhs.mString, rhs);
371  }
372  /*! 連結演算子 */
373  friend u8string operator+(char const* lhs, u8string const& rhs)
374  {
375  return std::operator+(lhs, rhs.mString);
376  }
377 
378  /*! 内部マクロ */
379  #define THEOLIZER_INTERNAL_FRIEND_RELATIONAL_OPERATOR(dFunc) \
380  /*! 比較演算子 */ \
381  friend bool dFunc(const u8string& lhs, const u8string& rhs) \
382  { \
383  return std::dFunc(lhs.mString, rhs.mString); \
384  } \
385  /*! 比較演算子 */ \
386  friend bool dFunc(const u8string& lhs, char const* rhs) \
387  { \
388  return std::dFunc(lhs.mString, rhs); \
389  } \
390  /*! 比較演算子 */ \
391  friend bool dFunc(char const* lhs, const u8string& rhs) \
392  { \
393  return std::dFunc(lhs, rhs.mString); \
394  }
395 
402  #undef THEOLIZER_INTERNAL_FRIEND_RELATIONAL_OPERATOR
403 
404  /*! 交換 */
405  friend void swap(u8string& lhs, u8string& rhs)
406  {
407  std::swap(lhs.mString, rhs.mString);
408  }
409 
410  /*! 入力演算子 */
411  friend std::istream& operator>>(std::istream& iIStream, u8string& rhs)
412  {
413  if (theolizer::isInputByUtf8(&iIStream))
414  {
415  std::operator>>(iIStream, rhs.mString);
416  }
417  else
418  {
419  std::string aString;
420  std::operator>>(iIStream, aString);
421  rhs.mString=theolizer::internal::Converter<char, theolizer::MultiByte>::conv(aString);
422  }
423  return iIStream;
424  }
425 
426  /*! 出力演算子 */
427  friend std::ostream& operator<<(std::ostream& iOStream, u8string const& rhs)
428  {
429  if (theolizer::isOutputByUtf8(&iOStream))
430  {
431  std::operator<<(iOStream, rhs.mString);
432  }
433  else
434  {
435  std::operator<<(iOStream,
436  theolizer::internal::Converter<theolizer::MultiByte, char>::conv(rhs.mString));
437  }
438  return iOStream;
439  }
440 
441 //----------------------------------------------------------------------------
442 // 明示的string取り出し
443 //----------------------------------------------------------------------------
444 
445  /*! std::string変換 */
446  std::string& str() {return mString;}
447  /*! std::string変換 */
448  std::string const& str() const {return mString;}
449 
450  /*! C言語文字列変換 */
451  char const* c_str() const {return mString.c_str();}
452 
453 //----------------------------------------------------------------------------
454 // 明示的basic_string<他char型>取出し
455 //----------------------------------------------------------------------------
456 
457  /*! 内部マクロ */
458  #define THEOLIZER_INTERNAL_GET_STRING(dToChar, dName) \
459  std::dName get_##dName() const \
460  { \
461  return internal::Converter<dToChar, char>::conv(mString); \
462  }
463 
464  /*! std::string変換 */
466  /*! std::wstring変換 */
467  THEOLIZER_INTERNAL_GET_STRING(wchar_t, wstring);
468  /*! std::u16string変換 */
469  THEOLIZER_INTERNAL_GET_STRING(char16_t, u16string);
470  /*! std::u32string変換 */
471  THEOLIZER_INTERNAL_GET_STRING(char32_t, u32string);
472  #undef THEOLIZER_INTERNAL_GET_STRING
473 
474 //----------------------------------------------------------------------------
475 // basic_string<>へのキャスト演算子
476 //----------------------------------------------------------------------------
477 
478  /*! キャスト演算子 */
479  operator std::string() const {return get_string();}
480  /*! キャスト演算子 */
481  operator std::wstring() const {return get_wstring();}
482  /*! キャスト演算子 */
483  operator std::u16string() const {return get_u16string();}
484  /*! キャスト演算子 */
485  operator std::u32string() const {return get_u32string();}
486 
487 //----------------------------------------------------------------------------
488 // 各char*型への変換
489 //
490 // 注意事項:
491 // b_str()から取り出した各ポインタは、その文の終わり(;)まで有効。
492 // ;を超えて使うことは想定していない。
493 //----------------------------------------------------------------------------
494 
495  /*! 各char*型への変換補助クラス */
496  class b_string
497  {
498  private:
499  u8string const& mString;
500  std::string mMBstring;
501  std::wstring mWstring;
502  std::u16string mU16string;
503  std::u32string mU32string;
504  public:
505  /*! コンストラクタ */
506  b_string(u8string const& iString) : mString(iString) { }
507 
508  /*! キャスト演算子 */
509  operator char const*() {mMBstring =mString.getMultiByte(); return mMBstring.c_str();}
510  /*! キャスト演算子 */
511  operator const wchar_t*() {mWstring =mString.get_wstring(); return mWstring.c_str();}
512  /*! キャスト演算子 */
513  operator const char16_t*() {mU16string=mString.get_u16string();return mU16string.c_str();}
514  /*! キャスト演算子 */
515  operator const char32_t*() {mU32string=mString.get_u32string();return mU32string.c_str();}
516  };
517 
518  /*! 各char*型への変換関数 */
519  b_string b_str() {return b_string(*this);}
520 
521 //----------------------------------------------------------------------------
522 // Multi Byte変換機能
523 //
524 // 注意事項:
525 // 非Windowsについて、当ライブラリはMulti Byteをサポートしない。
526 // 当変換機能は、UTF-8文字列を出し入れする。
527 //----------------------------------------------------------------------------
528 
529 // ---<<< Multi Byte文字列 >>>---
530 
531  /*! MultiByte文字列を返却 */
532  std::string getMultiByte() const
533  {
534  return internal::Converter<MultiByte, char>::conv(mString);
535  }
536 
537  /*! MultiByte文字列を設定 */
538  u8string& setMultiByte(char const* iIn)
539  {
540  *this = internal::Converter<char, MultiByte>::conv(iIn);
541  return *this;
542  }
543 
544  /*! MultiByte文字列を設定 */
545  u8string& setMultiByte(std::string const& iIn)
546  {
547  *this = internal::Converter<char, MultiByte>::conv(iIn);
548  return *this;
549  }
550 
551 //! std::fstream対応
552 //! MSVC : stkd::wstring(UTF-16)返却
553 //! MinGW : std::string(Multi Byte)返却
554 //! その他 : std::string(UTF-8)返却
555 
556 #if defined(_WIN32)
557  #if defined(_MSC_VER)
558  std::wstring get_fstring() const {return get_wstring();}
559  #else
560  std::string get_fstring() const {return getMultiByte();}
561  #endif
562 #else
563  std::string get_fstring() const {return get_string();}
564 #endif
565 
566 //! boost::filesystem::path対応
567 //! Windows : std::wstring(UTF-16)返却
568 //! その他 : std::string(UTF-8)返却
569 
570 #if defined(_WIN32)
571  std::wstring get_bstring() const {return get_wstring();}
572 #else
573  std::string get_bstring() const {return get_string();}
574 #endif
575 
576 };
577 } // theolizer ------------------- 注意。以降はグローバル名前空間
578 
579 //############################################################################
580 // istream, ostreamグローバル演算子/関数のオーバーロード
581 // operator<<, operator>>, getlineについて下記をオーバーロードし、
582 // 登録されているistream/ostreamについては、Multi Byteに変換する。
583 // 登録されていないものについては、UTF-8に変換する。
584 // なお、cin, cout, cerrはデフォルトで登録される。
585 // operator<<のみ 3つとも
586 // char* std::string
587 // wchar_t* std::wstring
588 // char16_t* std::u16string
589 // char32_t* std::u32string
590 //
591 // 注意事項:
592 // std空間で同様のoperatorが定義されている。
593 // グローバル名前空間以外からこれらの演算子を呼び出すと、
594 // ADLによりstd::ostream, std::istreamからstd空間の演算子が
595 // 呼びだされ、自動変換機能が働かない。
596 // その場合、::operator<<(std::cout, 変数);のようにして呼び出す。
597 // スマートに呼び出せる方法があれば、教えて欲しい。
598 //############################################################################
599 
600 // ***************************************************************************
601 // char型変数用operator<<, operator>>
602 // Windowsでは登録されていたらMulti Byte変換処理する
603 // 非WindowsではMulti Byte非対応なので、不要。
604 // ***************************************************************************
605 
606 #if defined(_WIN32)
607 
608 //----------------------------------------------------------------------------
609 // operator<<(char*)
610 //----------------------------------------------------------------------------
611 
612 inline std::ostream& operator<<(std::ostream& iOStream, char const* iString)
613 {
614  if (theolizer::isOutputByUtf8(&iOStream))
615  {
616  std::operator<<(iOStream, iString);
617  }
618  else
619  {
620  std::operator<<(iOStream,
621  theolizer::internal::Converter<theolizer::MultiByte, char>::conv(iString));
622  }
623  return iOStream;
624 }
625 
626 //----------------------------------------------------------------------------
627 // operator<<(std::string)
628 //----------------------------------------------------------------------------
629 
630 inline std::ostream& operator<<(std::ostream& iOStream, std::string const& iString)
631 {
632  iOStream << iString.c_str();
633  return iOStream;
634 }
635 
636 //----------------------------------------------------------------------------
637 // operator>>(std::string)
638 //----------------------------------------------------------------------------
639 
640 inline std::istream& operator>>(std::istream& iIStream, std::string& iString)
641 {
642  if (theolizer::isInputByUtf8(&iIStream))
643  {
644  std::operator>>(iIStream, iString);
645  }
646  else
647  {
648  std::string aString;
649  std::operator>>(iIStream, aString);
650  iString=theolizer::internal::Converter<char, theolizer::MultiByte>::conv(aString);
651  }
652  return iIStream;
653 }
654 #endif
655 
656 // ***************************************************************************
657 // wchar_t, char16_t, char32_t型変数用operator<<, operator>>
658 // ***************************************************************************
659 
660 #ifndef THEOLIZER_INTERNAL_DOXYGEN
661 
662 //----------------------------------------------------------------------------
663 // operator<< dChar*とbasic_string<dChar>用
664 //----------------------------------------------------------------------------
665 
666 #define THEOLIZER_INTERNAL_LEFT_SHIFT_OPERATOR(dChar) \
667  inline std::ostream& operator<<(std::ostream& iOStream, const dChar* iString)\
668  { \
669  if (theolizer::isOutputByUtf8(&iOStream)) { \
670  std::operator<<(iOStream, \
671  theolizer::internal::Converter<char, dChar>::conv(iString));\
672  } else { \
673  std::operator<<(iOStream, \
674  theolizer::internal::Converter<theolizer::MultiByte, dChar>::conv(iString));\
675  } \
676  return iOStream; \
677  } \
678  inline std::ostream& operator<<(std::ostream& iOStream, \
679  const std::basic_string<dChar>& iString)\
680  { \
681  iOStream << iString.c_str(); \
682  return iOStream; \
683  }
684 
685 THEOLIZER_INTERNAL_LEFT_SHIFT_OPERATOR(wchar_t)
686 THEOLIZER_INTERNAL_LEFT_SHIFT_OPERATOR(char16_t)
687 THEOLIZER_INTERNAL_LEFT_SHIFT_OPERATOR(char32_t)
688 #undef THEOLIZER_INTERNAL_LEFT_SHIFT_OPERATOR
689 
690 //----------------------------------------------------------------------------
691 // operator>> basic_string<dChar>用
692 //----------------------------------------------------------------------------
693 
694 #define THEOLIZER_INTERNAL_RIGHT_SHIFT_OPERATOR(dChar) \
695  inline std::istream& operator>>(std::istream& iIStream,std::basic_string<dChar>& iString)\
696  { \
697  std::string aString; \
698  std::operator>>(iIStream, aString); \
699  if (theolizer::isInputByUtf8(&iIStream)) { \
700  iString=theolizer::internal::Converter<dChar, char>::conv(aString);\
701  } else { \
702  iString=theolizer::internal::Converter<dChar, \
703  theolizer::MultiByte>::conv(aString); \
704  } \
705  return iIStream; \
706  }
707 
708 THEOLIZER_INTERNAL_RIGHT_SHIFT_OPERATOR(wchar_t)
709 THEOLIZER_INTERNAL_RIGHT_SHIFT_OPERATOR(char16_t)
710 THEOLIZER_INTERNAL_RIGHT_SHIFT_OPERATOR(char32_t)
711 #undef THEOLIZER_INTERNAL_RIGHT_SHIFT_OPERATOR
712 
713 #endif // THEOLIZER_INTERNAL_DOXYGEN
714 
715 //############################################################################
716 // End
717 //############################################################################
718 
719 // ***************************************************************************
720 // DLL用の警告禁止解除
721 // ***************************************************************************
722 
723 #ifdef _MSC_VER
724  #pragma warning(pop)
725 #endif
726 
727 #endif // THEOLIZER_INTERNAL_U8STRING_H
bool THEOLIZER_INTERNAL_DLL isOutputByUtf8(std::ostream *iOStream)
bool THEOLIZER_INTERNAL_DLL registerStream(std::istream *iIStream)
theolizer名前空間
Definition: base.h:53
u8string & setMultiByte(char const *iIn)
Definition: u8string.h:538
friend std::ostream & operator<<(std::ostream &iOStream, u8string const &rhs)
Definition: u8string.h:427
#define THEOLIZER_INTERNAL_CONSTRUCTOR(dFromChar)
Definition: u8string.h:315
std::string & str()
Definition: u8string.h:446
u8string & setMultiByte(std::string const &iIn)
Definition: u8string.h:545
u8string(char const *iIn, MultiByte)
Definition: u8string.h:329
std::string getMultiByte() const
Definition: u8string.h:532
#define THEOLIZER_INTERNAL_FUNCTION(dFunc)
Definition: u8string.h:344
friend void swap(u8string &lhs, u8string &rhs)
Definition: u8string.h:405
std::u32string get_u32string() const
Definition: u8string.h:471
u8string(InputIterator first, InputIterator last)
Definition: u8string.h:305
Unicode記録用文字列クラスu8string.
Definition: u8string.h:274
bool THEOLIZER_INTERNAL_DLL isInputByUtf8(std::istream *iIStream)
u8string(std::initializer_list< char > il)
Definition: u8string.h:308
std::string const & str() const
Definition: u8string.h:448
bool THEOLIZER_INTERNAL_DLL setACP(unsigned iCodePage)
const THEOLIZER_INTERNAL_DLL unsigned kCP_ACP
#define THEOLIZER_INTERNAL_FRIEND_RELATIONAL_OPERATOR(dFunc)
Definition: u8string.h:379
std::wstring get_wstring() const
Definition: u8string.h:467
friend u8string operator+(char const *lhs, u8string const &rhs)
Definition: u8string.h:373
u8string(char const *s, std::size_t n)
Definition: u8string.h:300
b_string(u8string const &iString)
Definition: u8string.h:506
unsigned THEOLIZER_INTERNAL_DLL getACP()
#define THEOLIZER_INTERNAL_GET_STRING(dToChar, dName)
Definition: u8string.h:458
u8string(std::string &&str) noexcept
Definition: u8string.h:310
bool THEOLIZER_INTERNAL_DLL unregisterStream(std::istream *iIStream)
const THEOLIZER_INTERNAL_DLL unsigned kCP_UTF8
friend u8string operator+(u8string const &lhs, char const *rhs)
Definition: u8string.h:368
friend u8string operator+(u8string const &lhs, u8string const &rhs)
Definition: u8string.h:363
b_string b_str()
Definition: u8string.h:519
THEOLIZER_INTERNAL_DLL std::ostream & operator<<(std::ostream &iOStream, CheckMode iCheckMode)
CheckModeの表示用オーバーロード
std::string get_bstring() const
Definition: u8string.h:573
u8string(std::string const &str)
Definition: u8string.h:293
friend std::istream & operator>>(std::istream &iIStream, u8string &rhs)
Definition: u8string.h:411
std::string get_fstring() const
Definition: u8string.h:563
u8string(std::string const &str, std::size_t pos, std::size_t len=std::string::npos)
Definition: u8string.h:295
char const * c_str() const
Definition: u8string.h:451
u8string(char const *s)
Definition: u8string.h:298
u8string(std::size_t n, char c)
Definition: u8string.h:302
u8string(std::string const &iIn, MultiByte)
Definition: u8string.h:332
std::u16string get_u16string() const
Definition: u8string.h:469