/*========================================================================= * * Copyright Insight Software Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkConditionalConstIterator_h #define itkConditionalConstIterator_h #include "itkIndex.h" namespace itk { /** \class ConditionalConstIterator * \brief A base class for other iterators where membership in the set * of output pixels is conditional upon some property, calculation, * etc. For example, a threshold iterator might walk a region and * return only those pixels which meet a minimum intensity condition. * * This class is the const version of the ConditionalIterator. * For this reason, it doesn't support the Set() method. * * \ingroup ImageIterators * \ingroup ITKCommon */ template< typename TImage > class ITK_TEMPLATE_EXPORT ConditionalConstIterator { public: /** Standard class typedefs. */ typedef ConditionalConstIterator Self; /** Dimension of the image the iterator walks. This constant is needed so * that functions that are templated over image iterator type (as opposed to * being templated over pixel type and dimension) can have compile time * access to the dimension of the image that the iterator walks. */ itkStaticConstMacro(NDimension, unsigned int, TImage::ImageDimension); /** Index typedef support. */ typedef typename TImage::IndexType IndexType; /** Size typedef support. */ typedef typename TImage::SizeType SizeType; /** Region typedef support. */ typedef typename TImage::RegionType RegionType; /** Image typedef support. */ typedef TImage ImageType; /** Internal Pixel Type */ typedef typename TImage::InternalPixelType InternalPixelType; /** External Pixel Type */ typedef typename TImage::PixelType PixelType; /** Compute whether the index of interest should be included in the flood */ virtual bool IsPixelIncluded(const IndexType & index) const = 0; /** operator= is provided to make sure the handle to the image is properly * reference counted. */ Self & operator=(const Self & it) { m_IsAtEnd = it.m_IsAtEnd; // copy the end flag m_Image = it.m_Image; // copy the smart pointer m_Region = it.m_Region; // copy the region return *this; } /** Get the dimension (size) of the index. */ static unsigned int GetIteratorDimension(void) { return Self::NDimension; } /** Get the index at the current iterator location. */ virtual const IndexType GetIndex() = 0; /** Get the pixel value at the current iterator location. */ virtual const PixelType Get(void) const = 0; /** Is the iterator at the end of the region? */ virtual bool IsAtEnd() = 0; /** Walk forward one index. */ virtual void operator++() = 0; /** Constructor */ ConditionalConstIterator(); /** Destructor */ virtual ~ConditionalConstIterator(); protected: //made protected so other iterators can access /** Smart pointer to the source image. */ //SmartPointer m_Image; typename ImageType::ConstWeakPointer m_Image; /** Region type to iterate over. */ RegionType m_Region; /** Is the iterator at the end of its walk? */ bool m_IsAtEnd; }; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION #include "itkConditionalConstIterator.hxx" #endif #endif