00001 #ifndef StiFilter_H
00002 #define StiFilter_H 1
00003 #include <string>
00004 #include <vector>
00005 using std::string;
00006 #include <Stiostream.h>
00007 #include <stdlib.h>
00008
00009 class StiFilter
00010 {
00011 public:
00012
00013 enum FilterMode {Null=0,Bool,ByValue,ByRange,ByExcludedRange};
00014
00016
00018 StiFilter():
00019 name("noname"), used(true), minimum(0.), maximum(1.), mode(Null)
00020 {}
00021
00023 StiFilter(bool v, const string& n="noname", bool u=true):
00024 name(n), used(u), minimum(v), maximum(0.), mode(Bool)
00025 {}
00026
00028 StiFilter(int v, const string& n="noname", bool u=true):
00029 name(n), used(u), minimum(v), maximum(0.), mode(ByValue)
00030 {}
00031
00033 StiFilter(double v, const string& n="noname", bool u=true):
00034 name(n), used(u), minimum(v), maximum(0.), mode(ByValue)
00035 {}
00036
00038 StiFilter(double min, double max, const string& n="noname", bool u=true):
00039 name(n), used(u), minimum(min), maximum(max), mode(ByRange)
00040 {}
00041
00043 StiFilter(double min, double max, bool reverse, const string& n="noname", bool u=true):
00044 name(n), used(u), minimum(min), maximum(max), mode(reverse?ByExcludedRange:ByRange)
00045 {}
00046
00048 StiFilter(const StiFilter &sp):
00049 name(sp.name),used(sp.used),minimum(sp.minimum), maximum(sp.maximum), mode(sp.mode)
00050 {}
00051
00052 virtual ~StiFilter()
00053 {}
00054
00055 void setName(const string& n)
00056 {
00057 name = n;
00058 }
00059
00060 void setUsed(bool u)
00061 {
00062 used = u;
00063 }
00064
00065 void setValue(bool value)
00066 {
00067 minimum = value?1:0;
00068 }
00069
00070 void setValue(int value)
00071 {
00072 minimum = value;
00073 }
00074
00075 void setValue(double value)
00076 {
00077 minimum = value;
00078 }
00079
00080 void setRange(double min, double max)
00081 {
00082 minimum = min;
00083 maximum = max;
00084 }
00085
00086 void set(double min, double max, bool reverse, const string& n, bool u)
00087 {
00088 name = n;
00089 used = u;
00090 minimum = min;
00091 maximum = max;
00092 mode = reverse?ByExcludedRange:ByRange;
00093 }
00094
00095 string getName()
00096 {
00097 return string(name);
00098 }
00099
00100 bool isUsed()
00101 {
00102 return used;
00103 }
00104
00105 double getValue()
00106 {
00107 return minimum;
00108 }
00109
00110 double getMinimum()
00111 {
00112 return minimum;
00113 }
00114
00115 double getMaximum()
00116 {
00117 return maximum;
00118 }
00119
00120 void print();
00121
00122 StiFilter& operator=(const StiFilter &);
00123 friend ostream& operator<<(ostream& os, const StiFilter &);
00124
00125 virtual bool accept(bool value);
00126 virtual bool accept(int value);
00127 virtual bool accept(double value);
00128
00129 protected:
00130 string name;
00131 bool used;
00132 double minimum;
00133 double maximum;
00134 int mode;
00135 };
00136
00138 inline bool StiFilter::accept(bool value)
00139 {
00140 return value? minimum>0 : minimum==0 ;
00141 }
00142
00144 inline bool StiFilter::accept(int value)
00145 {
00146 switch (mode)
00147 {
00148 case Null: return false;
00149 case Bool: return minimum?value>0:value==0;
00150 case ByValue: return minimum==value;
00151 case ByRange: return value>minimum&&value<=maximum;
00152 case ByExcludedRange: return value<=minimum || value>maximum;
00153 }
00154 return false;
00155 }
00156
00158 inline bool StiFilter::accept(double value)
00159 {
00160 switch (mode)
00161 {
00162 case Null: return false;
00163 case Bool: return minimum?value>0:value==0;
00164 case ByValue: return minimum==value;
00165 case ByRange: return value>minimum&&value<=maximum;
00166 case ByExcludedRange: return value<=minimum || value>maximum;
00167 }
00168 return false;
00169 }
00170
00171 typedef vector<StiFilter*> StiFilterVec;
00172 #endif