ZFFramework
 
Loading...
Searching...
No Matches
ZFFilter.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_ZFFilter_h_
7#define _ZFI_ZFFilter_h_
8
9#include "ZFCoreArray.h"
10#include "ZFCoreStringConvert.h"
11#include "ZFCoreUtilMacro.h"
12
14
15// ============================================================
19typedef enum {
20 ZFFilterTypeInclude,
21 ZFFilterTypeExclude,
23
24#define ZFTOKEN_ZFFilterTypeInclude "Include"
26#define ZFTOKEN_ZFFilterTypeExclude "Exclude"
27
29 switch(v) {
30 case ZFFilterTypeInclude:
32 break;
33 case ZFFilterTypeExclude:
35 break;
36 default:
37 break;
38 }
39})
40
44typedef enum {
45 ZFFilterResultNotSpecified,
46 ZFFilterResultActive,
47 ZFFilterResultNotActive,
49
50#define ZFTOKEN_ZFFilterResultNotSpecified "NotSpecified"
52#define ZFTOKEN_ZFFilterResultActive "Active"
54#define ZFTOKEN_ZFFilterResultNotActive "NotActive"
55
57 switch(v) {
58 case ZFFilterResultNotSpecified:
60 break;
61 case ZFFilterResultActive:
63 break;
64 case ZFFilterResultNotActive:
66 break;
67 default:
68 break;
69 }
70})
71
83#define ZFFILTER_DECLARE(ChildClass, SuperClass) \
84 protected: \ \
86 typedef SuperClass zfsuper; \ \
88 typedef ChildClass zfself; \
89 public:
90
91// ============================================================
93template<typename T_Element>
94zfclassLikePOD _ZFP_ZFFilterData {
95public:
97 T_Element element;
99 ZFFilterType filterType;
100};
101
105template<typename T_Public, typename T_Internal = T_Public>
107protected:
110
111public:
115 typedef ZFFilterResult (*CustomFilterCallback)(ZF_IN T_Public const &e);
116
117public:
122 : _filters()
123 , _customFilters(zfnull)
124 {
125 }
126
130 : _filters(ref._filters)
131 , _customFilters(zfnull)
132 {
133 if(ref._customFilters != zfnull) {
134 this->_customFilters = zfnew(
135 _CustomFilterCallbacksType,
136 *ref._customFilters);
137 }
138 }
139
143 if(this != &ref) {
144 this->_filters = ref._filters;
145 if(this->_customFilters != zfnull) {
146 zfdelete(this->_customFilters);
147 this->_customFilters = zfnull;
148 }
149 if(ref._customFilters != zfnull) {
150 this->_customFilters = zfnew(
151 _CustomFilterCallbacksType,
152 *ref._customFilters);
153 }
154 }
155 return *this;
156 }
157
158 virtual inline zfbool operator == (ZF_IN const ZFFilterBase<T_Public, T_Internal> &ref) const {
159 return this->_filters == ref._filters;
160 }
161 virtual inline zfbool operator != (ZF_IN const ZFFilterBase<T_Public, T_Internal> &ref) const {return !this->operator == (ref);}
163 virtual ~ZFFilterBase(void) {
164 }
165public:
170 this->_filters.copyFrom(ref._filters);
171 if(ref._customFilters != zfnull) {
172 if(this->_customFilters == zfnull) {
173 this->_customFilters = zfnew(_CustomFilterCallbacksType);
174 }
175 this->_customFilters->copyFrom(*ref._customFilters);
176 }
177 else {
178 if(this->_customFilters != zfnull) {
179 zfdelete(this->_customFilters);
180 }
181 }
182 }
183
184public:
191 ZF_IN T_Public const &e
192 , ZF_IN_OPT ZFFilterType filterType = ZFFilterTypeExclude
193 ) {
194 if(this->filterOnCheckValid(e)) {
195 _ZFP_ZFFilterData<T_Internal> filterData;
196 this->filterOnStore(filterData.element, e);
197 filterData.filterType = filterType;
198 this->_filters.add(filterData);
199 }
200 return *this;
201 }
202
206 ZF_IN T_Public const &e
207 , ZF_IN_OPT ZFFilterType filterType = ZFFilterTypeExclude
208 ) {
209 if(this->filterOnCheckValid(e)) {
210 for(zfindex i = 0; i < this->_filters.count(); ++i) {
211 if(this->filterOnCheckEqual(this->_filters.get(i).element, e)
212 && this->_filters.get(i).filterType == filterType
213 ) {
214 this->filterOnRemove(this->_filters.get(i).element);
215 this->_filters.remove(i);
216 break;
217 }
218 }
219 }
220 return *this;
221 }
222
226 this->filterOnRemove(this->_filters.get(index).element);
227 this->_filters.remove(index);
228 return *this;
229 }
230
233 virtual void filterRemoveAll(void) {
234 for(zfindex i = 0; i < this->_filters.count(); ++i) {
235 this->filterOnRemove(this->_filters.get(i).element);
236 }
237 this->_filters.removeAll();
238 zfdelete(this->_customFilters);
239 this->_customFilters = zfnull;
240 }
241
244 virtual zfindex filterCount(void) const {
245 return this->_filters.count();
246 }
247
250 virtual T_Public filterElementAt(ZF_IN zfindex index) const {
251 T_Public t;
252 this->filterOnAccess(t, this->_filters.get(index).element);
253 return t;
254 }
255
258 virtual T_Internal const &filterInternalAt(ZF_IN zfindex index) const {
259 return this->_filters.get(index).element;
260 }
261
264 virtual ZFFilterType filterTypeAt(ZF_IN zfindex index) const {
265 return this->_filters.get(index).filterType;
266 }
267
271 if(this->_customFilters == zfnull) {
272 this->_customFilters = zfnew(_CustomFilterCallbacksType);
273 }
274 this->_customFilters->add(customFilterCallback);
275 return *this;
276 }
277
281 if(this->_customFilters != zfnull) {
282 for(zfindex i = 0; i < this->_customFilters->count(); ++i) {
283 if(this->_customFilters->get(i) == customFilterCallback) {
284 this->_customFilters->remove(i);
285 break;
286 }
287 }
288 }
289 return *this;
290 }
291
295 if(this->_customFilters != zfnull) {
296 this->_customFilters->remove(index);
297 }
298 return *this;
299 }
300
303 virtual zfindex customFilterCallbackCount(void) const {
304 if(this->_customFilters != zfnull) {
305 return this->_customFilters->count();
306 }
307 return 0;
308 }
309
313 return this->_customFilters->get(index);
314 }
315
318 virtual zfbool filterPassed(ZF_IN T_Public const &e) const {
319 if(!this->filterOnCheckValid(e)) {
320 return zffalse;
321 }
322 if(this->_customFilters != zfnull) {
323 for(zfindex i = 0; i < this->_customFilters->count(); ++i) {
324 switch(this->_customFilters->get(i)(e)) {
325 case ZFFilterResultNotSpecified:
326 break;
327 case ZFFilterResultActive:
328 return zftrue;
329 case ZFFilterResultNotActive:
330 return zffalse;
331 default:
333 break;
334 }
335 }
336 }
337 return this->filterOnCheckActive(e);
338 }
339
340private:
341 static void _ZFP_ZFFilterBase_contentInfoGetter(
343 , ZF_IN const _ZFP_ZFFilterData<T_Internal> &v
344 ) {
345 ret += '(';
346 switch(v.filterType) {
347 case ZFFilterTypeInclude:
348 ret += "include ";
349 break;
350 case ZFFilterTypeExclude:
351 ret += "exclude ";
352 break;
353 default:
355 return;
356 }
357 zfsFromPointerT(ret, &(v.element));
358 ret += ')';
359 }
360public:
362 virtual void objectInfoT(ZF_IN_OUT zfstring &ret) const {
363 this->_filters.objectInfoOfContentT(ret,
364 5, // max count
366 _ZFP_ZFFilterBase_contentInfoGetter);
367 }
368
369 virtual inline zfstring objectInfo(void) const {
370 zfstring ret;
371 this->objectInfoT(ret);
372 return ret;
373 }
374
375protected:
381 virtual zfbool filterOnCheckValid(ZF_IN T_Public const &e) const {
382 return zftrue;
383 }
384
387 virtual void filterOnStore(
388 ZF_IN_OUT T_Internal &to
389 , ZF_IN T_Public const &from
390 ) const zfpurevirtual;
394 virtual void filterOnRemove(ZF_IN_OUT T_Internal &value) const {}
398 virtual void filterOnAccess(
399 ZF_IN_OUT T_Public &to
400 , ZF_IN T_Internal const &from
401 ) const zfpurevirtual;
408 ZF_IN T_Internal const &e1
409 , ZF_IN T_Public const &e2
410 ) const zfpurevirtual;
414 virtual zfbool filterOnCheckActive(ZF_IN T_Public const &e) const {
415 zfbool hasIncludeMode = zffalse;
416 zfbool included = zffalse;
417 for(zfindex i = 0; i < this->_filters.count(); ++i) {
418 const _ZFP_ZFFilterData<T_Internal> &filter = this->_filters.get(i);
419 switch(filter.filterType) {
420 case ZFFilterTypeInclude:
421 hasIncludeMode = zftrue;
422 if(this->filterOnCheckEqual(filter.element, e)) {
423 included = zftrue;
424 }
425 break;
426 case ZFFilterTypeExclude:
427 if(this->filterOnCheckEqual(filter.element, e)) {
428 return zffalse;
429 }
430 break;
431 default:
433 return zffalse;
434 }
435 }
436 return (!hasIncludeMode || included);
437 }
438
439private:
440 typedef ZFCoreArray<_ZFP_ZFFilterData<T_Internal> > _FiltersType;
442 _FiltersType _filters;
443 _CustomFilterCallbacksType *_customFilters;
444};
445ZFOUTPUT_TYPE_TEMPLATE(ZFM_EXPAND(typename T_Public, typename T_Internal), ZFM_EXPAND(ZFFilterBase<T_Public, T_Internal>), {v.objectInfoT(s);})
446
447// ============================================================
455template<typename T_Public, typename T_Internal = T_Public>
460
461public:
466 : zfsuper()
467 {
468 }
469
476
478 zfsuper::operator = (ref);
479 return *this;
480 }
482 virtual ~ZFFilterBasic(void) {}
483
484protected:
487 virtual void filterOnStore(
488 ZF_IN_OUT T_Internal &to
489 , ZF_IN T_Public const &from
490 ) const {
491 to = from;
492 }
494 virtual void filterOnAccess(
495 ZF_IN_OUT T_Public &to
496 , ZF_IN T_Internal const &from
497 ) const {
498 to = from;
499 }
501 virtual zfbool filterOnCheckEqual(
502 ZF_IN T_Internal const &e1
503 , ZF_IN T_Public const &e2
504 ) const {
505 return (e1 == e2);
506 }
508};
509ZFOUTPUT_TYPE_TEMPLATE(ZFM_EXPAND(typename T_Public, typename T_Internal), ZFM_EXPAND(ZFFilterBasic<T_Public, T_Internal>), {v.objectInfoT(s);})
510
515
520
525
526// ============================================================
530template<typename T_Public, typename T_Internal>
535
536public:
541 : zfsuper()
542 {
543 }
544
551
553 zfsuper::operator = (ref);
554 return *this;
555 }
557 virtual ~ZFFilterForStringBase(void) {}
558
559protected:
561 virtual zfbool filterOnCheckValid(ZF_IN T_Public const &e) const {
562 return (e != zfnull);
563 }
565 virtual void filterOnStore(
566 ZF_IN_OUT T_Internal &to
567 , ZF_IN T_Public const &from
568 ) const {
569 to = from;
570 }
572 virtual void filterOnAccess(
573 ZF_IN_OUT T_Public &to
574 , ZF_IN T_Internal const &from
575 ) const {
576 to = from;
577 }
580 ZF_IN T_Internal const &e1
581 , ZF_IN T_Public const &e2
582 ) const {
583 return (e1.compare(e2) == 0);
584 }
585};
586ZFOUTPUT_TYPE_TEMPLATE(ZFM_EXPAND(typename T_Public, typename T_Internal), ZFM_EXPAND(ZFFilterForStringBase<T_Public, T_Internal>), {v.objectInfoT(s);})
587
592
594
595#endif // #ifndef _ZFI_ZFFilter_h_
596
light weight array
#define ZFCoreCriticalShouldNotGoHere()
log that likes "[file function (line)] should not go here"
Definition ZFCoreLog_CommonLog.h:131
utilities for ZFFramework
zfbool zfsFromPointerT(zfstring &s, const void *p)
convert pointer value to string
Definition ZFCoreStringConvert.h:327
#define zfclassLikePOD
shows the class is not a POD type, but you may use it like a POD except memset it to 0
Definition ZFCoreTypeDef_ClassType.h:41
#define zfextend
dummy macro shows class inherit from another
Definition ZFCoreTypeDef_ClassType.h:53
#define zfpurevirtual
dummy macro shows that a method is pure virtual method
Definition ZFCoreTypeDef_ClassType.h:68
#define zfdelete(instance)
same as delete defined for future use
Definition ZFCoreTypeDef_ClassType.h:91
#define zfoverride
dummy macro shows that method override parent's method
Definition ZFCoreTypeDef_ClassType.h:58
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:180
#define ZF_IN_OPT
dummy macro that shows the param used as optional input
Definition ZFCoreTypeDef_ClassType.h:184
#define ZF_IN_OUT
dummy macro that shows the param used as required input and output
Definition ZFCoreTypeDef_ClassType.h:196
#define zfnew(Type,...)
same as new defined for future use
Definition ZFCoreTypeDef_ClassType.h:89
_ZFT_t_zfbool zfbool
bool type
Definition ZFCoreTypeDef_CoreType.h:103
_ZFT_t_zfindex zfindex
similar to size_t, used for index and size only
Definition ZFCoreTypeDef_CoreType.h:154
#define zftrue
bool true type
Definition ZFCoreTypeDef_CoreType.h:107
#define zffalse
bool false type
Definition ZFCoreTypeDef_CoreType.h:111
#define zfnull
same as NULL, defined for future use
Definition ZFCoreTypeDef_CoreType.h:88
#define ZFOUTPUT_TYPE(T_Type, outputAction)
declare your custom type conversion to string, convenient for debug
Definition ZFCoreTypeDef_OtherType.h:221
#define ZFOUTPUT_TYPE_TEMPLATE(T_typenameList, T_Type, outputAction)
see ZFOUTPUT_TYPE
Definition ZFCoreTypeDef_OtherType.h:262
zft_zfstring< zfchar > zfstring
see zft_zfstring
Definition ZFCoreTypeDef_StringType.h:15
#define ZFM_EXPAND(...)
macro to expand a macro
Definition ZFCoreUtilMacro.h:148
ZFFilterBasic< zfidentity > ZFFilterForIdentity
number filter with zfidentity as filter type
Definition ZFFilter.h:524
ZFFilterForStringBase< const zfchar *, zfstring > ZFFilterForString
string filter with const zfchar * as public type and zfstring as internal storage type
Definition ZFFilter.h:591
#define ZFTOKEN_ZFFilterResultActive
string tokens
Definition ZFFilter.h:52
#define ZFTOKEN_ZFFilterResultNotActive
string tokens
Definition ZFFilter.h:54
ZFFilterBasic< zfindex > ZFFilterForIndex
number filter with zfindex as filter type
Definition ZFFilter.h:519
#define ZFFILTER_DECLARE(ChildClass, SuperClass)
declare a filter class
Definition ZFFilter.h:83
#define ZFTOKEN_ZFFilterTypeExclude
string tokens
Definition ZFFilter.h:26
ZFFilterType
filter type
Definition ZFFilter.h:19
ZFFilterBasic< zfint > ZFFilterForNumber
number filter with zfint as filter type
Definition ZFFilter.h:514
#define ZFTOKEN_ZFFilterTypeInclude
string tokens
Definition ZFFilter.h:24
ZFFilterResult
filter result for custom filter callback
Definition ZFFilter.h:44
#define ZFTOKEN_ZFFilterResultNotSpecified
string tokens
Definition ZFFilter.h:50
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
#define ZFTokenForContainerDefault()
see ZFTokenForContainer, modifyable, ZFTokenForContainerTrim by default
Definition ZFToken.h:107
light weight array
Definition ZFCoreArray.h:331
base class of filter
Definition ZFFilter.h:106
virtual ZFFilterBase< T_Public, T_Internal > & customFilterCallbackRemove(typename ZFFilterBase< T_Public, T_Internal >::CustomFilterCallback customFilterCallback)
remove custom filter callback
Definition ZFFilter.h:280
ZFFilterResult(* CustomFilterCallback)(T_Public const &e)
Definition ZFFilter.h:115
ZFFilterBase(void)
main constructor
Definition ZFFilter.h:121
virtual zfstring objectInfo(void) const
return object info
Definition ZFFilter.h:369
virtual void filterRemoveAll(void)
remove all contents of this filter
Definition ZFFilter.h:233
virtual zfbool filterPassed(T_Public const &e) const
return true if e is not filtered by this filter, see ZFFilterType
Definition ZFFilter.h:318
virtual ZFFilterBase< T_Public, T_Internal > & filterRemoveAt(zfindex index)
remove a element
Definition ZFFilter.h:225
virtual zfbool filterOnCheckEqual(T_Internal const &e1, T_Public const &e2) const=0
virtual ZFFilterType filterTypeAt(zfindex index) const
get filter type for filter data at index
Definition ZFFilter.h:264
ZFFilterBase(const ZFFilterBase< T_Public, T_Internal > &ref)
construct from another filter, retain only, you should use copyFrom to copy contents
Definition ZFFilter.h:129
virtual ZFFilterBase< T_Public, T_Internal > & customFilterCallbackRemove(zfindex index)
remove custom filter callback
Definition ZFFilter.h:294
ZFFilterBase< T_Public, T_Internal > zfself
typedef for self
Definition ZFFilter.h:109
virtual void copyFrom(ZFFilterBase< T_Public, T_Internal > const &ref)
copy from another filter
Definition ZFFilter.h:169
virtual void filterOnRemove(T_Internal &value) const
Definition ZFFilter.h:394
virtual T_Public filterElementAt(zfindex index) const
get element at index
Definition ZFFilter.h:250
virtual zfbool filterOnCheckValid(T_Public const &e) const
Definition ZFFilter.h:381
virtual zfbool filterOnCheckActive(T_Public const &e) const
Definition ZFFilter.h:414
virtual void objectInfoT(zfstring &ret) const
see objectInfo
Definition ZFFilter.h:362
virtual ZFFilterBase< T_Public, T_Internal > & filter(T_Public const &e, ZFFilterType filterType=ZFFilterTypeExclude)
add a element
Definition ZFFilter.h:190
virtual ZFFilterBase< T_Public, T_Internal > & customFilterCallbackAdd(typename ZFFilterBase< T_Public, T_Internal >::CustomFilterCallback customFilterCallback)
add a custom filter callback
Definition ZFFilter.h:270
virtual ZFFilterBase< T_Public, T_Internal >::CustomFilterCallback customFilterCallbackAt(zfindex index) const
get custom filter callback
Definition ZFFilter.h:312
virtual zfindex customFilterCallbackCount(void) const
get custom filter callback count
Definition ZFFilter.h:303
virtual ZFFilterBase< T_Public, T_Internal > & filterRemove(T_Public const &e, ZFFilterType filterType=ZFFilterTypeExclude)
remove a element
Definition ZFFilter.h:205
virtual void filterOnStore(T_Internal &to, T_Public const &from) const=0
virtual zfindex filterCount(void) const
get count of element
Definition ZFFilter.h:244
virtual void filterOnAccess(T_Public &to, T_Internal const &from) const=0
virtual T_Internal const & filterInternalAt(zfindex index) const
get filter data at index
Definition ZFFilter.h:258
basic filter
Definition ZFFilter.h:456
ZFFilterBasic(void)
see ZFFilterBasic
Definition ZFFilter.h:465
ZFFilterBasic(const ZFFilterBasic< T_Public, T_Internal > &ref)
see ZFFilterBasic
Definition ZFFilter.h:472
ZFFilterBase< T_Public, T_Internal > zfsuper
Definition ZFFilter.h:459
base class of string filter
Definition ZFFilter.h:531
virtual void filterOnStore(T_Internal &to, T_Public const &from) const
store public type to internal storage type
Definition ZFFilter.h:565
virtual zfbool filterOnCheckValid(T_Public const &e) const
return true if element is valid for a filter
Definition ZFFilter.h:561
ZFFilterForStringBase(void)
main constructor
Definition ZFFilter.h:540
ZFFilterBase< const zfchar *, zfstring > zfsuper
Definition ZFFilter.h:534
virtual void filterOnAccess(T_Public &to, T_Internal const &from) const
access public type from internal storage type
Definition ZFFilter.h:572
ZFFilterForStringBase(const ZFFilterForStringBase< T_Public, T_Internal > &ref)
see ZFFilterBase
Definition ZFFilter.h:547
virtual zfbool filterOnCheckEqual(T_Internal const &e1, T_Public const &e2) const
true if e1 is regarded as equal to e2
Definition ZFFilter.h:579