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