Solution46
CJsonContainer.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// JSONコンテナクラス実装ファイル
4 ///
5 /// JSONコンテナクラス実装ファイルです。
6 ///
7 /// $Id: CJsonContainer.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 <CJsonContainer.h>
18 #include <CJsonPair.h>
19 #include <CJsonValue.h>
20 #include <CJsonFixed.h>
21 
22 //=============================================================================
23 // インクルード実装ファイル
24 #include <CArray.hpp>
25 
26 //=============================================================================
27 // JSONライブラリ名前空間
28 namespace LibJson {
29  //=========================================================================
30  // JSONコンテナクラス
31  //=========================================================================
32  // 構築子と解体子
33  //-------------------------------------------------------------------------
34  // コンストラクタ
35  CJsonContainer::CJsonContainer( CJson* pcParent ) noexcept
36  // 基底クラスコンストラクタ
37  : CJsonValue( pcParent )
39  {}
40 
41  //-------------------------------------------------------------------------
42  // デストラクタ
44  // クリアする
45  ClearJson();
46  }
47 
48  //=========================================================================
49  // 公開関数
50  //-------------------------------------------------------------------------
51  // JSONクラスクリア関数
52  void CJsonContainer::ClearJson() noexcept {
53  // 基底クラスをクリアする
55 
56  // 巡回する
57  for ( int nIndex = ( m_nCount - 1 ); 0 <= nIndex; --nIndex ) {
58  // JSONクラスを削除する
59  delete m_pBuffer[ nIndex ];
60  m_pBuffer[ nIndex ] = nullptr;
61  }
62  }
63 
64  //-------------------------------------------------------------------------
65  // JSONクラスコンパクト化関数
66  bool CJsonContainer::CompactJson() noexcept {
67  // 処理ブロック
68  bool result = false;
69  do {
70  // 基底クラスをコンパクト化する
71  if ( !CJsonValue::CompactJson() ) {
72  // 失敗!
73  break;
74  }
75  // 巡回する
76  else for ( int nIndex = 0, nCount = m_nCount;; ++nIndex ) {
77  // インデックスを調べる
78  if ( nCount <= nIndex ) {
79  // 成功!
80  result = true;
81  break;
82  }
83  // JSONクラスをコンパクト化する
84  else if ( !m_pBuffer[ nIndex ]->CompactJson() ) {
85  // 失敗!
86  break;
87  }
88  }
89  } while ( false );
90 
91  // 実行結果を返す
92  return result;
93  }
94 
95  //-------------------------------------------------------------------------
96  // JSONクラス入力関数
97  bool CJsonContainer::InputJson( CStream& rcStream ) noexcept {
98  // 処理ブロック
99  bool result = false;
100  do {
101  // クリアする
102  ClearJson();
103 
104  // 入力ストリームポインタをプッシュする
105  if ( !rcStream.PushStreamPoint( m_pcInputPointerList ) ) {
106  // 失敗!
107  break;
108  }
109  // 処理ブロック
110  else do {
111  // 空白をスキップする
112  rcStream.SkipSpace();
113 
114  // 1文字スキップする
115  if ( !rcStream.SkipChar( GetOpenChar() ) ) {
116  // 失敗!
117  break;
118  }
119  // 巡回する
120  else for ( ;; ) {
121  // JSON派生クラスを入力作成する
122  CJson* pcType = CreateInputJsonElement( rcStream, this );
123  if ( nullptr != pcType ) {
124  // JSON派生クラスポインタをプッシュする
125  if ( !Push( pcType ) ) {
126  // クリアする
127  ClearJson();
128 
129  // 失敗!
130  break;
131  }
132 
133  // 空白をスキップする
134  rcStream.SkipSpace();
135 
136  // 1文字スキップする
137  if ( rcStream.SkipChar( L',' ) ) {
138  // 継続する!
139  continue;
140  }
141  }
142 
143  // 空白をスキップする
144  rcStream.SkipSpace();
145 
146  // 1文字スキップする
147  if ( !rcStream.SkipChar( GetCloseChar() ) ) {
148  // クリアする
149  ClearJson();
150 
151  // 失敗!
152  break;
153  }
154  // JSON派生クラスポインタリストバッファをコンパクト化する
155  else if ( !CompactBuffer() ) {
156  // クリアする
157  ClearJson();
158 
159  // 失敗!
160  break;
161  }
162 
163  // 成功!
164  result = true;
165  break;
166  }
167  } while ( false );
168 
169  // 入力ストリームポインタをポップする
170  rcStream.PopStreamPoint( m_pcInputPointerList, !result );
171  } while ( false );
172 
173  // 実行結果を返す
174  return result;
175  }
176 
177  //-------------------------------------------------------------------------
178  // JSONクラス出力関数
179  bool CJsonContainer::OutputJson( CStreamOut& rcStreamOut ) noexcept {
180  // 処理ブロック
181  bool result = false;
182  do {
183  // 1文字出力する
184  if ( !rcStreamOut.OutputChar( GetOpenChar() ) ) {
185  // 失敗!
186  break;
187  }
188  // エレメント数を調べる
189  else if ( 0 >= m_nCount ) {
190  // 1文字出力する
191  if ( !rcStreamOut.OutputChar( GetCloseChar() ) ) {
192  // 失敗!
193  break;
194  }
195 
196  // 成功!
197  result = true;
198  break;
199  }
200 
201  // インデントする
202  if ( !rcStreamOut.Indent() ) {
203  // 失敗!
204  break;
205  }
206  // 巡回する
207  else for ( int nIndex = 0, nCount = m_nCount;; ++nIndex ) {
208  // 改行する
209  if ( !rcStreamOut.OutputNewLine() ) {
210  // 失敗!
211  break;
212  }
213  // インデックスを調べる
214  else if ( nCount == nIndex ) {
215  // アンインデントする
216  if ( !rcStreamOut.Unindent() ) {
217  // 失敗!
218  break;
219  }
220  // インデントを出力する
221  else if ( !rcStreamOut.OutputIndent() ) {
222  // 失敗!
223  break;
224  }
225  // 1文字出力する
226  else if ( !rcStreamOut.OutputChar( GetCloseChar() ) ) {
227  // 失敗!
228  break;
229  }
230 
231  // 成功!
232  result = true;
233  break;
234  }
235  // インデントを出力する
236  else if ( !rcStreamOut.OutputIndent() ) {
237  // 失敗!
238  break;
239  }
240 
241  // JSON派生クラスを取得する
242  CJson* pcType = m_pBuffer[ nIndex ];
243  if ( nullptr == pcType ) {
244  // 失敗!
245  break;
246  }
247  // JSON派生クラスを出力する
248  else if ( !pcType->OutputJson( rcStreamOut ) ) {
249  // 失敗!
250  break;
251  }
252  // インデックスを調べる
253  else if ( ( nCount - 1 ) > nIndex ) {
254  // 1文字出力する
255  if ( !rcStreamOut.OutputChar( L',' ) ) {
256  // 失敗!
257  break;
258  }
259  }
260  }
261  } while ( false );
262 
263  // 実行結果を返す
264  return result;
265  }
266 
267  //-------------------------------------------------------------------------
268  // JSONエレメント取得関数
269  CJson* CJsonContainer::GetJsonElement( int nIndex ) noexcept {
270  // 処理ブロック
271  CJson* result = nullptr;
272  do {
273  // インデックスを調べる
274  if ( m_nCount <= nIndex ) {
275  // 失敗!
276  break;
277  }
278 
279  // JSONクラスを取得する
280  result = m_pBuffer[ nIndex ];
281  } while ( false );
282 
283  // 実行結果を返す
284  return result;
285  }
286 
287  //-------------------------------------------------------------------------
288  // JSONクラス設定関数
289  bool CJsonContainer::SetJsonElement( int nIndex, CJson* pcJson ) noexcept {
290  // 処理ブロック
291  bool result = false;
292  do {
293  // インデックスを調べる
294  if ( 0 > nIndex ) {
295  // 失敗!
296  break;
297  }
298  // エレメント数を拡張する
299  else if ( !ExtendJsonElementCount( nIndex + 1 ) ) {
300  // 失敗!
301  break;
302  }
303 
304  // JSONクラスを設定する
305  m_pBuffer[ nIndex ] = pcJson;
306 
307  // 成功!
308  result = true;
309  } while ( false );
310 
311  // 実行結果を返す
312  return result;
313  }
314 
315  //-------------------------------------------------------------------------
316  // JSONエレメント数拡張関数
317  bool CJsonContainer::ExtendJsonElementCount( int nCount ) noexcept {
318  // 処理ブロック
319  bool result = false;
320  do {
321  // バッファサイズを更新する
322  if ( !UpdateBuffer( nCount ) ) {
323  // 失敗!
324  break;
325  }
326  // 巡回する
327  else for ( ; nCount > m_nCount; ++m_nCount ) {
328  // JSON固定値をエレメントとして設定する
329  m_pBuffer[ m_nCount ] = new CJsonFixed( this, L"null" );
330  }
331 
332  // 成功!
333  result = true;
334  } while ( false );
335 
336  // 実行結果を返す
337  return result;
338  }
339 
340  //=========================================================================
341  // 配列テンプレートクラス明示的インスタンス生成宣言
344 }
345 
346 #pragma managed( pop )
virtual bool CompactJson() noexcept override
JSONクラスコンパクト化関数
virtual bool OutputJson(CStreamOut &rcStreamOut) noexcept
JSONクラス出力関数
Definition: CJson.h:232
virtual void ClearJson() noexcept override
JSONクラスクリア関数
CJsonContainer(CJson *pcParent) noexcept
コンストラクタ
JSONコンテナクラスヘッダファイル
JSONライブラリ名前空間
Definition: CJson.h:24
int m_nCount
要素数
Definition: CArray.h:669
配列クラス実装ヘッダファイル
JSONバリュークラス
Definition: CJsonValue.h:30
virtual bool InputJson(CStream &rcStream) noexcept override
JSONクラス入力関数
virtual bool SetJsonElement(int nIndex, CJson *pcJson) noexcept
JSONエレメント設定関数
virtual bool Push(CJson * const &rElement) noexcept
プッシュ関数
virtual bool ExtendJsonElementCount(int nCount) noexcept
JSONエレメント数拡張関数
ストリームクラス
Definition: CStream.h:31
JSONペアクラスヘッダファイル
JSONクラス
Definition: CJson.h:44
ストリーム出力クラス
Definition: CStreamOut.h:30
CArray< int > * m_pcInputPointerList
入力ストリームポインタリストポインタ
Definition: CJson.h:238
JSONバリュークラスヘッダファイル
JSON固定値クラス
Definition: CJsonFixed.h:30
virtual bool CompactJson() noexcept
JSONクラスコンパクト化関数
Definition: CJson.cpp:93
JSON固定値クラスヘッダファイル
virtual ~CJsonContainer() noexcept
デストラクタ
#define LIB_JSON_API
ダイナミックライブラリインポート宣言
Definition: LibJsonDef.h:29
virtual CJson * CreateInputJsonElement(CStream &rcStream, CJson *pcParent) noexcept=0
JSONエレメント入力作成関数
virtual wchar_t GetCloseChar() noexcept=0
クローズ文字取得関数
CJson * * m_pBuffer
バッファポインタ
Definition: CArray.h:667
virtual bool CompactBuffer() noexcept
バッファサイズコンパクト化関数
virtual CJson * GetJsonElement(int nIndex) noexcept
JSONエレメント取得関数
virtual bool OutputJson(CStreamOut &rcStreamOut) noexcept override
JSONクラス出力関数
virtual wchar_t GetOpenChar() noexcept=0
オープン文字取得関数
virtual void ClearJson() noexcept
JSONクラスクリア関数
Definition: CJson.cpp:86
virtual bool UpdateBuffer(int nCount) noexcept
バッファサイズ更新関数