8 #ifndef ATLAS_OBJECTS_SMARTPTR_H
9 #define ATLAS_OBJECTS_SMARTPTR_H
11 #include <Atlas/Exception.h>
13 namespace Atlas {
namespace Objects {
28 typedef typename T::iterator iterator;
29 typedef typename T::const_iterator const_iterator;
33 SmartPtr(
const SmartPtr<T>& a) : ptr(a.get()) {
36 SmartPtr(T *a_ptr) : ptr(a_ptr)
40 template<
class oldType>
41 explicit SmartPtr(
const SmartPtr<oldType>& a) : ptr(a.get()) {
46 SmartPtr& operator=(
const SmartPtr<T>& a) {
47 if (a.get() != this->get()) {
54 template<
class newType>
55 operator SmartPtr<newType>()
const {
56 return SmartPtr<newType>(ptr);
58 template<
class newType>
59 operator SmartPtr<const newType>()
const {
60 return SmartPtr<const newType>(ptr);
62 bool isValid()
const {
65 T& operator*()
const {
67 throw NullSmartPtrDereference();
71 T* operator->()
const {
73 throw NullSmartPtrDereference();
80 SmartPtr<T> copy()
const
82 SmartPtr<T> ret = SmartPtr(ptr->copy());
86 SmartPtr<T> getDefaultObject()
const
88 return SmartPtr(ptr->getDefaultObject());
107 template<
typename returnPtrType,
class fromType>
108 returnPtrType smart_dynamic_cast(
const SmartPtr<fromType> & o)
110 return returnPtrType(
dynamic_cast<typename returnPtrType::DataT*
>(o.get()));
113 template<
typename returnPtrType,
class fromType>
114 returnPtrType smart_static_cast(
const SmartPtr<fromType> & o)
116 return returnPtrType((
typename returnPtrType::DataT *)o.get());
121 #endif // ATLAS_OBJECTS_SMARTPTR_H