Go to the documentation of this file.00001 #ifndef __creaImageIOTreeNodeComparators_h_INCLUDED__
00002 #define __creaImageIOTreeNodeComparators_h_INCLUDED__
00003
00004 #include <vector>
00005 #include <iostream>
00006
00007 namespace creaImageIO
00008 {
00009
00010 namespace tree
00011 {
00012
00013
00014 class Node;
00015
00016
00020
00022 struct Comparator
00023 {
00024 virtual ~Comparator() {}
00025 virtual bool operator() (Node* const & x, Node* const & y) = 0;
00026 };
00027
00028
00029
00030
00031
00033 struct ComparatorWithOrder : public Comparator
00034 {
00035 ComparatorWithOrder(bool reverse_order = false)
00036 : mReverseOrder(reverse_order) {}
00037 virtual ~ComparatorWithOrder() {}
00038
00039
00040 virtual bool compare(Node* const &, Node* const &) = 0;
00041
00042 virtual bool operator() (Node* const & x, Node* const & y)
00043 {
00044 if (mReverseOrder) return this->compare(y,x);
00045 return this->compare(x,y);
00046 };
00047
00048 bool mReverseOrder;
00049 };
00050
00051
00052
00053
00054
00057 class LexicographicalComparator : public Comparator
00058 {
00059 public:
00060 LexicographicalComparator(const std::string& name)
00061 : mName(name) {}
00062 ~LexicographicalComparator() {}
00063
00064 const std::string& GetName() const { return mName; }
00065 void SetName(const std::string& s) { mName = s; }
00066 void Clear() { mComparator.clear(); }
00067 void DeleteComparators()
00068 {
00069 std::vector<Comparator*>::iterator i;
00070 for (i =mComparator.begin();
00071 i!=mComparator.end();
00072 ++i)
00073 {
00074 delete *i;
00075 }
00076 mComparator.clear();
00077 }
00078 void Add(Comparator* c) { mComparator.push_back(c); }
00079
00080 bool operator() (Node* const & x, Node * const & y);
00081
00082 private:
00083 std::string mName;
00084 std::vector<Comparator*> mComparator;
00085 };
00086
00087
00088
00089
00090
00091
00093 struct IntComparator :
00094 public ComparatorWithOrder
00095 {
00096 IntComparator(const std::string& key,
00097 bool reverse_order)
00098 :
00099 ComparatorWithOrder(reverse_order),
00100 mKey(key)
00101 {}
00102 virtual bool compare(Node* const & x, Node* const & y);
00103
00104 private:
00105 std::string mKey;
00106 };
00107
00108
00109
00111 struct FloatComparator :
00112 public ComparatorWithOrder
00113 {
00114 FloatComparator(const std::string& key,
00115 bool reverse_order )
00116 :
00117 ComparatorWithOrder(reverse_order),
00118 mKey(key)
00119 {}
00120
00121 virtual bool compare(Node* const & x, Node* const & y);
00122
00123 private:
00124 std::string mKey;
00125 };
00126
00127
00128
00130 struct StringComparator :
00131 public ComparatorWithOrder
00132 {
00133 StringComparator(const std::string& key,
00134 bool reverse_order )
00135 :
00136 ComparatorWithOrder(reverse_order),
00137 mKey(key)
00138 {}
00139
00140 virtual bool compare(Node* const & x, Node* const & y);
00141
00142 private:
00143 std::string mKey;
00144 };
00145
00146
00147
00148 #define INT_FIELD_COMP(NAME,FIELD) \
00149 struct Node##NAME##Comparator : \
00150 public IntComparator \
00151 { \
00152 Node##NAME##Comparator(bool o = false) : \
00153 IntComparator(FIELD,o) \
00154 {} \
00155 }
00156
00157
00158
00159 #define FLOAT_FIELD_COMP(NAME,FIELD) \
00160 struct Node##NAME##Comparator : \
00161 public FloatComparator \
00162 { \
00163 Node##NAME##Comparator(bool o = false) : \
00164 FloatComparator(FIELD,o) \
00165 {} \
00166 }
00167
00168
00169
00170 #define STRING_FIELD_COMP(NAME,FIELD) \
00171 struct Node##NAME##Comparator : \
00172 public StringComparator \
00173 { \
00174 Node##NAME##Comparator(bool o = false) : \
00175 StringComparator(FIELD,o) \
00176 {} \
00177 }
00178
00179
00180
00181
00182
00183
00185 STRING_FIELD_COMP(PatientName,"A0010_0010");
00187 STRING_FIELD_COMP(PatientSex, "A0010_0040");
00189 STRING_FIELD_COMP(PatientBirthday, "A0010_0030");
00190
00191
00192
00193
00195 STRING_FIELD_COMP(StudyDate,"A0008_0020");
00197 STRING_FIELD_COMP(StudyDescription,"A0008_1030");
00198
00199
00200
00201
00203 STRING_FIELD_COMP(Modality,"A0008_0060");
00205 STRING_FIELD_COMP(SeriesDescription,"A0008_103E");
00207 STRING_FIELD_COMP(SeriesDate,"A0008_0021");
00208
00209
00210
00211
00213 INT_FIELD_COMP(ImageNumber,"A0020_0013");
00215 FLOAT_FIELD_COMP(SliceLocation,"A0020_1041");
00217 STRING_FIELD_COMP(FullFileName,"FullFileName");
00218
00219 }
00220
00221 }
00222
00223
00224
00225 #endif // #ifndef __creaImageIOComparators_h_INCLUDED__