Salome HOME
Copyright update: 2016
[modules/smesh.git] / src / MEDWrapper / Base / MED_SharedPtr.hxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 #ifndef MED_SharedPtr_HeaderFile
23 #define MED_SharedPtr_HeaderFile
24
25 #include <boost/shared_ptr.hpp>
26
27 namespace MED
28 {
29
30   //! To extend the boost::shared_ptr to support such features automatic dynamic cast
31   /*!
32     All entities of the MEDWrapper package are handled as pointer.
33     This class was introduced to provide correct and flexible memory management 
34     for all of the MEDWrapper objects.
35   */
36   template<class T> class SharedPtr: public boost::shared_ptr<T>
37   {
38   public:
39     //! Default constructor
40     SharedPtr() {}
41
42     //! Construct the class by any type of a pointer
43     template<class Y>
44     explicit SharedPtr(Y * p): 
45       boost::shared_ptr<T>(p) 
46     {}
47
48     //! Construct the class by any specialisation of the class
49     template<class Y>
50     SharedPtr(SharedPtr<Y> const & r):
51       boost::shared_ptr<T>(boost::dynamic_pointer_cast<T,Y>(r))
52     {}
53
54     //! Copy-constructor
55     template<class Y>
56     SharedPtr& 
57     operator=(SharedPtr<Y> const & r)
58     {
59       SharedPtr<T>(r).swap(*this);
60       return *this;
61     }
62
63     //! Introduce a flexible way to reset the wrapped pointer
64     template<class Y> 
65     SharedPtr& 
66     operator()(Y * p) // Y must be complete
67     {
68       return operator=<Y>(SharedPtr<Y>(p));
69     }
70
71     //! Introduce a flexible way to reset the wrapped pointer
72     template<class Y> 
73     SharedPtr& 
74     operator()(SharedPtr<Y> const & r) // Y must be complete
75     {
76       return operator=<Y>(SharedPtr<Y>(r));
77     }
78
79     //! To provide a flexible way to use reference to the wrapped pointer (const version)
80     operator const T& () const 
81     { 
82       return *(this->get());
83     }
84
85     //! To provide a flexible way to use reference to the wrapped pointer
86     operator T& () 
87     { 
88       return *(this->get());
89     }
90   };
91
92 }
93
94
95 #endif