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