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