⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smart_pointer.h

📁 A Library of Efficient Data Types and Algorithms,封装了常用的ADT及其相关算法的软件包
💻 H
字号:
#ifndef SMART_POINTER_H#define SMART_POINTER_H#include <iterator>// -----------------------------------------------------------------------------// VC++7 iterator "specializations"// -----------------------------------------------------------------------------namespace std {#if defined(_MSC_VER)template <class _Iter> inline typename iterator_traits<_Iter>::difference_type* _Dist_type(const _Iter&){ return static_cast<typename iterator_traits<_Iter>::difference_type*>(0); }template <class _Iter> inline typename iterator_traits<_Iter>::value_type* _Val_type(const _Iter&){ return static_cast<typename iterator_traits<_Iter>::value_type*>(0); } template <class _Iter> inline typename iterator_traits<_Iter>::iterator_category _Iter_cat(const _Iter&){ return iterator_traits<_Iter>::iterator_category(); }#elsetemplate <class _Iter> inline ptrdiff_t* __distance_type(const _Iter&) { return (ptrdiff_t*)0; }template <class _Iter> inline typename _Iter::pointer __value_type(const _Iter&) { return (typename _Iter::pointer)0; }/*template <class _Iter> inline typename iterator_traits<_Iter>::iterator_category _Iter_cat(const _Iter&){ return iterator_traits<_Iter>::iterator_category(); }*/#endif} // end namespace std#include <LEDA/event.h>LEDA_BEGIN_NAMESPACEtemplate <class T, class V> class smart_pointer;#define SP_VISITOR_TYPE(TYPE) \  struct TYPE \  { void operator()(self& c0, const_self& c1) \    { TYPE##_event.occur(param2<self&,const_self&>(c0,c1)); } \    \    void operator()(self& c, pointer p) \    { TYPE##_event.occur(param2<self&,pointer>(c,p)); } \    \    void operator()(const_self& c0, const_self& c1) \    { TYPE##_event.occur(param2<const_self&,const_self&>(c0,c1)); } \    \    void operator()(self& c) \    { TYPE##_event.occur(param1<self&>(c)); } \    \    void operator()(const_self& c) \    { TYPE##_event.occur(param1<const_self&>(c)); } \    \    void operator()(const_self& c, int i) \    { TYPE##_event.occur(param2<const_self&,int>(c,i)); } \    \    void operator()(self& c, int i) \    { TYPE##_event.occur(param2<self&,int>(c,i)); } \  }; template <class T>struct sp_visitor{  typedef smart_pointer<T, sp_visitor<T> >       self;  typedef const smart_pointer<T, sp_visitor<T> > const_self;    typedef T* pointer;     static event constructor_event;  static event destructor_event;  static event assignment_event;    static event access_event;    static event decrement_event;  static event increment_event;    static event lesser_event;  static event lesser_equal_event;  static event greater_event;  static event greater_equal_event;  static event equal_event;  static event not_equal_event;	  	  SP_VISITOR_TYPE(constructor);  SP_VISITOR_TYPE(destructor);  SP_VISITOR_TYPE(assignment);	  SP_VISITOR_TYPE(access);  SP_VISITOR_TYPE(lesser);  SP_VISITOR_TYPE(lesser_equal);  SP_VISITOR_TYPE(greater);  SP_VISITOR_TYPE(greater_equal);  SP_VISITOR_TYPE(not_equal);  SP_VISITOR_TYPE(equal);    SP_VISITOR_TYPE(increment);  SP_VISITOR_TYPE(decrement);};template <class T> event sp_visitor<T>::constructor_event;template <class T> event sp_visitor<T>::destructor_event;template <class T> event sp_visitor<T>::assignment_event;template <class T> event sp_visitor<T>::access_event;template <class T> event sp_visitor<T>::increment_event;template <class T> event sp_visitor<T>::decrement_event;template <class T> event sp_visitor<T>::lesser_event;template <class T> event sp_visitor<T>::lesser_equal_event;template <class T> event sp_visitor<T>::greater_event;template <class T> event sp_visitor<T>::greater_equal_event;template <class T> event sp_visitor<T>::equal_event;template <class T> event sp_visitor<T>::not_equal_event;template <class T, class visitor = sp_visitor<T> > class smart_pointer : public visitor{    T* p;     public:       typedef std::random_access_iterator_tag iterator_category;  typedef ptrdiff_t difference_type;        typedef T         value_type;  typedef T&        reference;  typedef const T&  const_reference;   typedef T*        pointer;    typedef smart_pointer<T,visitor>       self;  typedef const smart_pointer<T,visitor> const_self;    pointer data() const { return p; }    smart_pointer(pointer q = 0) : p(q)  { typename visitor::constructor V; V(*this,q); }      smart_pointer(const_self& sp) : p(sp.p)  { typename visitor::constructor V; V(*this,sp); } ~smart_pointer()   { typename visitor::destructor V; V(*this); }    self& operator=(const_self& sp)  { typename visitor::assignment V; V(*this,sp);     p = sp.p;    return *this;  }    self& operator=(pointer q)  { typename visitor::assignment V; V(*this,x);     p = q;    return *this;  }      reference operator[](int x)    { typename visitor::access V; V(*this,x);    return p[x];   }     const_reference operator[](int x) const  { typename visitor::access V; V(*this,x);    return p[x];   }    reference operator*()   { typename visitor::access V; V(*this);    return *p;   }    const_reference operator*() const   { typename visitor::access V; V(*this);    return *p;   }    pointer operator->() const   { typename visitor::access V; V(*this);    return p;   }        operator pointer() { return p;  }      // --------------------------------------  // arithmetic operations  // --------------------------------------  self& operator++()   { p++;     typename visitor::increment V; V(*this);            return *this;   }        self& operator--()   { p--;            typename visitor::decrement V; V(*this);            return *this;   }    self operator++(int)   { T* tmp = p++;        typename visitor::increment V; V(*this,tmp);     return tmp;   }        self operator--(int)   { T* tmp = p--;     typename visitor::decrement V; V(*this,tmp);         return tmp;   }    self& operator+=(int i)  { p + i;     typename visitor::increment V; V(*this,i);        return *this;    }    self& operator-=(int i)  { p - i;     typename visitor::decrement V; V(*this,i);        return *this;    }    self operator+(int i) const { return p + i; }   self operator-(int i) const { return p - i; }    int operator-(const_self& c) const { return p - c.p; }    // --------------------------------------  // compare operations  // --------------------------------------    bool operator<(const_self& c) const  { typename visitor::lesser V; V(*this,c);    return p < c.p;   }    bool operator>(const_self& c) const  { typename visitor::greater V; V(*this,c);    return p > c.p;   }    bool operator<=(const_self& c) const  { typename visitor::lesser_equal V; V(*this,c);    return p <= c.p;   }      bool operator>=(const_self& c) const  { typename visitor::greater_equal V; V(*this,c);    return p >= c.p;   }        bool operator==(const_self& c) const  { typename visitor::equal V; V(*this,c);    return p == c.p;   }      bool operator!=(const_self& c) const  { typename visitor::not_equal V; V(*this,c);    return p != c.p;   }  };template <class T, class V>bool operator<(const smart_pointer<T,V>& c, T* p) { typename smart_pointer<T,V>::lesser Vis; Vis(c,p);  return c.data() < p; }template <class T, class V>bool operator>(const smart_pointer<T,V>& c, T* p) { typename smart_pointer<T,V>::greater Vis; Vis(c,p);  return c.data() > p; }template <class T, class V>bool operator<(T* p, const smart_pointer<T,V>& c) { typename smart_pointer<T,V>::greater Vis; Vis(c,p);  return p < c.data(); }template <class T, class V>bool operator>(T* p, const smart_pointer<T,V>& c) { typename smart_pointer<T,V>::lesser Vis; Vis(c,p);    return p > c.data(); }template <class T, class V>bool operator<=(const smart_pointer<T,V>& c, T* p) { typename smart_pointer<T,V>::lesser_equal Vis; Vis(c,p);    return c.data() <= p; }template <class T, class V>bool operator>=(T* p, const smart_pointer<T,V>& c) { typename smart_pointer<T,V>::lesser_equal Vis; Vis(c,p);  return p >= c.data(); }template <class T, class V>bool operator<=(T* p, const smart_pointer<T,V>& c) { typename smart_pointer<T,V>::greater_equal Vis; Vis(c,p);  return p <= c.data(); }template <class T, class V>bool operator>=(const smart_pointer<T,V>& c, T* p) { typename smart_pointer<T,V>::greater_equal Vis; Vis(c,p);  return c.data() >= p; }template <class T, class V>bool operator==(const smart_pointer<T,V>& c, T* p) { typename smart_pointer<T,V>::equal Vis; Vis(c,p);  return c.data() == p; }template <class T, class V>bool operator==(T* p, const smart_pointer<T,V>& c) { return operator==(c,p); }  template <class T, class V>bool operator!=(const smart_pointer<T,V>& c, T* p) { typename smart_pointer<T,V>::not_equal Vis; Vis(c,p);  return c.data() != p; }template <class T, class V>bool operator!=(T* p, const smart_pointer<T,V>& c) { return operator!=(c,p); }LEDA_END_NAMESPACE#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -