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 /*=========================================================================
19  *
20  *  Portions of this file are subject to the VTK Toolkit Version 3 copyright.
21  *
22  *  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
23  *
24  *  For complete copyright, license and disclaimer of warranty information
25  *  please refer to the NOTICE file at the top of the ITK source tree.
26  *
27  *=========================================================================*/
28 #ifndef itkRegion_h
29 #define itkRegion_h
30 
31 #include "itkObject.h"
32 
33 namespace itk
34 {
35 /** \class Region
36  * \brief A region represents some portion or piece of data.
37  *
38  * Region is an abstract class that represents some portion or
39  * piece of a DataObject. A region is used by the pipeline when
40  * processing just a portion of the data, either because 1) memory
41  * limits dictate that the pipeline cannot fit the entire dataset
42  * into memory; 2) the user has requested that only a piece of the
43  * dataset is to be processed; or 3) parallel (multi-threaded)
44  * processing of the data is required.
45  *
46  * There are two types of regions in itk: a structured region that
47  * specifies a rectangular piece of an image (ImageRegion), and a
48  * unstructured region that specifies piece i of N total pieces
49  * (MeshRegion). Depending on the filter (its input and output
50  * types, and its position in the pipeline), ImageRegion or MeshRegion
51  * will be used to describe the region.
52  *
53  * Region is a light-weight object and not reference counted. This
54  * means that is behaves differently than ITK classes that are
55  * reference counted. For example, smart pointer access is not
56  * provided, and the (subclasses') constructor, destructor,
57  * copy constructor and operator= are all public.
58  *
59  * \sa ImageRegion
60  * \sa MeshRegion
61  * \ingroup DataRepresentation
62  * \ingroup ITKCommon
63  */
64 class ITKCommon_EXPORT Region
65 {
66 public:
67   /** Standard class type aliases. */
68   using Self = Region;
69 
70   /** Enums used to describe the extent types. */
71   enum RegionType { ITK_UNSTRUCTURED_REGION, ITK_STRUCTURED_REGION };
72 
73   /** Standard part of all itk objects. */
74   itkTypeMacroNoParent(Region);
75 
76   /** Subclasses must return a region type describing whether the region
77    * is structured or unstructured. */
78   virtual RegionType GetRegionType() const = 0;
79 
80   /** Print the region. */
81   virtual void Print(std::ostream & os, Indent indent = 0) const;
82 
83   Region() = default;
84   virtual ~Region() = default;
85 
86 protected:
87   /** Methods invoked by Print() to print information about the object
88    * including superclasses. Typically not called by the user (use Print()
89    * instead) but used in the hierarchical print process to combine the
90    * output of several classes.  */
91   virtual void PrintSelf(std::ostream & os, Indent indent) const;
92 
93   virtual void PrintHeader(std::ostream & os, Indent indent) const;
94 
95   virtual void PrintTrailer(std::ostream & os, Indent indent) const;
96 
97 private:
98 };
99 } // end namespace itk
100 
101 #endif
102