#ifndef __creaImageIODicomNodeComparators_h_INCLUDED__ #define __creaImageIODicomNodeComparators_h_INCLUDED__ #include #include namespace creaImageIO { class DicomNode; //===================================================================== struct DicomNodeComparator { virtual ~DicomNodeComparator() {} virtual bool operator() (DicomNode* const & x, DicomNode* const & y) = 0; }; //===================================================================== //===================================================================== struct DicomNodeComparatorWithOrder : public DicomNodeComparator { DicomNodeComparatorWithOrder(bool reverse_order = false) : mReverseOrder(reverse_order) {} virtual ~DicomNodeComparatorWithOrder() {} virtual bool compare(DicomNode* const &, DicomNode* const &) = 0; virtual bool operator() (DicomNode* const & x, DicomNode* const & y) { if (mReverseOrder) return this->compare(y,x); return this->compare(x,y); }; bool mReverseOrder; }; //===================================================================== //===================================================================== class LexicographicalDicomNodeComparator : public DicomNodeComparator { public: LexicographicalDicomNodeComparator(const std::string& name) : mName(name) {} ~LexicographicalDicomNodeComparator() {} const std::string& GetName() const { return mName; } void SetName(const std::string& s) { mName = s; } void Clear() { mDicomNodeComparator.clear(); } void DeleteComparators() { std::vector::iterator i; for (i =mDicomNodeComparator.begin(); i!=mDicomNodeComparator.end(); ++i) { delete *i; } mDicomNodeComparator.clear(); } void Add(DicomNodeComparator* c) { mDicomNodeComparator.push_back(c); } bool operator() (DicomNode* const & x, DicomNode * const & y); private: std::string mName; std::vector mDicomNodeComparator; }; //===================================================================== //=================================================================== struct DicomNodeIntFieldComparator : public DicomNodeComparatorWithOrder { DicomNodeIntFieldComparator(const std::string& key, bool reverse_order) : DicomNodeComparatorWithOrder(reverse_order), mKey(key) {} virtual bool compare(DicomNode* const & x, DicomNode* const & y); private: std::string mKey; }; //=================================================================== //=================================================================== struct DicomNodeFloatFieldComparator : public DicomNodeComparatorWithOrder { DicomNodeFloatFieldComparator(const std::string& key, bool reverse_order ) : DicomNodeComparatorWithOrder(reverse_order), mKey(key) {} virtual bool compare(DicomNode* const & x, DicomNode* const & y); private: std::string mKey; }; //=================================================================== //=================================================================== struct DicomNodeStringFieldComparator : public DicomNodeComparatorWithOrder { DicomNodeStringFieldComparator(const std::string& key, bool reverse_order ) : DicomNodeComparatorWithOrder(reverse_order), mKey(key) {} virtual bool compare(DicomNode* const & x, DicomNode* const & y); private: std::string mKey; }; //=================================================================== //=================================================================== #define INT_FIELD_COMP(NAME,FIELD) \ struct DicomNode##NAME##Comparator : \ public DicomNodeIntFieldComparator \ { \ DicomNode##NAME##Comparator(bool o = false) : \ DicomNodeIntFieldComparator(FIELD,o) \ {} \ } //================================================================== //=================================================================== #define FLOAT_FIELD_COMP(NAME,FIELD) \ struct DicomNode##NAME##Comparator : \ public DicomNodeFloatFieldComparator \ { \ DicomNode##NAME##Comparator(bool o = false) : \ DicomNodeFloatFieldComparator(FIELD,o) \ {} \ } //=================================================================== //=================================================================== #define STRING_FIELD_COMP(NAME,FIELD) \ struct DicomNode##NAME##Comparator : \ public DicomNodeStringFieldComparator \ { \ DicomNode##NAME##Comparator(bool o = false) : \ DicomNodeStringFieldComparator(FIELD,o) \ {} \ } //=================================================================== //=================================================================== // Patient comparators STRING_FIELD_COMP(PatientName,"A0010_0010"); STRING_FIELD_COMP(PatientSex, "A0010_0040"); STRING_FIELD_COMP(PatientBirthday, "A0010_0030"); //=================================================================== //=================================================================== // Study comparators STRING_FIELD_COMP(StudyDate,"A0008_0020"); STRING_FIELD_COMP(StudyDescription,"A0008_1030"); //=================================================================== //=================================================================== // Series comparators STRING_FIELD_COMP(Modality,"A0008_0060"); STRING_FIELD_COMP(SeriesDescription,"A0008_103E"); STRING_FIELD_COMP(SeriesDate,"A0008_0021"); //=================================================================== //=================================================================== // Image comparators INT_FIELD_COMP(ImageNumber,"A0020_0013"); FLOAT_FIELD_COMP(SliceLocation,"A0020_1041"); STRING_FIELD_COMP(FullFileName,"FullFileName"); //=================================================================== } // namespace creaImageIO #endif // #ifndef __creaImageIOComparators_h_INCLUDED__