/*========================================================================= * * Copyright NumFOCUS * * 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 * * https://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 itkImageRegionSplitterMultidimensional_h #define itkImageRegionSplitterMultidimensional_h #include "itkRegion.h" #include "itkIndex.h" #include "itkImageRegionSplitterBase.h" namespace itk { /** \class ImageRegionSplitterMultidimensional * \brief Divide a region into several pieces. * * ImageRegionSplitterMultidimensional divides an ImageRegion into * smaller regions. ImageRegionSplitterMultidimensional is used by * the StreamingImageFilter to divide a requested output region into a * series of smaller requests of the pipeline. This object has two * basic methods: GetNumberOfSplits() and GetSplit(). * * GetNumberOfSplits() is used to determine how may subregions a given * region can be divided. You call GetNumberOfSplits with an argument * that is the number of subregions you want. If the image region can * support that number of subregions, that number is returned. * Otherwise, the maximum number of splits less then or equal to the * argument be returned. For example, if a region splitter class only divides * a region into horizontal slabs, then the maximum number of splits * will be the number of rows in the region. * * GetSplit() returns the ith of N subregions (as an ImageRegion object). * * ImageRegionSplitterMultidimensional class divides a region * into hypercubes (as opposed to the slabs used by the superclass * ImageRegionSplitter). In other words, it splits every dimension of the * region to form ND rectangular prisms. * * \ingroup ITKSystemObjects * \ingroup DataProcessing * \ingroup ITKCommon */ class ITKCommon_EXPORT ImageRegionSplitterMultidimensional : public ImageRegionSplitterBase { public: ITK_DISALLOW_COPY_AND_MOVE(ImageRegionSplitterMultidimensional); /** Standard class type aliases. */ using Self = ImageRegionSplitterMultidimensional; using Superclass = ImageRegionSplitterBase; using Pointer = SmartPointer; using ConstPointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); /** \see LightObject::GetNameOfClass() */ itkOverrideGetNameOfClassMacro(ImageRegionSplitterMultidimensional); protected: ImageRegionSplitterMultidimensional(); unsigned int GetNumberOfSplitsInternal(unsigned int dim, const IndexValueType regionIndex[], const SizeValueType regionSize[], unsigned int requestedNumber) const override; unsigned int GetSplitInternal(unsigned int dim, unsigned int splitI, unsigned int numberOfPieces, IndexValueType regionIndex[], SizeValueType regionSize[]) const override; void PrintSelf(std::ostream & os, Indent indent) const override; private: static unsigned int ComputeSplits(unsigned int dim, unsigned int requestedNumber, const IndexValueType regionIndex[], const SizeValueType regionSize[], unsigned int splits[]); }; } // end namespace itk #endif