1 /*========================================================================= 2 * 3 * Copyright Insight Software Consortium 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0.txt 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 *=========================================================================*/ 18 #ifndef itkThreadedImageRegionPartitioner_h 19 #define itkThreadedImageRegionPartitioner_h 20 21 #include "itkThreadedDomainPartitioner.h" 22 #include "itkImageRegion.h" 23 #include "itkImageRegionSplitterSlowDimension.h" 24 25 namespace itk 26 { 27 28 /** \class ThreadedImageRegionPartitioner 29 * \brief Class for partitioning of an ImageRegion. 30 * 31 * \tparam VDimension The dimensionality of the image. 32 * 33 * The \c DomainType is defined to be an itk::ImageRegion. 34 * 35 * Partitioning will occur within the outermost, non-singleton-length 36 * dimension of the image region. 37 * 38 * This class is typically used as a template argument to a DomainThreader. 39 * 40 * \sa ThreadedDomainPartitioner 41 * \sa DomainThreader 42 * \ingroup ITKCommon 43 */ 44 template <unsigned int VDimension> 45 class ITK_TEMPLATE_EXPORT ThreadedImageRegionPartitioner 46 : public ThreadedDomainPartitioner< ImageRegion<VDimension> > 47 { 48 public: 49 ITK_DISALLOW_COPY_AND_ASSIGN(ThreadedImageRegionPartitioner); 50 51 /** Standard class type aliases. */ 52 using Self = ThreadedImageRegionPartitioner; 53 using Superclass = ThreadedDomainPartitioner<ImageRegion<VDimension> >; 54 using Pointer = SmartPointer<Self>; 55 using ConstPointer = SmartPointer<const Self>; 56 57 /** Method for creation through the object factory. */ 58 itkNewMacro(Self); 59 60 /** Run-time type information (and related methods). */ 61 itkTypeMacro(ThreadedImageRegionPartitioner, ThreadedDomainPartitioner); 62 63 /** Type of the object being threaded over */ 64 using DomainType = typename Superclass::DomainType; 65 66 /** Deprecated type alias. */ 67 static constexpr unsigned int ImageDimension = VDimension; 68 using ImageRegionType = typename Self::DomainType; 69 using SizeType = typename Self::DomainType::SizeType; 70 using IndexType = typename Self::DomainType::IndexType; 71 72 /** Split the ImageRegion \c completeRegion into up to \c requestedTotal 73 * non-overlapping subregions, setting subregion number \c threadId as 74 * \c subRegion and returning the total number of subregions actually available. 75 * 76 * This method should be called repeatedly for each value of \c threadId from 0 up 77 * to the return value (which is always less than or equal to \c requestedTotal). 78 * 79 * It is an error for \c completeRegion to be zero-length. 80 * If \c threadId is greater than the return value, the contents of 81 * \c subRegion are undefined. 82 */ 83 84 ThreadIdType PartitionDomain(const ThreadIdType threadId, 85 const ThreadIdType requestedTotal, 86 const DomainType& completeRegion, 87 DomainType& subRegion) const override; 88 89 protected: 90 ThreadedImageRegionPartitioner(); 91 ~ThreadedImageRegionPartitioner() override = default; 92 93 using ImageRegionSplitterType = ImageRegionSplitterSlowDimension; 94 95 private: 96 ImageRegionSplitterType::Pointer m_ImageRegionSplitter; 97 }; 98 99 } // end namespace itk 100 101 #ifndef ITK_MANUAL_INSTANTIATION 102 # include "itkThreadedImageRegionPartitioner.hxx" 103 #endif 104 105 #endif 106