00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkWatershedSegmentTree_h
00018 #define __itkWatershedSegmentTree_h
00019
00020 #include "itkObjectFactory.h"
00021 #include "itkDataObject.h"
00022 #include "itkProcessObject.h"
00023 #include <deque>
00024 #include <functional>
00025
00026 namespace itk
00027 {
00028 namespace watershed
00029 {
00046 template <class TScalarType>
00047 class ITK_EXPORT SegmentTree : public DataObject
00048 {
00049 public:
00051 typedef SegmentTree Self;
00052 typedef DataObject Superclass;
00053 typedef SmartPointer<Self> Pointer;
00054 typedef SmartPointer<const Self> ConstPointer;
00055 itkNewMacro(Self);
00056 itkTypeMacro(WatershedSegmentTree, DataObject);
00057 typedef TScalarType ScalarType;
00059
00063 struct merge_t
00064 {
00065 unsigned long from;
00066 unsigned long to;
00067 ScalarType saliency;
00068 };
00070
00072 typedef std::deque<merge_t> DequeType;
00073 typedef typename DequeType::iterator Iterator;
00074 typedef typename DequeType::const_iterator ConstIterator;
00075 typedef typename DequeType::value_type ValueType;
00076
00078 struct merge_comp : public std::binary_function<bool, const merge_t&,
00079 const merge_t& >
00080 {
00081 merge_comp() {}
00082 bool operator()(const merge_t &a, const merge_t &b)
00083 {
00084 return b.saliency < a.saliency;
00085 }
00086 };
00088
00090 struct sort_comp : public std::binary_function<bool, const merge_t&,
00091 const merge_t& >
00092 {
00093 bool operator()(const merge_t &a, const merge_t &b)
00094 {
00095 return a.saliency < b.Saliency;
00096 }
00097 };
00098
00100 typename DequeType::size_type Size() const
00101 { return m_Deque.size(); }
00102
00105 bool Empty() const
00106 { return m_Deque.empty(); }
00107
00110 const merge_t &Front() const
00111 { return m_Deque.front(); }
00112
00115 const merge_t &Back() const
00116 { return m_Deque.back(); }
00117
00119 merge_t &Front()
00120 { return m_Deque.front(); }
00121
00123 merge_t &Back()
00124 { return m_Deque.back(); }
00125
00127 void PushFront(const ValueType &t)
00128 { m_Deque.push_front(t); }
00129
00131 void PushBack( const ValueType &t)
00132 { m_Deque.push_back(t); }
00133
00135 void PopFront()
00136 { m_Deque.pop_front(); }
00137
00139 void PopBack()
00140 { m_Deque.pop_back(); }
00141
00143 Iterator Begin()
00144 { return m_Deque.begin(); }
00145
00147 ConstIterator Begin() const
00148 { return m_Deque.begin(); }
00149
00152 Iterator End()
00153 { return m_Deque.end(); }
00154
00157 ConstIterator End() const
00158 { return m_Deque.end(); }
00159
00161 void Clear()
00162 { m_Deque.clear(); }
00163
00166 void Initialize();
00167
00168 protected:
00169 SegmentTree() {}
00170 virtual ~SegmentTree() {}
00171 SegmentTree(const Self&) {}
00172 void operator=(const Self&) {}
00173 void PrintSelf(std::ostream& os, Indent indent) const;
00174
00175 DequeType m_Deque;
00176 };
00177 }
00178 }
00179
00180 #ifndef ITK_MANUAL_INSTANTIATION
00181 #include "itkWatershedSegmentTree.txx"
00182 #endif
00183
00184 #endif
00185