Solution46
CStream.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// ストリームクラス実装ファイル
4 ///
5 /// ストリームクラス実装ファイルです。
6 ///
7 /// $Id: CStream.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 <CStream.h>
18 #include <LibUtility.h>
19 
20 //=============================================================================
21 // インクルード実装ファイル
22 #include <CArray.hpp>
23 
24 //=============================================================================
25 // 共通ライブラリ名前空間
26 namespace LibCommon {
27  //=========================================================================
28  // ストリームクラス
29  //=========================================================================
30  // 構築子と解体子
31  //-------------------------------------------------------------------------
32  // コンストラクタ
33  CStream::CStream() noexcept
34  // 基底クラスコンストラクタ
35  : CStreamOut()
36  {}
37 
38  //=========================================================================
39  // 公開関数
40  //-------------------------------------------------------------------------
41  // 文字列入力関数
42  int CStream::InputString( wchar_t* pszBuffer, int nSize ) noexcept {
43  // 処理ブロック
44  int result = 0;
45  do {
46  // 文字列バッファポインタを調べる
47  if ( nullptr == pszBuffer ) {
48  // 失敗!
49  break;
50  }
51  // 巡回する
52  else for ( int uCount = 0;; ) {
53  // 1文字入力する
54  wchar_t ch;
55  if ( !InputChar( ch ) ) {
56  // 失敗!
57  break;
58  }
59  // 文字コードを調べる
60  else if ( ( L'\n' == ch ) || ( L'\0' == ch ) ) {
61  // 終端文字コードを設定する
62  pszBuffer[ uCount ] = L'\0';
63 
64  // 成功!
65  result = uCount;
66  break;
67  }
68  // 文字コードを調べる
69  else if ( 0 != ::iswprint( ch ) ) {
70  // 入力文字数を調べる
71  if ( ( nSize - 1 ) > uCount ) {
72  // 1文字追加する
73  pszBuffer[ uCount++ ] = ch;
74  }
75  }
76  }
77  } while ( false );
78 
79  // 実行結果を返す
80  return result;
81  }
82 
83  //-------------------------------------------------------------------------
84  // ストリーム終端状態取得関数
85  bool CStream::IsStreamEnd() const noexcept {
86  // 処理ブロック
87  bool result = false;
88  do {
89  // ストリームポインタを調べる
90  if ( GetStreamSize() > GetStreamPoint() ) {
91  // 失敗!
92  break;
93  }
94 
95  // 成功!
96  result = true;
97  } while ( false );
98 
99  // 実行結果を返す
100  return result;
101  }
102 
103  //-------------------------------------------------------------------------
104  // 空白スキップ関数
105  bool CStream::SkipSpace() noexcept {
106  // 処理ブロック
107  bool result = false;
108  do {
109  // 巡回する
110  for ( ;; ) {
111  // 空白文字をスキップする
112  if ( !SkipChar( L" \t\r\n" ) ) {
113  // 終了!
114  break;
115  }
116 
117  // 成功!
118  result = true;
119  }
120  } while ( false );
121 
122  // 実行結果を返す
123  return result;
124  }
125 
126  //-------------------------------------------------------------------------
127  // 1文字スキップ関数
128  bool CStream::SkipChar( wchar_t ch, bool bIgnore ) noexcept {
129  // 処理ブロック
130  bool result = false;
131  do {
132  // ストリームポインタを取得する
133  int nPoint = GetStreamPoint();
134 
135  // 1文字入力する
136  wchar_t ch2;
137  if ( !InputChar( ch2 ) ) {
138  // 失敗!
139  break;
140  }
141  // 文字コードを調べる
142  else if ( !CompareCharCode( ch, ch2, bIgnore ) ) {
143  // ストリームポインタを復元する
144  SetStreamPoint( nPoint );
145 
146  // 失敗!
147  break;
148  }
149 
150  // 成功!
151  result = true;
152  } while ( false );
153 
154  // 実行結果を返す
155  return result;
156  }
157 
158  //-------------------------------------------------------------------------
159  // 1文字スキップ関数
160  bool CStream::SkipChar( wchar_t const* pszString, bool bIgnore ) noexcept {
161  // 処理ブロック
162  bool result = false;
163  do {
164  // 文字列ポインタを調べる
165  if ( nullptr == pszString ) {
166  // 失敗!
167  break;
168  }
169  // 巡回する
170  else for ( ;; ++pszString ) {
171  // 文字コードを調べる
172  if ( L'\0' == *pszString ) {
173  // 失敗!
174  break;
175  }
176  // 1文字スキップする
177  else if ( SkipChar( *pszString, bIgnore ) ) {
178  // 成功!
179  result = true;
180  break;
181  }
182  }
183  } while ( false );
184 
185  // 実行結果を返す
186  return result;
187  }
188 
189  //-------------------------------------------------------------------------
190  // ストリームポインタプッシュ関数
191  bool CStream::PushStreamPoint( CArray< int >* pcPointerList ) noexcept {
192  // 処理ブロック
193  bool result = false;
194  do {
195  // ストリームポインタを取得する
196  int nPoint = GetStreamPoint();
197 
198  // ストリームポインタをプッシュする
199  if ( !pcPointerList->Push( nPoint ) ) {
200  // 失敗!
201  break;
202  }
203 
204  // 成功!
205  result = true;
206  } while ( false );
207 
208  // 実行結果を返す
209  return result;
210  }
211 
212  //-------------------------------------------------------------------------
213  // ストリームポインタポップ関数
214  bool CStream::PopStreamPoint( CArray< int >* pcPointerList, bool bResume ) noexcept {
215  // 処理ブロック
216  bool result = false;
217  do {
218  // ストリームポインタをポップする
219  int nPoint;
220  if ( !pcPointerList->Pop( nPoint ) ) {
221  // 失敗!
222  break;
223  }
224 
225  // 復元フラグを調べる
226  if ( bResume ) {
227  // ストリームポインタを設定する
228  SetStreamPoint( nPoint );
229  }
230 
231  // 成功!
232  result = true;
233  } while ( false );
234 
235  // 実行結果を返す
236  return result;
237  }
238 
239  //=========================================================================
240  // テンプレートクラス明示的インスタンス生成宣言
241  template class LIB_COMMON_API CArray< int >;
242 }
243 
244 #pragma managed( pop )
virtual bool SkipChar(wchar_t ch, bool bIgnore=false) noexcept
1文字スキップ関数
Definition: CStream.cpp:128
LIB_COMMON_API bool CompareCharCode(wchar_t ch1, wchar_t ch2, bool bIgnore) noexcept
文字コード比較関数
Definition: LibUtility.cpp:393
virtual bool InputChar(wchar_t &rCh) noexcept=0
1文字入力関数
配列クラス実装ヘッダファイル
virtual bool IsStreamEnd() const noexcept
ストリーム終端状態取得関数
Definition: CStream.cpp:85
CStream() noexcept
コンストラクタ
Definition: CStream.cpp:33
共通ライブラリ名前空間
Definition: CArray.h:23
virtual int GetStreamPoint() const noexcept
ストリームポインタ取得関数
Definition: CStream.h:105
virtual bool PopStreamPoint(CArray< int > *pcPointerList, bool bResume) noexcept
ストリームポインタポップ数
Definition: CStream.cpp:214
ストリーム出力クラス
Definition: CStreamOut.h:30
virtual bool SetStreamPoint(int nPoint) noexcept
ストリームポインタ設定関数
Definition: CStream.h:118
virtual int InputString(wchar_t *pszBuffer, int nSize) noexcept
文字列入力関数
Definition: CStream.cpp:42
ストリームクラスヘッダファイル
virtual bool PushStreamPoint(CArray< int > *pcPointerList) noexcept
ストリームポインタプッシュ関数
Definition: CStream.cpp:191
virtual bool SkipSpace() noexcept
空白スキップ関数
Definition: CStream.cpp:105
virtual int GetStreamSize() const noexcept
ストリームサイズ取得関数
Definition: CStream.h:94
#define LIB_COMMON_API
ダイナミックライブラリインポート宣言
Definition: LibCommonDef.h:44
ユーティリティライブラリヘッダファイル