TNB Library
TnbUnionValueUnit.h
[詳解]
1#pragma once
11#include "TnbUnion.h"
12#include "TnbValueUnit.h"
13#include "TnbValueParUnit.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
37{
38public:
39
42 {
44 virtual CRealNumber GetValue(LPVOID V) const = 0;
46 virtual CStr GetUnitMarkString(LPVOID V) const = 0;
47 };
48
49private:
50
52 class CUnionVu : public CUnion
53 {
54 DEFSUPER(CUnion);
56 template<typename T>
57 struct CFuncT : CUnionValueUnit::IFuncBaseVu
58 {
59 virtual void Destractor(LPVOID V)
60 {
61 delete static_cast<T*>(V);
62 }
63 virtual CRealNumber GetValue(LPVOID V) const
64 {
65 return static_cast<T*>(V)->GetValue();
66 }
67 virtual CStr GetUnitMarkString(LPVOID V) const
68 {
69 return static_cast<T*>(V)->GetUnitMarkString();
70 }
71 };
72 public:
74 CUnionVu(void) : _super() {}
75// /**
76// * コンストラクタ.
77// * T 型で t の値を持つインスタンス作成。
78// */
79// template<typename T>
80// CUnionVu(const T& t, DWORD dwParam=0) : m_hpHead(new THead)
81// {
82// m_hpHead->Set(t, dwParam, new CFuncT<T>);
83// }
85 CUnionVu(const CUnionVu& other) : _super(other) {}
87 template<typename T>
88 void Set(const T& t, DWORD dwParam = 0)
89 {
90 m_hpHead = new THead;
91 m_hpHead->Set(t, dwParam, new CFuncT<T>);
92 }
94 CRealNumber GetValue(void) const
95 {
96 return reinterpret_cast<IFuncBaseVu*>(m_hpHead->m_pFuncBase)->GetValue(m_hpHead->m_pVal);
97 }
99 CStr GetUnitMarkString(void) const
100 {
101 return reinterpret_cast<IFuncBaseVu*>(m_hpHead->m_pFuncBase)->GetUnitMarkString(m_hpHead->m_pVal);
102 }
103 };
104
105 CUnionVu m_uni;
106 CStr m_strFormat;
107 CStr m_strInvalid;
108
109public:
110
112 CUnionValueUnit(void) : m_uni()
113 {
114 }
115
116// /*
117// * コンストラクタ
118// * @note T 型は ValueUnit 系クラス(CAbstractUnitのサブクラス)に限ります。
119// * @param t 代入値
120// */
121// template<typename T>
122// CUnionValueUnit(const T& t) : m_uni(t, T::KINDCODE)
123// {
124// ASSERT( T::TNBLIB_VALUEUNIT == -1 );
125// }
126
129 {
130 }
131
136 void Empty(void)
137 {
138 m_uni.Empty();
139 }
140
149 template<typename T>
150 void Set(const T& t, LPCTSTR lpszFormat = NULL, LPCTSTR lpszInvalid = NULL)
151 {
152 ASSERT( T::TNBLIB_VALUEUNIT == -1 );
153 m_uni.Set(t, T::KINDCODE);
154 m_strFormat = lpszFormat;
155 m_strInvalid = (lpszInvalid == NULL ) ? _T("?") : lpszInvalid;
156 }
157
162 DWORD GetUnitKindCode(void) const
163 {
164 return m_uni.GetParam();
165 }
166
175 template<typename T>
176 bool Get(T& _t) const
177 {
178 if ( T::KINDCODE != m_uni.GetParam() )
179 {
180 return false; //型が異なる
181 }
182 return m_uni.Get(_t);
183 }
184
193 template<typename T>
194 const T& Ref(T* P) const
195 {
196 if ( T::KINDCODE != m_uni.GetParam() )
197 {
198 throw CNoSuchTypeException(); //型が異なる
199 }
200 return m_uni.Ref(P);
201 }
202
207 CStr ToString(void) const
208 {
209 CStr strRet;
210 CRealNumber r = GetValue();
211 if ( ! r.IsEmpty() )
212 {
213 CStr s = r.IsValid() ? r.ToString(m_strFormat) : m_strInvalid;
214 strRet = CStr::Fmt(_T("%s %s"), s, m_uni.GetUnitMarkString());
215 }
216 return strRet;
217 }
218
224 {
225 return m_uni.GetValue();
226 }
227
233 {
234 return m_uni.GetUnitMarkString();
235 }
236};
237
238
239
240};//TNB
241
242
243
UNION関係のヘッダ
単位付値管理関係のヘッダ
単位付値管理関係のヘッダ
タイプ相違例外
Definition: TnbException.h:146
実数管理クラス
Definition: TnbRealNumber.h:78
bool IsEmpty(void) const
[確認] EMPTY確認
bool IsValid(void) const
[確認] 有効確認
CStr ToString(LPCTSTR lpszFormat=NULL) const
[取得] 文字列作成
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
UNION 単位付値管理クラス
~CUnionValueUnit(void)
デストラクタ
CUnionValueUnit(void)
コンストラクタ
bool Get(T &_t) const
[取得] 取得.
DWORD GetUnitKindCode(void) const
[取得] 単位種コード取得.
CRealNumber GetValue(void) const
[取得] 値取得
const T & Ref(T *P) const
[取得] 参照取得.
CStr GetUnitMarkString(void) const
[取得] 単位記号取得
void Set(const T &t, LPCTSTR lpszFormat=NULL, LPCTSTR lpszInvalid=NULL)
[設定] 代入.
void Empty(void)
[設定] 空化.
CStr ToString(void) const
[取得] 文字列取得
UNION管理クラス
Definition: TnbUnion.h:65
CPointerHandleT< THead > m_hpHead
実体参照ハンドル
Definition: TnbUnion.h:278
TNB Library
Definition: TnbDoxyTitle.txt:2
ファンクションベースクラス
virtual CRealNumber GetValue(LPVOID V) const =0
数値取得
virtual CStr GetUnitMarkString(LPVOID V) const =0
単位記号取得
UNION管理クラス用ファンクションインターフェース
Definition: TnbUnion.h:70