Solution46
CStringStream.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// 文字列ストリームクラス実装文字列
4 ///
5 /// 文字列ストリームクラス実装文字列です。
6 ///
7 /// $Id: CStringStream.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 <CStringStream.h>
18 
19 //=============================================================================
20 // インクルード実装ファイル
21 #include <CArray.hpp>
22 
23 //=============================================================================
24 // 共通ライブラリ名前空間
25 namespace LibCommon {
26  //=========================================================================
27  // 文字列ストリームクラス
28  //=========================================================================
29  // 構築子と解体子
30  //-------------------------------------------------------------------------
31  // コンストラクタ
32  CStringStream::CStringStream( wchar_t const* pszString ) noexcept
33  // 基底クラスコンストラクタ
34  : CString( pszString )
35  , CStream()
36  // メンバ変数初期化
37  , m_nStreamPoint( 0 )
38  {}
39 
40  //-------------------------------------------------------------------------
41  // デストラクタ
43  // クリアする
44  Clear();
45  }
46 
47  //=========================================================================
48  // 公開関数
49  //-------------------------------------------------------------------------
50  // クリア関数
51  void CStringStream::Clear() noexcept {
52  // 基底クラスの関数を実行する
54 
55  // メンバ変数を初期化する
56  m_nStreamPoint = 0;
57  }
58 
59  //-------------------------------------------------------------------------
60  // 1文字出力関数
61  bool CStringStream::OutputChar( wchar_t ch ) noexcept {
62  // 処理ブロック
63  bool result = false;
64  do {
65  // ストリームポインタを調べる
66  if ( m_nCount > m_nStreamPoint ) {
67  // 1文字追加する
68  if ( !Push( ch ) ) {
69  // 失敗!
70  break;
71  }
72  }
73  else {
74  // 1文字挿入する
75  if ( !Insert( m_nStreamPoint, ch ) ) {
76  // 失敗!
77  break;
78  }
79  }
80 
81  // ストリームポインタを更新する
83 
84  // 成功!
85  result = true;
86  } while ( false );
87 
88  // 実行結果を返す
89  return result;
90  }
91 
92  //-------------------------------------------------------------------------
93  // 文字列出力関数
94  bool CStringStream::OutputString( wchar_t const* pszString ) noexcept {
95  // 処理ブロック
96  bool result = false;
97  do {
98  // 文字列ポインタを調べる
99  if ( nullptr == pszString ) {
100  // 失敗!
101  break;
102  }
103  // 巡回する
104  else for ( ;; ) {
105  // 文字コードを調べる
106  if ( L'\0' == *pszString ) {
107  // 成功!
108  result = true;
109  break;
110  }
111  // 1文字出力する
112  else if ( !OutputChar( *pszString++ ) ) {
113  // 失敗!
114  break;
115  }
116  }
117  } while ( false );
118 
119  // 実行結果を返す
120  return result;
121  }
122 
123  //-------------------------------------------------------------------------
124  // 1文字入力関数
125  bool CStringStream::InputChar( wchar_t& rCh ) noexcept {
126  // 処理ブロック
127  bool result = false;
128  do {
129  // ストリームポインタを調べる
130  if ( m_nCount <= m_nStreamPoint ) {
131  // 失敗!
132  break;
133  }
134 
135  // 1文字取得する
136  rCh = m_pszBuffer[ m_nStreamPoint++ ];
137 
138  // 成功!
139  result = true;
140  } while ( false );
141 
142  // 実行結果を返す
143  return result;
144  }
145 
146  //=========================================================================
147  // 限定公開関数
148  //-------------------------------------------------------------------------
149  // ストリームポインタ更新関数
150  bool CStringStream::UpdateStreamPoint( int nPoint ) noexcept {
151  // 処理ブロック
152  bool result = false;
153  do {
154  // ストリームポインタを調べる
155  if ( m_nCount < nPoint ) {
156  // 終端ストリームポインタを更新する
157  if ( !UpdateEndPoint( nPoint ) ) {
158  // 失敗!
159  break;
160  }
161  }
162 
163  // ストリームポインタを設定する
164  m_nStreamPoint = nPoint;
165 
166  // 成功!
167  result = true;
168  } while ( false );
169 
170  // 実行結果を返す
171  return result;
172  }
173 
174  //-------------------------------------------------------------------------
175  // 終端ストリームポインタ更新関数
176  bool CStringStream::UpdateEndPoint( int nPoint ) noexcept {
177  // 処理ブロック
178  bool result = false;
179  do {
180  // バッファサイズを更新する
181  if ( !UpdateBuffer( nPoint ) ) {
182  // 失敗!
183  break;
184  }
185  // 巡回する
186  else for ( int nIndex = m_nCount; nPoint > nIndex; ++nIndex ) {
187  // 空白文字を設定する
188  m_pszBuffer[ nIndex ] = L' ';
189  }
190 
191  // 文字数を設定する
192  m_nCount = nPoint;
193 
194  // バッファポインタを調べる
195  if ( nullptr != m_pszBuffer ) {
196  // 終端文字を設定する
197  m_pszBuffer[ nPoint ] = L'\0';
198  }
199 
200  // 成功!
201  result = true;
202  } while ( false );
203 
204  // 実行結果を返す
205  return result;
206  }
207 }
208 
209 #pragma managed( pop )
virtual bool InputChar(wchar_t &rCh) noexcept override
1文字入力関数
virtual bool Push(wchar_t const &rChar) noexcept
プッシュ関数
Definition: CString.cpp:838
CStringStream(wchar_t const *pszString=nullptr) noexcept
コンストラクタ
wchar_t * m_pszBuffer
文字列ポインタ
Definition: CString.h:916
配列クラス実装ヘッダファイル
virtual bool Insert(int nIndex, CString const &rcInstance) noexcept
挿入関数
Definition: CString.cpp:517
共通ライブラリ名前空間
Definition: CArray.h:23
virtual bool UpdateStreamPoint(int nPoint) noexcept
ストリームポインタ更新関数
virtual void Clear() noexcept override
クリア関数
int m_nStreamPoint
ストリームポインタ
virtual bool OutputChar(wchar_t ch) noexcept override
1文字出力関数
ストリームクラス
Definition: CStream.h:31
文字列クラス
Definition: CString.h:31
virtual bool UpdateBuffer(int nCount) noexcept
バッファサイズ更新関数
Definition: CString.cpp:322
virtual bool UpdateEndPoint(int nPoint) noexcept
終端ストリームポインタ更新関数
文字列ストリームクラスヘッダ文字列
virtual void Clear() noexcept
クリア関数
Definition: CString.cpp:263
virtual bool OutputString(wchar_t const *pszString) noexcept override
文字列出力関数
int m_nCount
要素数
Definition: CString.h:918
virtual ~CStringStream() noexcept
デストラクタ