]> Creatis software - creaImageIO.git/blob - src/creaImageIODicomNodeComparators.h
start!
[creaImageIO.git] / src / creaImageIODicomNodeComparators.h
1 #ifndef __creaImageIODicomNodeComparators_h_INCLUDED__
2 #define __creaImageIODicomNodeComparators_h_INCLUDED__
3
4 #include <vector>
5 #include <iostream>
6
7 namespace creaImageIO
8 {
9
10   class DicomNode;
11
12   //=====================================================================
13   struct DicomNodeComparator
14   {
15     virtual ~DicomNodeComparator() {}
16     virtual bool operator() (DicomNode* const & x, DicomNode* const & y) = 0;
17   };
18   //=====================================================================
19
20   //=====================================================================
21   struct DicomNodeComparatorWithOrder : public DicomNodeComparator
22   {
23     DicomNodeComparatorWithOrder(bool reverse_order = false) 
24       : mReverseOrder(reverse_order) {}
25     virtual ~DicomNodeComparatorWithOrder() {}
26
27
28     virtual bool compare(DicomNode* const &, DicomNode* const &) = 0;
29
30     virtual bool operator() (DicomNode* const & x, DicomNode* const & y)
31     {
32       if (mReverseOrder) return this->compare(y,x);
33       return this->compare(x,y);
34     };
35
36     bool mReverseOrder;
37   };
38   //=====================================================================
39
40   //=====================================================================
41   class LexicographicalDicomNodeComparator : public DicomNodeComparator
42   {
43   public:
44     LexicographicalDicomNodeComparator(const std::string& name) 
45       : mName(name) {}
46     ~LexicographicalDicomNodeComparator() {}
47
48     const std::string& GetName() const { return mName; }
49     void SetName(const std::string& s) { mName = s; }
50     void Clear() { mDicomNodeComparator.clear(); }
51     void DeleteComparators() 
52     { 
53        std::vector<DicomNodeComparator*>::iterator i;
54        for (i =mDicomNodeComparator.begin();
55             i!=mDicomNodeComparator.end();
56             ++i)
57          {
58            delete *i;
59          }
60        mDicomNodeComparator.clear(); 
61     }
62     void Add(DicomNodeComparator* c) { mDicomNodeComparator.push_back(c); }
63     
64     bool operator() (DicomNode* const & x, DicomNode * const & y);
65
66   private:
67     std::string mName;
68     std::vector<DicomNodeComparator*> mDicomNodeComparator;
69   };
70   //=====================================================================
71
72
73   //===================================================================
74   struct DicomNodeIntFieldComparator : 
75     public DicomNodeComparatorWithOrder
76   {    
77     DicomNodeIntFieldComparator(const std::string& key,
78                                      bool reverse_order)
79       :
80       DicomNodeComparatorWithOrder(reverse_order),
81       mKey(key)
82     {}
83     virtual bool compare(DicomNode* const & x, DicomNode* const & y);
84
85   private:
86     std::string mKey;
87   };
88   //===================================================================
89
90   //===================================================================
91   struct DicomNodeFloatFieldComparator : 
92     public DicomNodeComparatorWithOrder
93   {    
94     DicomNodeFloatFieldComparator(const std::string& key,
95                                        bool reverse_order )
96       : 
97       DicomNodeComparatorWithOrder(reverse_order),
98       mKey(key)
99     {}
100
101     virtual bool compare(DicomNode* const & x, DicomNode* const & y);
102
103   private:
104     std::string mKey;
105   };
106   //===================================================================
107
108   //===================================================================
109   struct DicomNodeStringFieldComparator : 
110     public DicomNodeComparatorWithOrder
111   {    
112     DicomNodeStringFieldComparator(const std::string& key,
113                                    bool reverse_order )
114       : 
115       DicomNodeComparatorWithOrder(reverse_order),
116       mKey(key)
117     {}
118     
119     virtual bool compare(DicomNode* const & x, DicomNode* const & y);
120     
121   private:
122     std::string mKey;
123   };
124   //===================================================================
125
126   //===================================================================
127 #define INT_FIELD_COMP(NAME,FIELD)              \
128   struct DicomNode##NAME##Comparator :  \
129     public DicomNodeIntFieldComparator  \
130   {                                             \
131     DicomNode##NAME##Comparator(bool o = false) :       \
132       DicomNodeIntFieldComparator(FIELD,o)      \
133     {}                                          \
134   }
135   //==================================================================
136   
137   //===================================================================
138 #define FLOAT_FIELD_COMP(NAME,FIELD)            \
139   struct DicomNode##NAME##Comparator :  \
140     public DicomNodeFloatFieldComparator        \
141   {                                             \
142     DicomNode##NAME##Comparator(bool o = false) :       \
143       DicomNodeFloatFieldComparator(FIELD,o)    \
144     {}                                          \
145   }
146   //===================================================================
147
148   //===================================================================
149 #define STRING_FIELD_COMP(NAME,FIELD)           \
150   struct DicomNode##NAME##Comparator :  \
151     public DicomNodeStringFieldComparator       \
152   {                                             \
153     DicomNode##NAME##Comparator(bool o = false) :       \
154       DicomNodeStringFieldComparator(FIELD,o)   \
155     {}                                          \
156   }
157   //===================================================================
158
159
160
161   //===================================================================
162   // Patient comparators
163   STRING_FIELD_COMP(PatientName,"A0010_0010");
164   STRING_FIELD_COMP(PatientSex, "A0010_0040");
165   STRING_FIELD_COMP(PatientBirthday, "A0010_0030");
166   //===================================================================
167
168   //===================================================================
169   // Study comparators
170   STRING_FIELD_COMP(StudyDate,"A0008_0020");
171   STRING_FIELD_COMP(StudyDescription,"A0008_1030");
172   //===================================================================
173
174   //===================================================================
175   // Series comparators
176   STRING_FIELD_COMP(Modality,"A0008_0060");
177   STRING_FIELD_COMP(SeriesDescription,"A0008_103E");
178   STRING_FIELD_COMP(SeriesDate,"A0008_0021");
179   //===================================================================
180
181   //===================================================================
182   // Image comparators
183   INT_FIELD_COMP(ImageNumber,"A0020_0013");
184   FLOAT_FIELD_COMP(SliceLocation,"A0020_1041");
185   STRING_FIELD_COMP(FullFileName,"FullFileName");
186   //===================================================================
187
188
189 } // namespace creaImageIO
190
191
192
193 #endif // #ifndef __creaImageIOComparators_h_INCLUDED__