creaImageIOTreeComparators.h

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   // Patient comparators
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   // Study comparators
00195   STRING_FIELD_COMP(StudyDate,"A0008_0020");
00197   STRING_FIELD_COMP(StudyDescription,"A0008_1030");
00198   //===================================================================
00199 
00200   //===================================================================
00201   // Series comparators
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   // Image comparators
00213   INT_FIELD_COMP(ImageNumber,"A0020_0013");
00215   FLOAT_FIELD_COMP(SliceLocation,"A0020_1041");
00217   STRING_FIELD_COMP(FullFileName,"FullFileName");
00218   //===================================================================
00219   } // namespace tree
00220 
00221 } // namespace creaImageIO
00222 
00223 
00224 
00225 #endif // #ifndef __creaImageIOComparators_h_INCLUDED__