TNB Library
TnbTmlValue.h
[詳解]
1#pragma once
13#include "TnbAttributedVector.h"
14#include "TnbDummyCollection.h"
15#include "TnbStr.h"
16
17
18
19//TNB Library
20namespace TNB
21{
22
23
24
42class CTmlValue : public IComparableT<CTmlValue>
43{
44public:
45
47 enum EKind
48 {
49 EMPTY = 0,
50 INTEGER = 1,
51 FLOAT = 2,
52 DATA = 3
53 };
54
59 CTmlValue(const CTmlValue& other) : m_param(other.m_param)
60 {
61 }
62
64 CTmlValue(void) : m_param()
65 {
66 }
67
72 CTmlValue(int i) : m_param()
73 {
74 m_param.Set(i);
75 }
76
81 CTmlValue(double i) : m_param()
82 {
83 m_param.Set(i);
84 }
85
92 {
93 m_param = v.m_param;
94 return *this;
95 }
96
103 CTmlValue& SetString(LPCSTR lpszData)
104 {
105 m_param.Set(STRLIB::GetLen(lpszData), lpszData);
106 return *this;
107 }
108
116 {
117 m_param.Set(v.GetSize(), v.ReferBuffer());
118 return *this;
119 }
120
128 CTmlValue& SetData(size_t len, LPCVOID P)
129 {
130 m_param.Set(len, P);
131 return *this;
132 }
133
140 bool AddWildPoint(INDEX index)
141 {
142 return HasData() && m_param.dataBytes.SetAttribute(index, WILDCARD);
143 }
144
155 INT_PTR Compare(ICollectionT<CByteVector>& _vvbWild, const CTmlValue& other) const
156 {
157 _vvbWild.RemoveAll();
158 EKind kind = (m_param.eKind >= other.m_param.eKind) ? m_param.eKind : other.m_param.eKind;
159 if ( kind != DATA )
160 {
161 return m_CompareNum(m_param, other.m_param);
162 }
163 const CDataBytes& leftData = m_param.GetData();
164 const CDataBytes& rightData = other.m_param.GetData();
165 //
166 size_t srcPos = 0;
167 size_t wildPos = 0;
168 size_t srcPosMax = leftData.GetSize();
169 size_t wildPosMax = rightData.GetSize();
170 BYTE B;
171 while ( true )
172 {
173 if ( wildPos >= wildPosMax )
174 {
175 return 1;
176 }
177 if ( rightData.GetAttribute(wildPos) == WILDCARD )
178 {
179 //ワイルド発見!
180 wildPos++;
181 while ( wildPos < wildPosMax )
182 {
183 if ( rightData.GetAttribute(wildPos) != WILDCARD )
184 {
185 break;
186 }
187 wildPos++;
188 }
189 CByteVector vb;
190 if ( wildPos >= wildPosMax )
191 {
192 //ワイルドが最後。
193 while ( true )
194 {
195 if ( srcPos >= srcPosMax )
196 {
197 _vvbWild.Add(vb);
198 break;
199 }
200 B = leftData.Get(srcPos);
201 vb.Add(B);
202 srcPos++;
203 }
204 return 0;
205 }
206 while ( true )
207 {
208 B = leftData.Get(srcPos);
209 if ( B == rightData.Get(wildPos) )
210 {
211 //ワイルドの次の文字を発見
212 _vvbWild.Add(vb);
213 break;
214 }
215 vb.Add(B);
216 srcPos++;
217 if ( srcPos >= srcPosMax )
218 {
219 return -1;
220 }
221 }
222 }
223 if ( srcPos >= srcPosMax )
224 {
225 return 1;
226 }
227 INT_PTR r = leftData.Get(srcPos);
228 r -= rightData.Get(wildPos);
229 if ( r != 0 )
230 {
231 return r;
232 }
233 srcPos++;
234 wildPos++;
235 if ( wildPos >= wildPosMax && srcPos >= srcPosMax )
236 {
237 break;
238 }
239 }
240 return 0;
241 }
242
250 virtual INT_PTR Compare(const CTmlValue& other) const
251 {
253 return Compare(vv, other);
254 }
255
261 CTmlValue operator+(const CTmlValue& other) const
262 {
263 CTmlValue v;
264 EKind kind = (m_param.eKind >= other.m_param.eKind) ? m_param.eKind : other.m_param.eKind;
265 switch ( kind )
266 {
267 case INTEGER:
268 v = m_param.GetInteger() + other.m_param.GetInteger();
269 break;
270 case FLOAT:
271 v = m_param.GetFloat() + other.m_param.GetFloat();
272 break;
273 case DATA:
274 v.m_param.Set(m_param.GetData() + other.m_param.GetData());
275 break;
276 case EMPTY:
277 default:
278 break;
279 }
280 return v;
281 }
282
288 CTmlValue operator-(const CTmlValue& other) const
289 {
290 CTmlValue v;
291 EKind kind = (m_param.eKind >= other.m_param.eKind) ? m_param.eKind : other.m_param.eKind;
292 switch ( kind )
293 {
294 case INTEGER:
295 v = m_param.GetInteger() - other.m_param.GetInteger();
296 break;
297 case FLOAT:
298 v = m_param.GetFloat() - other.m_param.GetFloat();
299 break;
300 case DATA:
301 v = *this;
302 break;
303 case EMPTY:
304 default:
305 break;
306 }
307 return v;
308 }
309
316 CTmlValue operator*(const CTmlValue& other) const
317 {
318 CTmlValue v;
319 EKind kind = (m_param.eKind >= other.m_param.eKind) ? m_param.eKind : other.m_param.eKind;
320 switch ( kind )
321 {
322 case INTEGER:
323 v = m_param.GetInteger() * other.m_param.GetInteger();
324 break;
325 case FLOAT:
326 v = m_param.GetFloat() * other.m_param.GetFloat();
327 break;
328 case DATA:
329 v = *this;
330 if ( m_param.eKind == DATA )
331 {
332 v.m_param.dataBytes.RemoveAll();
333 loop ( i, other.m_param.GetInteger() )
334 {
335 v.m_param.dataBytes += m_param.dataBytes;
336 }
337 }
338 break;
339 case EMPTY:
340 default:
341 break;
342 }
343 return v;
344 }
345
351 CTmlValue operator/(const CTmlValue& other) const
352 {
353 CTmlValue v;
354 EKind kind = (m_param.eKind >= other.m_param.eKind) ? m_param.eKind : other.m_param.eKind;
355 switch ( kind )
356 {
357 case INTEGER:
358 v = m_param.GetInteger() / other.m_param.GetInteger();
359 break;
360 case FLOAT:
361 v = m_param.GetFloat() / other.m_param.GetFloat();
362 break;
363 case DATA:
364 v = *this;
365 break;
366 case EMPTY:
367 default:
368 break;
369 }
370 return v;
371 }
372
378 {
379 CVectorT<INDEX> vid;
380 if ( HasData() )
381 {
382 loop ( i, m_param.dataBytes.GetSize() )
383 {
384 if ( m_param.dataBytes.GetAttribute(i) == WILDCARD )
385 {
386 vid.Add(i);
387 }
388 }
389 }
390 return vid;
391 }
392
398 bool HasData(void) const
399 {
400 return m_param.eKind == DATA;
401 }
402
408 EKind Getkind(void) const
409 {
410 return m_param.eKind;
411 }
412
418 int GetInteger(void) const
419 {
420 return HasData() ? atoi(m_param.GetString()) : m_param.GetInteger();
421 }
422
428 double GetFloat(void) const
429 {
430 return HasData() ? atof(m_param.GetString()) : m_param.GetFloat();
431 }
432
439 CAscii GetString(void) const
440 {
441 return m_param.GetString();
442 }
443
450 {
451// return m_param.GetData().Refer();
452 return m_param.GetData();
453 }
454
460 size_t GetDataSize(void) const
461 {
462 return m_param.GetData().GetSize();
463 }
464
465private:
466
468 enum EAttr
469 {
470 NORMAL = 0,
471 WILDCARD = 1,
472 };
473
475 typedef CAttributedVectorT<BYTE, BYTE> CDataBytes;
476
478 struct TParam
479 {
480 EKind eKind;
481 CDataBytes dataBytes;
482 int iValue;
483 double doValue;
485 TParam(void) : iValue(0), doValue(0.0), eKind(EMPTY)
486 {
487 }
489 TParam(const TParam& p) : eKind(p.eKind), dataBytes(p.dataBytes), iValue(p.iValue), doValue(p.doValue)
490 {
491 }
493 TParam& operator=(const TParam& p)
494 {
495 eKind = p.eKind;
496 dataBytes = p.dataBytes;
497 iValue = p.iValue;
498 doValue = p.doValue;
499 return *this;
500 }
502 void Set(EKind e, int i = 0, double d = 0.0, const CDataBytes* D = NULL)
503 {
504 eKind = e;
505 if ( D == NULL )
506 {
507 dataBytes.RemoveAll();
508 }
509 else
510 {
511 dataBytes = *D;
512 }
513 iValue = i;
514 doValue = d;
515 }
517 void Empty(void)
518 {
519 Set(EMPTY);
520 }
522 void Set(int i)
523 {
524 Set(INTEGER, i, i);
525 }
527 void Set(double i)
528 {
529 Set(FLOAT, ToInt(i), i);
530 }
532 void Set(const CDataBytes& d)
533 {
534 Set(DATA, 0, 0.0, &d);
535 }
537 void Set(size_t l, LPCVOID P)
538 {
539 CDataBytes d;
540 d.SetElements(l, static_cast<const BYTE*>(P));
541 Set(d);
542 }
544 int GetInteger(void) const
545 {
546 return iValue;
547 }
549 double GetFloat(void) const
550 {
551 return (eKind <= INTEGER) ? iValue : doValue;
552 }
554 CAscii GetString(void) const
555 {
556 CAscii a;
557 switch ( eKind )
558 {
559 case INTEGER:
560 a.Format("%d", iValue);
561 break;
562 case FLOAT:
563 a.Format("%.0f", doValue);
564 break;
565 case DATA:
566 {
567 size_t l = dataBytes.GetSize();
568 if ( l > 0 )
569 {
570 LPSTR P = a.GetBuffer(l);
571 dataBytes.GetElements(l, reinterpret_cast<BYTE*>(P));
572 P[l] = 0;
573 a.ReleaseBuffer();
574 }
575 }
576 break;
577 default:
578 break;
579 }
580 return a;
581 }
583 CDataBytes GetData(void) const
584 {
585 CDataBytes d;
586 switch ( eKind )
587 {
588 case DATA:
589 d = dataBytes;
590 break;
591 case INTEGER:
592 case FLOAT:
593 {
594 CAscii a = GetString();
595 d.SetElements(a.GetLength(), reinterpret_cast<const BYTE*>(LPCSTR(a)));
596 }
597 break;
598 default:
599 break;
600 }
601 return d;
602 }
603 };
604
605 TParam m_param;
606
608 INT_PTR m_CompareNum(const TParam& p1, const TParam& p2) const
609 {
610 if ( p1.eKind == DATA || p2.eKind == DATA )
611 {
612 ASSERT(false);
613 return 0;
614 }
615 if ( p1.eKind <= INTEGER && p2.eKind <= INTEGER )
616 {
617 return IComparatorT<int>::GetDefault().CompareTo(p1.iValue, p2.iValue);
618 }
619 return IComparatorT<double>::GetDefault().CompareTo(p1.doValue, p2.doValue);
620 }
621
622 friend class CTmlValueTest;
623};
624
625
626
637
638
639
654{
655public:
656
658 CTmlValueCarrier(void) : m_pValueRef(NULL), m_valueReal(), m_strExName()
659 {
660 }
661
667 : m_pValueRef(other.m_pValueRef), m_valueReal(other.m_valueReal), m_strExName(other.m_strExName)
668 {
669 }
670
677 {
678 m_pValueRef = other.m_pValueRef;
679 m_valueReal = other.m_valueReal;
680 m_strExName = other.m_strExName;
681 return *this;
682 }
683
691 {
692 m_strExName.Empty();
693 m_valueReal = i;
694 m_pValueRef = NULL;
695 return *this;
696 }
697
705 {
706 m_strExName.Empty();
707 m_valueReal = i;
708 m_pValueRef = NULL;
709 return *this;
710 }
711
719 {
720 m_strExName.Empty();
721 m_valueReal = v;
722 m_pValueRef = NULL;
723 return *this;
724 }
725
732 {
733 m_pValueRef = &v;
734 }
735
740 void Set(LPCSTR lpsz)
741 {
742 m_strExName = lpsz;
743 }
744
749 void Empty(void)
750 {
751 m_strExName.Empty();
752 m_valueReal = 0;
753 m_pValueRef = NULL;
754 }
755
760 LPCSTR GetExName(void) const
761 {
762 return m_strExName;
763 }
764
769 const CTmlValue& operator()(void) const
770 {
771 return (m_pValueRef == NULL) ? m_valueReal : *m_pValueRef;
772 }
773
780 {
781 return (m_pValueRef == NULL) ? m_valueReal : *m_pValueRef;
782 }
783
784private:
785 CTmlValue* m_pValueRef;
786 CTmlValue m_valueReal;
787 CAscii m_strExName;
788};
789
790
791
792}; // TNB
793
配列型情報管理関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ダミーコレクション関係のヘッダ
文字列管理関係のヘッダ
ATT GetAttribute(INDEX index) const
[取得] 要素の属性値、取得
ダミーコレクションテンプレート
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
size_t GetLength(void) const
[取得] 文字列長
Definition: TnbStr.h:518
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
Definition: TnbStr.h:359
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
TinyMacroLang 値参照管理
Definition: TnbTmlValue.h:654
CTmlValueCarrier(void)
コンストラクタ
Definition: TnbTmlValue.h:658
CTmlValue & operator()(void)
[取得] 値参照
Definition: TnbTmlValue.h:779
void Set(LPCSTR lpsz)
[代入] 拡張ネーム指定.
Definition: TnbTmlValue.h:740
LPCSTR GetExName(void) const
[取得] 拡張ネーム取得
Definition: TnbTmlValue.h:760
CTmlValueCarrier & operator=(double i)
[代入] double代入.
Definition: TnbTmlValue.h:704
const CTmlValue & operator()(void) const
[取得] 値参照
Definition: TnbTmlValue.h:769
CTmlValueCarrier & operator=(const CTmlValue &v)
[代入] Valueを代入.
Definition: TnbTmlValue.h:718
CTmlValueCarrier(const CTmlValueCarrier &other)
コピーコンストラクタ
Definition: TnbTmlValue.h:666
void Empty(void)
[設定] 空。.
Definition: TnbTmlValue.h:749
void SetRef(CTmlValue &v)
[代入] Value参照指定.
Definition: TnbTmlValue.h:731
CTmlValueCarrier & operator=(const CTmlValueCarrier &other)
コピーオペレータ
Definition: TnbTmlValue.h:676
CTmlValueCarrier & operator=(int i)
[代入] int代入.
Definition: TnbTmlValue.h:690
TinyMacroLang 値管理
Definition: TnbTmlValue.h:43
INT_PTR Compare(ICollectionT< CByteVector > &_vvbWild, const CTmlValue &other) const
[比較] 比較.
Definition: TnbTmlValue.h:155
EKind Getkind(void) const
[確認] 保持型確認.
Definition: TnbTmlValue.h:408
CTmlValue & SetString(LPCSTR lpszData)
[代入] データ代入.
Definition: TnbTmlValue.h:103
CTmlValue(double i)
コンストラクタ
Definition: TnbTmlValue.h:81
CTmlValue(void)
コンストラクタ
Definition: TnbTmlValue.h:64
CTmlValue(const CTmlValue &other)
コピーコンストラクタ
Definition: TnbTmlValue.h:59
double GetFloat(void) const
[取得] 数字取得.
Definition: TnbTmlValue.h:428
CTmlValue & operator=(const CByteVector &v)
[代入] データ代入.
Definition: TnbTmlValue.h:115
size_t GetDataSize(void) const
[取得] データ長取得.
Definition: TnbTmlValue.h:460
@ EMPTY
なし
Definition: TnbTmlValue.h:49
@ INTEGER
整数値
Definition: TnbTmlValue.h:50
@ FLOAT
実数値
Definition: TnbTmlValue.h:51
@ DATA
データ
Definition: TnbTmlValue.h:52
CTmlValue operator+(const CTmlValue &other) const
[計算] 加算.
Definition: TnbTmlValue.h:261
CTmlValue operator*(const CTmlValue &other) const
[計算] 掛け算.
Definition: TnbTmlValue.h:316
CVectorT< INDEX > GetWildCardPositions(void) const
[取得] WildCard情報取得.
Definition: TnbTmlValue.h:377
CTmlValue & SetData(size_t len, LPCVOID P)
[代入] データ代入.
Definition: TnbTmlValue.h:128
CTmlValue & operator=(const CTmlValue &v)
[代入] コピーオペレータ.
Definition: TnbTmlValue.h:91
CTmlValue operator/(const CTmlValue &other) const
[計算] 割り算.
Definition: TnbTmlValue.h:351
CTmlValue(int i)
コンストラクタ
Definition: TnbTmlValue.h:72
int GetInteger(void) const
[取得] 数字取得.
Definition: TnbTmlValue.h:418
CByteVector GetData(void) const
[取得] データ取得.
Definition: TnbTmlValue.h:449
CAscii GetString(void) const
[取得] 文字列取得.
Definition: TnbTmlValue.h:439
CTmlValue operator-(const CTmlValue &other) const
[計算] 引き算.
Definition: TnbTmlValue.h:288
bool HasData(void) const
[確認] データ型保持確認.
Definition: TnbTmlValue.h:398
virtual INT_PTR Compare(const CTmlValue &other) const
[確認] 比較.
Definition: TnbTmlValue.h:250
bool AddWildPoint(INDEX index)
[設定] ワイルドカードポイント追加.
Definition: TnbTmlValue.h:140
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual TYP Get(INDEX index) const
[取得] 要素の取得.
Definition: TnbVector.h:220
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
size_t GetLen(LPCSTR lpsz)
[計算] 文字列長計算(ASCII/SJIS用)
Definition: TnbStrLib.h:44
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
CVectorT< CTmlValue > CTmlValuesVector
TinyMacroLang 値配列型.
Definition: TnbTmlValue.h:636
TNB Library
Definition: TnbDoxyTitle.txt:2
情報群管理操作インターフェーステンプレート
virtual INDEX Add(const TYP &t)=0
[追加] 要素一つ追加.
virtual bool RemoveAll(void)
[削除] 全要素削除 .
比較機能インターフェース.
Definition: TnbComparable.h:54
virtual INT_PTR CompareTo(const TYP &t1, const TYP &t2) const =0
[確認] 比較
static IComparatorT & GetDefault(void)
[作成] 汎用コンパレータ取得.