TNB Library
TnbTinyStringFormater.h
[詳解]
1#pragma once
13#include <TnbDef.h>
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
37template<typename TYP = TCHAR>
39{
40public:
41
43 CTinyStringFormaterT(void) : m_pos(0), m_pWork(NULL), m_workSize(0)
44 {
45 }
46
54 void Initialize(TYP* _P, size_t len)
55 {
56 m_pWork = _P;
57 m_workSize = len;
58 m_pos = 0;
59 }
60
65 size_t GetLength(void) const
66 {
67 return m_pos;
68 }
69
74 operator const TYP*(void) const
75 {
76 return m_pWork;
77 }
78
83 size_t GetRemainingLength(void) const
84 {
85 if ( m_workSize < m_pos )
86 {
87 return 0;
88 }
89 return m_workSize - m_pos;
90 }
91
97 {
98 ASSERT( m_pWork != NULL );
99 ASSERT( m_pos + 1 <= m_workSize );
100 m_pWork[m_pos] = 0;
101 }
102
109 void AddFormatInt(int value, size_t width)
110 {
111 ASSERT( m_pWork != NULL );
112 ASSERT( m_pos + width <= m_workSize );
113 FormatInt(&m_pWork[m_pos], value, width);
114 m_pos += width;
115 }
116
123 void AddFormatInt(int value)
124 {
125 ASSERT( m_pWork != NULL );
126 m_pos += FormatInt(&m_pWork[m_pos], value);
127 }
128
135 void AddFormatHexInt(DWORD value, size_t width)
136 {
137 ASSERT( m_pWork != NULL );
138 ASSERT( m_pos + width <= m_workSize );
139 FormatHex(&m_pWork[m_pos], value, width);
140 m_pos += width;
141 }
142
147 void AddChar(TCHAR c)
148 {
149 ASSERT( m_pWork != NULL );
150 ASSERT( m_pos + 1 <= m_workSize );
151 m_pWork[m_pos] = c;
152 m_pos++;
153 }
154
159 template<typename XX>
160 void AddLiteral(const XX& literal)
161 {
162 const TYP* lpsz = literal; // ここでエラー出る場合、引数に文字列リテラル以外を渡している可能性有りです
163 size_t len = sizeof(literal) / sizeof(TYP);
164 Add(lpsz, len - 1); //終端は入れない
165 }
166
172 void Add(const TYP* lpsz)
173 {
174 ASSERT( m_pWork != NULL );
175 size_t len = STRLIB::GetLen(lpsz);
176 ASSERT( m_pos + len <= m_workSize );
177 memcpy(&m_pWork[m_pos], lpsz, len * sizeof(TYP));
178 m_pos += len;
179 }
180
192 void Add(const TYP* lpsz, size_t len)
193 {
194 ASSERT( m_pWork != NULL );
195 ASSERT( m_pos + len <= m_workSize );
196 memcpy(&m_pWork[m_pos], lpsz, len * sizeof(TYP));
197 m_pos += len;
198 }
199
200
201 //-------------------------------
202
203
218 static void FormatInt(TYP* _P, int value, size_t width)
219 {
220 unsigned int v = (value < 0) ? -value : value;
221 size_t j = 0;
222 loop_dn ( i, width )
223 {
224 j = i;
225 _P[i] = static_cast<TYP>('0' + (v % 10));
226 v /= 10;
227 if ( v == 0 )
228 {
229 break;
230 }
231 }
232 if ( value < 0 && j > 0 )
233 {
234 _P[j - 1] = '-';
235 j--;
236 }
237 if ( j > 0 )
238 {
239 loop ( i , j )
240 {
241 _P[i] = ' ';
242 }
243 }
244 }
245
260 static INT_PTR FormatInt(TYP* _P, int value)
261 {
262 TYP* Q = _P;
263 if ( value == 0 )
264 {
265 *_P++ = '0';
266 }
267 else
268 {
269 unsigned int v = (value < 0) ? -value : value;
270 if ( value < 0 )
271 {
272 *_P++ = '-';
273 }
274 int j = 0;
275 TYP buf[32];
276 while ( v > 0 )
277 {
278 buf[j++] = static_cast<TYP>('0' + (v % 10));
279 v /= 10;
280 }
281 loop_dn ( i, j )
282 {
283 *_P++ = buf[i];
284 }
285 }
286 return _P - Q;
287 }
288
303 static void FormatInt0(TYP* _P, int value, size_t width)
304 {
305 unsigned int v = (value < 0) ? -value : value;
306 loop_dn ( i, width )
307 {
308 _P[i] = static_cast<TYP>('0' + (v % 10));
309 v /= 10;
310 }
311 if ( value < 0 )
312 {
313 _P[0] = '-';
314 }
315 }
316
331 static void FormatDword(TYP* _P, DWORD value, size_t width)
332 {
333 loop_dn ( i, width )
334 {
335 _P[i] = static_cast<TYP>('0' + (v % 10));
336 v /= 10;
337 if ( v == 0 )
338 {
339 break;
340 }
341 }
342 if ( j > 0 )
343 {
344 loop ( i , j )
345 {
346 _P[i] = ' ';
347 }
348 }
349 }
350
365 static INT_PTR FormatDword(TYP* _P, DWORD value)
366 {
367 TYP* Q = _P;
368 if ( value == 0 )
369 {
370 *_P++ = '0';
371 }
372 else
373 {
374 int j = 0;
375 TCHAR buf[32];
376 while ( value > 0 )
377 {
378 buf[j++] = static_cast<TYP>('0' + (value % 10));
379 value /= 10;
380 }
381 loop_dn ( i, j )
382 {
383 *_P++ = buf[i];
384 }
385 }
386 return _P - Q;
387 }
388
403 static void FormatDword0(TYP* _P, DWORD value, size_t width)
404 {
405 loop_dn ( i, width )
406 {
407 _P[i] = static_cast<TYP>('0' + (value % 10));
408 value /= 10;
409 }
410 }
411
426 static void FormatHex(TYP* _P, DWORD value, size_t width)
427 {
428 loop_dn ( i, width )
429 {
430 _P[i] = STRLIB::IntToHexChar(value & 0xF);
431 value >>= 4;
432 }
433 }
434
435private:
436 TYP* m_pWork;
437 size_t m_workSize;
438 INDEX m_pos;
439 friend class CTinyStringFormaterTest;
440};
441
442
443
480{
481};
482
483
484
485}; // TNB
486
TNBライブラリの定義ヘッダ
#define loop_dn(VAR, CNT)
loop構文.
Definition: TnbDef.h:355
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
簡易文字列書式.
void AddFormatInt(int value)
[追加] int 型追加.
static void FormatDword0(TYP *_P, DWORD value, size_t width)
[設定] DWORD型文字列化(0パディング付き).
void Initialize(TYP *_P, size_t len)
[設定] 初期化.
static INT_PTR FormatDword(TYP *_P, DWORD value)
[設定] DWORD型文字列化.
void AddChar(TCHAR c)
[追加] 一文字追加.
size_t GetLength(void) const
[取得] 文字列数取得.
void AddTerminateChar(void)
[追加] 終端文字追加.
static void FormatInt0(TYP *_P, int value, size_t width)
[設定] int型文字列化(0パディング付き).
CTinyStringFormaterT(void)
コンストラクタ.
void Add(const TYP *lpsz, size_t len)
[追加] 文字列追加.
static void FormatInt(TYP *_P, int value, size_t width)
[設定] int型文字列化(文字数指定).
static INT_PTR FormatInt(TYP *_P, int value)
[設定] int型文字列化.
static void FormatHex(TYP *_P, DWORD value, size_t width)
[設定] DWORD型 HEX 文字列化(0パディング付き).
size_t GetRemainingLength(void) const
[取得] ワークメモリ残り取得.
void Add(const TYP *lpsz)
[追加] 文字列追加.
void AddFormatInt(int value, size_t width)
[追加] int 型追加.
void AddLiteral(const XX &literal)
[追加] 文字列リテラル追加.
void AddFormatHexInt(DWORD value, size_t width)
[追加] DWORD 型 HEX 追加.
static void FormatDword(TYP *_P, DWORD value, size_t width)
[設定] DWORD型文字列化(文字数指定).
簡易文字列書式.
size_t GetLen(LPCSTR lpsz)
[計算] 文字列長計算(ASCII/SJIS用)
Definition: TnbStrLib.h:44
char IntToHexChar(int c)
[変換] 数値HEX文字変換
Definition: TnbStrLib.h:518
TNB Library
Definition: TnbDoxyTitle.txt:2