Solution46
CString.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// 文字列クラス実装ファイル
4 ///
5 /// 文字列クラス実装ファイルです。
6 ///
7 /// $Id: CString.cpp 245 2019-03-20 15:03:41Z admin $
8 /// $Date: 2019-03-21 00:03:41 +0900 (2019/03/21 (木)) $
9 /// $Author: admin $
10 ///
11 /// @attention なし
12 
13 #pragma managed( push, off )
14 
15 //=============================================================================
16 // インクルードファイル
17 #include <CString.h>
18 #include <stdio.h>
19 #include <algorithm>
20 
21 //=============================================================================
22 // 共通ライブラリ名前空間
23 namespace LibCommon {
24  //=========================================================================
25  // 文字列クラス
26  //=========================================================================
27  // 構築子と解体子
28  //-------------------------------------------------------------------------
29  // コンストラクタ
30  CString::CString() noexcept
31  // メンバ変数初期化
32  : m_pszBuffer( nullptr )
33  , m_nSize( 0 )
34  , m_nCount( 0 )
35  {}
36 
37  //-------------------------------------------------------------------------
38  // コンストラクタ
39  CString::CString( wchar_t const& rChar ) noexcept
40  // 移譲コンストラクタ
41  : CString()
42  {
43  // コピーする
44  Copy( rChar );
45  }
46 
47  //-------------------------------------------------------------------------
48  // コンストラクタ
49  CString::CString( wchar_t const* pszString ) noexcept
50  // 移譲コンストラクタ
51  : CString()
52  {
53  // コピーする
54  Copy( pszString );
55  }
56 
57  //-------------------------------------------------------------------------
58  // コンストラクタ
59  CString::CString( wchar_t const* pszString, int nCount ) noexcept
60  // 移譲コンストラクタ
61  : CString()
62  {
63  // コピーする
64  Copy( pszString, nCount );
65  }
66 
67  //-------------------------------------------------------------------------
68  // コンストラクタ
69  CString::CString( char const* pszMbString ) noexcept
70  // 移譲コンストラクタ
71  : CString()
72  {
73  // コピーする
74  Copy( pszMbString );
75  }
76 
77  //-------------------------------------------------------------------------
78  // コンストラクタ
79  CString::CString( char const* pszMbString, int nCount ) noexcept
80  // 移譲コンストラクタ
81  : CString()
82  {
83  // コピーする
84  Copy( pszMbString, nCount );
85  }
86 
87  //-------------------------------------------------------------------------
88  // コンストラクタ
89  CString::CString( std::initializer_list< wchar_t const > const& rcInitializer ) noexcept
90  // 移譲コンストラクタ
91  : CString()
92  {
93  // コピーする
94  Copy( rcInitializer );
95  }
96 
97  //-------------------------------------------------------------------------
98  // コピーコンストラクタ
99  CString::CString( CString const& rcInstance ) noexcept
100  // 移譲コンストラクタ
101  : CString()
102  {
103  // コピーする
104  Copy( rcInstance );
105  }
106 
107  //-------------------------------------------------------------------------
108  // ムーブコンストラクタ
109  CString::CString( CString&& rcInstance ) noexcept
110  // 移譲コンストラクタ
111  : CString()
112  {
113  // ムーブする
114  Move( std::move( rcInstance ) );
115  }
116 
117  //-------------------------------------------------------------------------
118  // デストラクタ
119  CString::~CString() noexcept {
120  // クリアする
121  Clear();
122  }
123 
124  //=========================================================================
125  // 公開演算子オーバーロード関数
126  //-------------------------------------------------------------------------
127  // コピー代入演算子オーバーロード関数
128  CString& CString::operator=( CString const& rcInstance ) noexcept {
129  // コピーする
130  Copy( rcInstance );
131 
132  // インスタンス参照を返す
133  return *this;
134  }
135 
136  //-------------------------------------------------------------------------
137  // ムーブ代入演算子オーバーロード関数
138  CString& CString::operator=( CString&& rcInstance ) noexcept {
139  // ムーブする
140  Move( std::move( rcInstance ) );
141 
142  // インスタンス参照を返す
143  return *this;
144  }
145 
146  //-------------------------------------------------------------------------
147  // 代入演算子オーバーロード関数
148  CString& CString::operator=( wchar_t const& rChar ) noexcept {
149  // コピーする
150  Copy( rChar );
151 
152  // インスタンス参照を返す
153  return *this;
154  }
155 
156  //-------------------------------------------------------------------------
157  // 代入演算子オーバーロード関数
158  CString& CString::operator=( wchar_t const* pszString ) noexcept {
159  // コピーする
160  Copy( pszString );
161 
162  // インスタンス参照を返す
163  return *this;
164  }
165 
166  //-------------------------------------------------------------------------
167  // 代入演算子オーバーロード関数
168  CString& CString::operator=( char const* pszMbString ) noexcept {
169  // コピーする
170  Copy( pszMbString );
171 
172  // インスタンス参照を返す
173  return *this;
174  }
175 
176  //-------------------------------------------------------------------------
177  // 代入演算子オーバーロード関数
178  CString& CString::operator=( std::initializer_list< wchar_t const > const& rcInitializer ) noexcept {
179  // コピーする
180  Copy( rcInitializer );
181 
182  // インスタンス参照を返す
183  return *this;
184  }
185 
186  //-------------------------------------------------------------------------
187  // 加算代入演算子オーバーロード関数
188  CString& CString::operator+=( CString const& rcInstance ) noexcept {
189  // 追加する
190  Append( rcInstance );
191 
192  // インスタンス参照を返す
193  return *this;
194  }
195 
196  //-------------------------------------------------------------------------
197  // 加算代入演算子オーバーロード関数
198  CString& CString::operator+=( wchar_t const& rChar ) noexcept {
199  // 追加する
200  Append( rChar );
201 
202  // インスタンス参照を返す
203  return *this;
204  }
205 
206  //-------------------------------------------------------------------------
207  // 加算代入演算子オーバーロード関数
208  CString& CString::operator+=( wchar_t const* pszString ) noexcept {
209  // 追加する
210  Append( pszString );
211 
212  // インスタンス参照を返す
213  return *this;
214  }
215 
216  //-------------------------------------------------------------------------
217  // 加算代入演算子オーバーロード関数
218  CString& CString::operator+=( char const* pszMbString ) noexcept {
219  // 追加する
220  Append( pszMbString );
221 
222  // インスタンス参照を返す
223  return *this;
224  }
225 
226  //-------------------------------------------------------------------------
227  // 加算代入演算子オーバーロード関数
228  CString& CString::operator+=( std::initializer_list< wchar_t const > const& rcInitializer ) noexcept {
229  // 追加する
230  Append( rcInitializer );
231 
232  // インスタンス参照を返す
233  return *this;
234  }
235 
236  //-------------------------------------------------------------------------
237  // 配列添字演算子オーバーロード関数
238  wchar_t& CString::operator[]( int nIndex ) noexcept {
239  // 静的文字コード
240  static wchar_t ch;
241 
242  // 処理ブロック
243  wchar_t* result = &ch;
244  do {
245  // インデックスを調べる
246  if ( ( 0 > nIndex ) || ( m_nCount <= nIndex ) ) {
247  // 失敗!
248  break;
249  }
250 
251  // 成功!
252  result = &m_pszBuffer[ nIndex ];
253  } while ( false );
254 
255  // 実行結果を返す
256  return *result;
257  }
258 
259  //=========================================================================
260  // 公開関数
261  //-------------------------------------------------------------------------
262  // クリア関数
263  void CString::Clear() noexcept {
264  // バッファを削除する
265  delete[] m_pszBuffer;
266 
267  // メンバ変数を初期化する
268  m_pszBuffer = nullptr;
269  m_nSize = 0;
270  m_nCount = 0;
271  }
272 
273  //-------------------------------------------------------------------------
274  // バッファ作成関数
275  bool CString::CreateBuffer( int nSize ) noexcept {
276  // 処理ブロック
277  bool result = false;
278  do {
279  // バッファサイズを調べる
280  if ( m_nCount >= nSize ) {
281  // 失敗!
282  break;
283  }
284  // バッファサイズを調べる
285  else if ( m_nSize != nSize ) {
286  // 新規バッファを作成する
287  wchar_t* pNewBuffer = new wchar_t[ nSize ];
288  if ( nullptr == pNewBuffer ) {
289  // 失敗!
290  break;
291  }
292  // 巡回する
293  else for ( int nIndex = 0; m_nCount > nIndex; ++nIndex ) {
294  // 文字コードをコピーする
295  pNewBuffer[ nIndex ] = m_pszBuffer[ nIndex ];
296  }
297 
298  // 巡回する
299  for ( int nIndex = m_nCount; nSize > nIndex; ++nIndex ) {
300  // 文字コードをクリアする
301  ::memset( &pNewBuffer[ nIndex ], 0, sizeof( wchar_t ) );
302  }
303 
304  // 既存バッファを削除する
305  delete[] m_pszBuffer;
306 
307  // バッファポインタとバッファサイズを設定する
308  m_pszBuffer = pNewBuffer;
309  m_nSize = nSize;
310  }
311 
312  // 成功!
313  result = true;
314  } while ( false );
315 
316  // 実行結果を返す
317  return result;
318  }
319 
320  //-------------------------------------------------------------------------
321  // バッファサイズ更新関数
322  bool CString::UpdateBuffer( int nCount ) noexcept {
323  // 処理ブロック
324  bool result = false;
325  do {
326  // 文字数とバッファサイズを比較する
327  if ( m_nSize < nCount ) {
328  // 終端文字コード分を追加したセグメント単位のバッファサイズを取得する
329  int nSize = ( ( nCount + GetSegmentSize() ) / GetSegmentSize() * GetSegmentSize() );
330 
331  // バッファを作成する
332  if ( !CreateBuffer( nSize ) ) {
333  // 失敗!
334  break;
335  }
336  }
337 
338  // 成功!
339  result = true;
340  } while ( false );
341 
342  // 実行結果を返す
343  return result;
344  }
345 
346  //-------------------------------------------------------------------------
347  // バッファサイズコンパクト化関数
348  bool CString::CompactBuffer() noexcept {
349  // 処理ブロック
350  bool result = false;
351  do {
352  // バッファサイズとバッファカウントを比較する
353  if ( m_nSize > ( m_nCount + 1 ) ) {
354  // バッファを作成する
355  if ( !CreateBuffer( m_nCount + 1 ) ) {
356  // 失敗!
357  break;
358  }
359  }
360 
361  // 成功!
362  result = true;
363  } while ( false );
364 
365  // 実行結果を返す
366  return result;
367  }
368 
369  //-------------------------------------------------------------------------
370  // コピー関数
371  bool CString::Copy( CString const& rcInstance ) noexcept {
372  // クリアする
373  Clear();
374 
375  // 挿入する
376  return Insert( 0, rcInstance );
377  }
378 
379  //-------------------------------------------------------------------------
380  // コピー関数
381  bool CString::Copy( wchar_t const& rChar ) noexcept {
382  // クリアする
383  Clear();
384 
385  // 挿入する
386  return Insert( 0, rChar );
387  }
388 
389  //-------------------------------------------------------------------------
390  // コピー関数
391  bool CString::Copy( wchar_t const* pszString ) noexcept {
392  // クリアする
393  Clear();
394 
395  // 挿入する
396  return Insert( 0, pszString );
397  }
398 
399  //-------------------------------------------------------------------------
400  // コピー関数
401  bool CString::Copy( wchar_t const* pszString, int nCount ) noexcept {
402  // クリアする
403  Clear();
404 
405  // 挿入する
406  return Insert( 0, pszString, nCount );
407  }
408 
409  //-------------------------------------------------------------------------
410  // コピー関数
411  bool CString::Copy( char const* pszMbString ) noexcept {
412  // クリアする
413  Clear();
414 
415  // 挿入する
416  return Insert( 0, pszMbString );
417  }
418 
419  //-------------------------------------------------------------------------
420  // コピー関数
421  bool CString::Copy( char const* pszMbString, int nCount ) noexcept {
422  // クリアする
423  Clear();
424 
425  // 挿入する
426  return Insert( 0, pszMbString, nCount );
427  }
428 
429  //-------------------------------------------------------------------------
430  // コピー関数
431  bool CString::Copy( std::initializer_list< wchar_t const > const& rcInitializer ) noexcept {
432  // クリアする
433  Clear();
434 
435  // 挿入する
436  return Insert( 0, rcInitializer );
437  }
438 
439  //-------------------------------------------------------------------------
440  // ムーブ関数
441  bool CString::Move( CString&& rcInstance ) noexcept {
442  // 処理ブロック
443  bool result = false;
444  do {
445  // クリアする
446  Clear();
447 
448  // メンバ変数をコピーする
449  m_pszBuffer = rcInstance.m_pszBuffer;
450  m_nSize = rcInstance.m_nSize;
451  m_nCount = rcInstance.m_nCount;
452 
453  // ムーブ元インスタンスのメンバ変数を初期化する
454  rcInstance.m_pszBuffer = nullptr;
455  rcInstance.m_nSize = 0;
456  rcInstance.m_nCount = 0;
457 
458  // 成功!
459  result = true;
460  } while ( false );
461 
462  // 実行結果を返す
463  return result;
464  }
465 
466  //-------------------------------------------------------------------------
467  // 追加関数
468  bool CString::Append( CString const& rcInstance ) noexcept {
469  // 挿入する
470  return Insert( m_nCount, rcInstance );
471  }
472 
473  //-------------------------------------------------------------------------
474  // 追加関数
475  bool CString::Append( wchar_t const& rChar ) noexcept {
476  // 挿入する
477  return Insert( m_nCount, rChar );
478  }
479 
480  //-------------------------------------------------------------------------
481  // 追加関数
482  bool CString::Append( wchar_t const* pszString ) noexcept {
483  // 挿入する
484  return Insert( m_nCount, pszString );
485  }
486 
487  //-------------------------------------------------------------------------
488  // 追加関数
489  bool CString::Append( wchar_t const* pszString, int nCount ) noexcept {
490  // 挿入する
491  return Insert( m_nCount, pszString, nCount );
492  }
493 
494  //-------------------------------------------------------------------------
495  // 追加関数
496  bool CString::Append( char const* pszMbString ) noexcept {
497  // 挿入する
498  return Insert( m_nCount, pszMbString );
499  }
500 
501  //-------------------------------------------------------------------------
502  // 追加関数
503  bool CString::Append( char const* pszMbString, int nCount ) noexcept {
504  // 挿入する
505  return Insert( m_nCount, pszMbString, nCount );
506  }
507 
508  //-------------------------------------------------------------------------
509  // 追加関数
510  bool CString::Append( std::initializer_list< wchar_t const > const& rcInitializer ) noexcept {
511  // 挿入する
512  return Insert( m_nCount, rcInitializer );
513  }
514 
515  //-------------------------------------------------------------------------
516  // 挿入関数
517  bool CString::Insert( int nIndex, CString const& rcInstance ) noexcept {
518  // 挿入する
519  return Insert( nIndex, rcInstance.m_pszBuffer, rcInstance.m_nCount );
520  }
521 
522  //-------------------------------------------------------------------------
523  // 挿入関数
524  bool CString::Insert( int nIndex, wchar_t const& rChar ) noexcept {
525  // 挿入する
526  return Insert( nIndex, &rChar, 1 );
527  }
528 
529  //-------------------------------------------------------------------------
530  // 挿入関数
531  bool CString::Insert( int nIndex, wchar_t const* pszString ) noexcept {
532  // 処理ブロック
533  bool result = false;
534  do {
535  // バッファポインタを調べる
536  if ( nullptr == pszString ) {
537  // 失敗!
538  break;
539  }
540 
541  // 文字数を取得する
542  int nCount = static_cast< int >( ::wcslen( pszString ) );
543 
544  // 挿入する
545  result = Insert( nIndex, pszString, nCount );
546  } while ( false );
547 
548  // 実行結果を返す
549  return result;
550  }
551 
552  //-------------------------------------------------------------------------
553  // 挿入関数
554  bool CString::Insert( int nIndex, char const* pszMbString ) noexcept {
555  // 処理ブロック
556  bool result = false;
557  do {
558  // バッファポインタを調べる
559  if ( nullptr == pszMbString ) {
560  // 失敗!
561  break;
562  }
563 
564  // 文字数を取得する
565  int nCount = static_cast< int >( ::strlen( pszMbString ) );
566 
567  // 挿入する
568  result = Insert( nIndex, pszMbString, nCount );
569  } while ( false );
570 
571  // 実行結果を返す
572  return result;
573  }
574 
575  //-------------------------------------------------------------------------
576  // 挿入関数
577  bool CString::Insert( int nIndex, wchar_t const* pszString, int nCount ) noexcept {
578  // 処理ブロック
579  bool result = false;
580  do {
581  // バッファポインタを調べる
582  if ( nullptr == pszString ) {
583  // 失敗!
584  break;
585  }
586  // インデックスを調べる
587  else if ( ( 0 > nIndex ) || ( m_nCount < nIndex ) ) {
588  // 失敗!
589  break;
590  }
591  // 文字数を調べる
592  else if ( 0 > nCount ) {
593  // 失敗!
594  break;
595  }
596  // バッファサイズを更新する
597  else if ( !UpdateBuffer( m_nCount + nCount ) ) {
598  // 失敗!
599  break;
600  }
601 
602  // 移動文字数を取得する
603  int nMove = ( m_nCount - nIndex );
604  if ( 0 < nMove ) {
605  // 巡回する
606  wchar_t* pDst = &m_pszBuffer[ m_nCount + nCount - 1 ];
607  wchar_t const* pSrc = &m_pszBuffer[ m_nCount - 1 ];
608  for ( ; 0 < nMove; --nMove ) {
609  // 文字コードをコピーする
610  *pDst-- = *pSrc--;
611  }
612  }
613 
614  // 文字数を更新する
615  m_nCount += nCount;
616 
617  // 巡回する
618  wchar_t const* pSrc = pszString;
619  wchar_t* pDst = &m_pszBuffer[ nIndex ];
620  for ( ; 0 < nCount; --nCount ) {
621  // 文字コードをコピーする
622  *pDst++ = *pSrc++;
623  }
624 
625  // 成功!
626  result = true;
627  } while ( false );
628 
629  // 実行結果を返す
630  return result;
631  }
632 
633  //-------------------------------------------------------------------------
634  // 挿入関数
635  bool CString::Insert( int nIndex, char const* pszMbString, int nCount ) noexcept {
636  // 処理ブロック
637  bool result = false;
638  do {
639  // 文字列ポインタを調べる
640  if ( nullptr == pszMbString ) {
641  // 失敗!
642  break;
643  }
644 
645  // ワイド文字列バッファサイズを取得する
646  int nCount = ::MultiByteToWideChar( CP_ACP, 0, pszMbString, -1, nullptr, 0 );
647  if ( 0 >= nCount ) {
648  // 失敗!
649  break;
650  }
651 
652  // ワイド文字列バッファを作成する
653  int nSize = ( nCount + 1 );
654  wchar_t* pszBuffer = new wchar_t[ nSize ];
655  if ( nullptr == pszBuffer ) {
656  // 失敗!
657  break;
658  }
659  // 処理ブロック
660  else do {
661  // ワイド文字列に変換する
662  if ( nCount != ::MultiByteToWideChar( CP_ACP, 0, pszMbString, -1, pszBuffer, nSize ) ) {
663  // 失敗!
664  break;
665  }
666  // 挿入する
667  else if ( !Insert( nIndex, pszBuffer, nCount ) ) {
668  // 失敗!
669  break;
670  }
671 
672  // 成功!
673  result = true;
674  } while ( false );
675 
676  // ワイド文字列バッファを削除する
677  delete[] pszBuffer;
678  } while ( false );
679 
680  // 実行結果を返す
681  return result;
682  }
683 
684  //-------------------------------------------------------------------------
685  // 挿入関数
686  bool CString::Insert( int nIndex, std::initializer_list< wchar_t const > const& rcInitializer ) noexcept {
687  // 処理ブロック
688  bool result = false;
689  do {
690  // 巡回する
691  for ( auto pcIter = rcInitializer.begin();; ++pcIter ) {
692  // イテレータを調べる
693  if ( rcInitializer.end() == pcIter ) {
694  // 成功!
695  result = true;
696  break;
697  }
698 
699  // 挿入する
700  if ( !Insert( nIndex++, *pcIter ) ) {
701  // 失敗!
702  break;
703  }
704  }
705  } while ( false );
706 
707  // 実行結果を返す
708  return result;
709  }
710 
711  //-------------------------------------------------------------------------
712  // 削除関数
713  bool CString::Remove() noexcept {
714  // 削除する
715  return Remove( m_nCount - 1 );
716  }
717 
718  //-------------------------------------------------------------------------
719  // 削除関数
720  bool CString::Remove( int nIndex ) noexcept {
721  // 削除する
722  return Remove( nIndex, 1 );
723  }
724 
725  //-------------------------------------------------------------------------
726  // 削除関数
727  bool CString::Remove( int nIndex, int nCount ) noexcept {
728  // 処理ブロック
729  bool result = false;
730  do {
731  // インデックスを調べる
732  if ( ( 0 > nIndex ) || ( m_nCount <= nIndex ) ) {
733  // 失敗!
734  break;
735  }
736  // 文字数を調べる
737  else if ( ( m_nCount - nIndex ) < nCount ) {
738  // 失敗!
739  break;
740  }
741 
742  // 移動文字数を取得する
743  int nMove = ( m_nCount - nIndex - nCount );
744  if ( 0 < nMove ) {
745  // 巡回する
746  for ( ; 0 < nMove; --nMove, ++nIndex ) {
747  // 文字コードをコピーする
748  m_pszBuffer[ nIndex ] = m_pszBuffer[ nIndex + nCount ];
749  }
750  }
751 
752  // 巡回する
753  for ( ; m_nCount > nIndex; ++nIndex ) {
754  // 文字コードをクリアする
755  ::memset( &m_pszBuffer[ nIndex ], 0, sizeof( wchar_t ) );
756  }
757 
758  // 文字数を更新する
759  m_nCount -= nCount;
760 
761  // 成功!
762  result = true;
763  } while ( false );
764 
765  // 実行結果を返す
766  return result;
767  }
768 
769  //-------------------------------------------------------------------------
770  // 取得関数
771  bool CString::Get( int nIndex, wchar_t& rChar ) const noexcept {
772  // 処理ブロック
773  bool result = false;
774  do {
775  // インデックスを調べる
776  if ( ( 0 > nIndex ) || ( m_nCount <= nIndex ) ) {
777  // 失敗!
778  break;
779  }
780 
781  // 文字コードを取得する
782  rChar = m_pszBuffer[ nIndex ];
783 
784  // 成功!
785  result = true;
786  } while ( false );
787 
788  // 実行結果を返す
789  return result;
790  }
791 
792  //-------------------------------------------------------------------------
793  // 設定関数
794  bool CString::Set( int nIndex, wchar_t const& rChar ) noexcept {
795  // 処理ブロック
796  bool result = false;
797  do {
798  // インデックスを調べる
799  if ( ( 0 > nIndex ) || ( m_nCount <= nIndex ) ) {
800  // 失敗!
801  break;
802  }
803 
804  // 文字コードを設定する
805  m_pszBuffer[ nIndex ] = rChar;
806 
807  // 成功!
808  result = true;
809  } while ( false );
810 
811  // 実行結果を返す
812  return result;
813  }
814 
815  //-------------------------------------------------------------------------
816  // 検索関数
817  int CString::Find( wchar_t const& rChar ) const noexcept {
818  // 処理ブロック
819  int result = -1;
820  do {
821  // 巡回する
822  for ( int nIndex = 0; m_nCount > nIndex; ++nIndex ) {
823  // 文字コードを調べる
824  if ( rChar == m_pszBuffer[ nIndex ] ) {
825  // 成功!
826  result = nIndex;
827  break;
828  }
829  }
830  } while ( false );
831 
832  // 実行結果を返す
833  return result;
834  }
835 
836  //-------------------------------------------------------------------------
837  // プッシュ関数
838  bool CString::Push( wchar_t const& rChar ) noexcept {
839  // 追加する
840  return Append( rChar );
841  }
842 
843  //-------------------------------------------------------------------------
844  // プッシュ関数
845  bool CString::Push( wchar_t const* pszString ) noexcept {
846  // 追加する
847  return Append( pszString );
848  }
849 
850  //-------------------------------------------------------------------------
851  // プッシュ関数
852  bool CString::Push( wchar_t const* pszString, int nCount ) noexcept {
853  // 追加する
854  return Append( pszString, nCount );
855  }
856 
857  //-------------------------------------------------------------------------
858  // プッシュ関数
859  bool CString::Push( char const* pszMbString ) noexcept {
860  // 追加する
861  return Append( pszMbString );
862  }
863 
864  //-------------------------------------------------------------------------
865  // プッシュ関数
866  bool CString::Push( char const* pszMbString, int nCount ) noexcept {
867  // 追加する
868  return Append( pszMbString, nCount );
869  }
870 
871  //-------------------------------------------------------------------------
872  // プッシュ関数
873  bool CString::Push( std::initializer_list< wchar_t const > const& rcInitializer ) noexcept {
874  // 追加する
875  return Append( rcInitializer );
876  }
877 
878  //-------------------------------------------------------------------------
879  // ポップ関数
880  bool CString::Pop( wchar_t& rChar ) noexcept {
881  // 処理ブロック
882  bool result = false;
883  do {
884  // 文字数を取得する
885  if ( !Get( ( m_nCount - 1 ), rChar ) ) {
886  // 失敗!
887  break;
888  }
889  // 削除する
890  else if ( Remove() ) {
891  // 失敗!
892  break;
893  }
894 
895  // 成功!
896  result = true;
897  } while ( false );
898 
899  // 実行結果を返す
900  return result;
901  }
902 
903  //-------------------------------------------------------------------------
904  // ポップフロント関数
905  bool CString::PopFront( wchar_t& rChar ) noexcept {
906  // 処理ブロック
907  bool result = false;
908  do {
909  // 文字数を取得する
910  if ( !Get( 0, rChar ) ) {
911  // 失敗!
912  break;
913  }
914  // 削除する
915  else if ( Remove( 0 ) ) {
916  // 失敗!
917  break;
918  }
919 
920  // 成功!
921  result = true;
922  } while ( false );
923 
924  // 実行結果を返す
925  return result;
926  }
927 
928  //-------------------------------------------------------------------------
929  // 書式設定文字列代入関数
930  wchar_t const* CString::Format( wchar_t const* pszFormat, ... ) noexcept {
931  // 処理ブロック
932  wchar_t const* result = nullptr;
933  do {
934  // 引数リストを作成する
935  va_list vaArgs;
936  va_start( vaArgs, pszFormat );
937 
938  // 引数リスト書式設定文字列を代入する
939  result = FormatArgs( pszFormat, vaArgs );
940 
941  // 引数リストを解放する
942  va_end( vaArgs );
943  } while ( false );
944 
945  // 実行結果を返す
946  return result;
947  }
948 
949  //-------------------------------------------------------------------------
950  // 引数リスト書式設定文字列代入関数
951  wchar_t const* CString::FormatArgs( wchar_t const* pszFormat, va_list vaArgs ) noexcept {
952  // 処理ブロック
953  wchar_t const* result = nullptr;
954  do {
955  // 書式設定文字列ポインタを調べる
956  if ( nullptr == pszFormat ) {
957  // 失敗!
958  break;
959  }
960 
961  // 文字列バッファサイズを取得する
962  int nCount = ::_vscwprintf( pszFormat, vaArgs );
963  if ( 0 >= nCount ) {
964  // 失敗!
965  break;
966  }
967 
968  // クリアする
969  Clear();
970 
971  // バッファサイズを更新する
972  if ( !UpdateBuffer( nCount ) ) {
973  // 失敗!
974  break;
975  }
976  // 書式設定文字列を展開する
977  else if ( nCount != ::vswprintf_s( m_pszBuffer, ( nCount + 1 ), pszFormat, vaArgs ) ) {
978  // 失敗!
979  break;
980  }
981 
982  // 文字数を設定する
983  m_nCount = nCount;
984 
985  // 成功!
986  result = m_pszBuffer;
987  } while ( false );
988 
989  // 実行結果を返す
990  return result;
991  }
992 }
993 
994 #pragma managed( pop )
virtual bool Remove() noexcept
削除関数
Definition: CString.cpp:713
virtual bool Insert(int nIndex, std::initializer_list< wchar_t const > const &rcInitializer) noexcept
挿入関数
Definition: CString.cpp:686
virtual bool Move(CString &&rcInstance) noexcept
ムーブ関数
Definition: CString.cpp:441
virtual bool Push(wchar_t const &rChar) noexcept
プッシュ関数
Definition: CString.cpp:838
virtual ~CString() noexcept
デストラクタ
Definition: CString.cpp:119
wchar_t * m_pszBuffer
文字列ポインタ
Definition: CString.h:916
virtual bool Copy(CString const &rcInstance) noexcept
コピー関数
Definition: CString.cpp:371
virtual bool CreateBuffer(int nSize) noexcept
バッファ作成関数
Definition: CString.cpp:275
virtual bool Insert(int nIndex, CString const &rcInstance) noexcept
挿入関数
Definition: CString.cpp:517
virtual bool Append(CString const &rcInstance) noexcept
追加関数
Definition: CString.cpp:468
共通ライブラリ名前空間
Definition: CArray.h:23
CString() noexcept
コンストラクタ
Definition: CString.cpp:30
virtual bool Get(int nIndex, wchar_t &rChar) const noexcept
取得関数
Definition: CString.cpp:771
virtual CString & operator+=(CString const &rcInstance) noexcept
加算代入演算子オーバーロード関数
Definition: CString.cpp:188
virtual CString & operator=(CString const &rcInstance) noexcept
コピー代入演算子オーバーロード関数
Definition: CString.cpp:128
virtual wchar_t const * Format(wchar_t const *pszFormat,...) noexcept
書式設定文字列代入関数
Definition: CString.cpp:930
virtual bool CompactBuffer() noexcept
バッファサイズコンパクト化関数
Definition: CString.cpp:348
virtual bool Set(int nIndex, wchar_t const &rChar) noexcept
設定関数
Definition: CString.cpp:794
文字列クラス
Definition: CString.h:31
virtual bool UpdateBuffer(int nCount) noexcept
バッファサイズ更新関数
Definition: CString.cpp:322
virtual bool Pop(wchar_t &rChar) noexcept
ポップ関数
Definition: CString.cpp:880
virtual int GetSegmentSize() const noexcept
セグメントサイズ取得関数
Definition: CString.h:192
virtual void Clear() noexcept
クリア関数
Definition: CString.cpp:263
int m_nSize
バッファサイズ
Definition: CString.h:917
virtual wchar_t & operator[](int nIndex) noexcept
配列添字演算子オーバーロード関数
Definition: CString.cpp:238
virtual bool PopFront(wchar_t &rChar) noexcept
ポップフロント関数
Definition: CString.cpp:905
virtual int Find(wchar_t const &rChar) const noexcept
検索関数
Definition: CString.cpp:817
virtual wchar_t const * FormatArgs(wchar_t const *pszFormat, va_list vaArgs) noexcept
引数リスト書式設定文字列代入関数
Definition: CString.cpp:951
int m_nCount
要素数
Definition: CString.h:918
文字列クラスヘッダファイル