/usr/include/gdcm-2.6/gdcmSmartPointer.h is in libgdcm2-dev 2.6.3-3ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | /*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#ifndef GDCMSMARTPOINTER_H
#define GDCMSMARTPOINTER_H
#include "gdcmObject.h"
namespace gdcm
{
/**
* \brief Class for Smart Pointer
* \details
* Will only work for subclass of gdcm::Object
* See tr1/shared_ptr for a more general approach (not invasive)
* #include <tr1/memory>
* {
* shared_ptr<Bla> b(new Bla);
* }
* \note
* Class partly based on post by Bill Hubauer:
* http://groups.google.com/group/comp.lang.c++/msg/173ddc38a827a930
* \see
* http://www.davethehat.com/articles/smartp.htm
*
* and itk::SmartPointer
*/
template<class ObjectType>
class SmartPointer
{
public:
SmartPointer():Pointer(0) {}
SmartPointer(const SmartPointer<ObjectType>& p):Pointer(p.Pointer)
{ Register(); }
SmartPointer(ObjectType* p):Pointer(p)
{ Register(); }
SmartPointer(ObjectType const & p)
{
Pointer = const_cast<ObjectType*>(&p);
Register();
}
~SmartPointer() {
UnRegister();
Pointer = 0;
}
/// Overload operator ->
ObjectType *operator -> () const
{ return Pointer; }
ObjectType& operator * () const
{
assert( Pointer );
return *Pointer;
}
/// Return pointer to object.
operator ObjectType * () const
{ return Pointer; }
/// Overload operator assignment.
SmartPointer &operator = (SmartPointer const &r)
{ return operator = (r.Pointer); }
/// Overload operator assignment.
SmartPointer &operator = (ObjectType *r)
{
// http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.22
// DO NOT CHANGE THE ORDER OF THESE STATEMENTS!
// (This order properly handles self-assignment)
// (This order also properly handles recursion, e.g., if a ObjectType contains SmartPointer<ObjectType>s)
if( Pointer != r )
{
ObjectType* old = Pointer;
Pointer = r;
Register();
if ( old ) { old->UnRegister(); }
}
return *this;
}
SmartPointer &operator = (ObjectType const &r)
{
ObjectType* tmp = const_cast<ObjectType*>(&r);
return operator = (tmp);
}
/// Explicit function to retrieve the pointer
ObjectType *GetPointer() const
{ return Pointer; }
private:
void Register()
{
if(Pointer) Pointer->Register();
}
void UnRegister()
{
if(Pointer) Pointer->UnRegister();
}
ObjectType* Pointer;
};
} // end namespace gdcm
#endif //GDCMSMARTPOINTER_H
|