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 itkSTLContainerAdaptor_h
19 #define itkSTLContainerAdaptor_h
20 
21 namespace itk
22 {
23 /** \class STLContainerAdaptor
24  *  \brief An adapter object that casts a itk::XxxContainer into std::xxx
25  *         and enables access to the underlying data structure.
26  *
27  * When the STLContainerAdaptor
28  * is destroyed, it automatically calls XxxContainer::Modified().
29  *
30  * Here's a usage example of STLContainerAdaptor:
31  *
32    \code
33        itk::STLContainerAdaptor<itk::VectorContainer<size_t, ElementType>> vecAdaptor(aContainer);
34        std::vector<ElementType> & vec = vecAdaptor.GetSTLContainerRef();
35        // do things with vec ...
36        // upon return from function, vecAdaptor is destroyed and aContainer is Modified()
37    \endcode
38  *
39  * \ingroup ITKCommon
40  */
41 
42 template< typename TContainer >
43 class STLContainerAdaptor
44 {
45 public:
46 
47   using AdapteeType = TContainer;
48 
49   using ElementType = typename AdapteeType::Element;
50   using TargetType = typename AdapteeType::STLContainerType;
51 
52 private:
53 
54   AdapteeType & m_AdapteeRef;
55 
56   /** hide the copy constructor to allow only direct construction of the adapter
57     */
58   STLContainerAdaptor(const STLContainerAdaptor & r) = delete;
59 
60   /* hide and avoid operator= */
61   const STLContainerAdaptor & operator=(const STLContainerAdaptor & r) = delete;
62 
63 public:
STLContainerAdaptor(AdapteeType & adaptee)64   STLContainerAdaptor(AdapteeType & adaptee):m_AdapteeRef(adaptee) {}
65 
STLContainerAdaptor(AdapteeType * adaptee)66   STLContainerAdaptor(AdapteeType *adaptee):m_AdapteeRef(*adaptee) {}
67 
~STLContainerAdaptor()68   ~STLContainerAdaptor()
69   {
70     m_AdapteeRef.Modified();
71   }
72 
GetSTLContainerRef()73   TargetType & GetSTLContainerRef()
74   {
75     return m_AdapteeRef.CastToSTLContainer();
76   }
77 };
78 } // end namespace itk
79 
80 #endif
81