TNB Library
TnbTemporaryAccessor.h
[詳解]
1#pragma once
11#include "TnbAccessor.h"
12#include "TnbMap.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
46{
47 DEFSUPER(CAbstractAccessor);
49
50 mutable CStr m_strSecName;
51 mutable CKeyMap* m_pmapKey;
52
53protected:
54
56
57private:
58
63 void m_Reset(void) const
64 {
65 m_pmapKey = NULL;
66 }
67
73 CKeyMap* m_CheckKeyMapP(void) const
74 {
75 if ( m_pmapKey == NULL && m_mapSec.HasKey(m_strSecName) )
76 {
77 m_pmapKey = &(m_mapSec[m_strSecName]);
78 }
79 return m_pmapKey;
80 }
81
87 CKeyMap* m_GetKeyMapP(void)
88 {
89 if ( m_pmapKey == NULL )
90 {
91 m_pmapKey = &(m_mapSec[m_strSecName]);
92 }
93 return m_pmapKey;
94 }
95
99 void m_SetSectionName(LPCTSTR lpszSectionName) const
100 {
101 if ( m_strSecName != lpszSectionName )
102 {
103 m_Reset();
104 m_strSecName = lpszSectionName;
105 }
106 }
107
115 bool m_Write(LPCTSTR lpszKey, const CValue& v)
116 {
117 CKeyMap* P = m_GetKeyMapP();
118 if ( P != NULL )
119 {
120 (*P)[lpszKey] = v;
121 return true;
122 }
123 return false;
124 }
125
132 bool m_Delete(LPCTSTR lpszKey)
133 {
134 CKeyMap* P = m_CheckKeyMapP();
135 return (P != NULL) ? P->RemoveKey(lpszKey) : false;
136 }
137
138public:
139
141 CTemporaryAccessor(void) : _super(), m_pmapKey(NULL)
142 {
143 }
144
149 virtual CStr GetTypeName(void) const
150 {
151 return _T("Temp");
152 }
153
159 virtual bool Flush(void)
160 {
161 return true;
162 }
163
169 virtual CStrVector EnumSectionNames(LPCTSTR lpszSectionName = NULL) const
170 {
171 CStrVector vs = m_mapSec.EnumKeys();
172 CStr ss = lpszSectionName;
173 size_t len = ss.GetLength();
174 if ( ! ss.IsEmpty() )
175 {
176 loop ( i, vs.GetSize() )
177 {
178 CStr s;
179 if ( STRLIB::Compare(vs[i], ss, len, NORM_IGNORECASE) == 0 )
180 {
181 s = vs[i].Mid(len);
182 if ( ! s.IsEmpty() && s[0] == '\\' )
183 {
184 s = s.Mid(1);
185 }
186 else
187 {
188 s.Empty();
189 }
190 }
191 vs[i] = s;
192 }
193 }
194 CStrVector vstrSecNames;
195 loop ( i, vs.GetSize() )
196 {
197 if ( ! vs[i].IsEmpty() )
198 {
199 CStr s = vs[i];
200 INDEX d = s.Find(_T('\\'));
201 if ( d != INVALID_INDEX )
202 {
203 s = s.Left(d);
204 }
205 if ( vstrSecNames.Find(s) == INVALID_INDEX )
206 {
207 vstrSecNames.Add(s);
208 }
209 }
210 }
211 return vstrSecNames;
212 }
213
220 virtual bool DeleteSection(LPCTSTR lpszSectionName)
221 {
222 m_Reset();
223 CStrVector vs = m_mapSec.EnumKeys();
224 CStr ss = lpszSectionName;
225 size_t len = ss.GetLength();
226 loop ( i, vs.GetSize() )
227 {
228 if ( STRLIB::Compare(vs[i], ss, len, NORM_IGNORECASE) == 0 )
229 {
230 if ( ! m_mapSec.RemoveKey(vs[i]) )
231 {
232 return false;
233 }
234 }
235 }
236 return true;
237 }
238
244 virtual CStrVector EnumKeyNames(LPCTSTR lpszSectionName) const
245 {
246 m_SetSectionName(lpszSectionName);
247 CKeyMap* P = m_CheckKeyMapP();
248 return (P == NULL) ? CStrVector() : P->EnumKeys();
249 }
250
257 virtual EKind GetKeyKind(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
258 {
259 m_SetSectionName(lpszSectionName);
260 CKeyMap* P = m_CheckKeyMapP();
261 if ( P == NULL )
262 {
263 return EK_Nothing;
264 }
265 CValue v;
266 return (P->Lookup(lpszKey, v)) ? v.GetKind() : EK_Nothing;
267 }
268
275 virtual CValue QueryValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
276 {
277 m_SetSectionName(lpszSectionName);
278 CKeyMap* P = m_CheckKeyMapP();
279 CValue v;
280 if ( P != NULL )
281 {
282 P->Lookup(lpszKey, v);
283 }
284 return v;
285 }
286
295 virtual bool WriteValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey, const IAccessor::CValue& value)
296 {
297 m_SetSectionName(lpszSectionName);
298 if ( value.GetKind() == EK_Nothing )
299 {
300 return m_Delete(lpszKey);
301 }
302 return m_Write(lpszKey, value);
303 }
304};
305
306
307
308}; // TNB
情報アクセス関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
マップ型情報管理関係のヘッダ
情報アクセス抽象クラス.
Definition: TnbAccessor.h:967
マップ型情報管理テンプレート
Definition: TnbMap.h:66
CVectorT< KEY > EnumKeys(void) const
[取得] キーの一覧
Definition: TnbMap.h:599
bool Lookup(INK key, VAL &_rValue) const
[取得] キーに対する値取得
Definition: TnbMap.h:574
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
size_t GetLength(void) const
[取得] 文字列長
Definition: TnbStr.h:518
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
Definition: TnbStr.h:540
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
Definition: TnbStr.h:766
テンポラリ情報アクセスクラス
virtual CStr GetTypeName(void) const
[取得] タイプ名取得
virtual bool Flush(void)
[操作] フラッシュ.
virtual CStrVector EnumKeyNames(LPCTSTR lpszSectionName) const
[取得] キー名一覧取得
virtual bool WriteValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey, const IAccessor::CValue &value)
[設定] 情報設定
CTemporaryAccessor(void)
コンストラクタ
virtual bool DeleteSection(LPCTSTR lpszSectionName)
[削除] 指定セクション削除
virtual CValue QueryValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
[取得] 情報取得
virtual EKind GetKeyKind(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
[取得] 情報取種取得
CMapT< CStr, CKeyMap, LPCTSTR > m_mapSec
セクションマップ
virtual CStrVector EnumSectionNames(LPCTSTR lpszSectionName=NULL) const
[取得] セクション名一覧取得
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
CVectorT< TYP > Mid(INDEX startIndex, size_t size=0) const
[作成] 切り出し
Definition: TnbVector.h:705
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
情報アクセスの汎用値保持クラス.
Definition: TnbAccessor.h:100
EKind GetKind(void) const
[取得] 情報取種取得
Definition: TnbAccessor.h:171
TNB::CVectorT< CStr > CStrVector
文字列配列管理クラス
Definition: TnbStrVector.h:31
int Compare(LPCSTR P1, LPCSTR P2, INT_PTR len=-1, DWORD dwCmpFlags=0)
[比較] 文字列比較(ASCII/SJIS用)
Definition: TnbStrLib.h:135
TNB Library
Definition: TnbDoxyTitle.txt:2
EKind
値型の種類.
Definition: TnbAccessor.h:80
@ EK_Nothing
存在しない
Definition: TnbAccessor.h:81
INDEX Find(const IChecker &checker, INDEX startIndex=0, bool boIsReverse=false) const
[検索] 条件一致要素の検索.