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

📄 linked_ptr.h

📁 本人收集整理的一份c/c++跨平台网络库
💻 H
字号:
/* * linked_ptr - simple reference linked pointer * (like reference counting, just using a linked list of the references * instead of their count.) * * The implementation stores three pointers for every linked_ptr, but * does not allocate anything on the free store. */#ifndef UTILS_BASE_LINKED_PTR_H_#define UTILS_BASE_LINKED_PTR_H_namespace utils_base {/* For ANSI-challenged compilers, you may want to #define * NO_MEMBER_TEMPLATES, explicit or mutable */#define NO_MEMBER_TEMPLATEStemplate <class X> class linked_ptr{public:#ifndef NO_MEMBER_TEMPLATES#   define TEMPLATE_FUNCTION template <class Y>    TEMPLATE_FUNCTION friend class linked_ptr<Y>;#else#   define TEMPLATE_FUNCTION    typedef X Y;#endif    typedef X element_type;    explicit linked_ptr(X* p = 0) throw()        : itsPtr(p) {itsPrev = itsNext = this;}    ~linked_ptr()        {release();}    linked_ptr(const linked_ptr& r) throw()        {acquire(r);}    linked_ptr& operator=(const linked_ptr& r)    {        if (this != &r) {            release();            acquire(r);        }        return *this;    }#ifndef NO_MEMBER_TEMPLATES    template <class Y> friend class linked_ptr<Y>;    template <class Y> linked_ptr(const linked_ptr<Y>& r) throw()        {acquire(r);}    template <class Y> linked_ptr& operator=(const linked_ptr<Y>& r)    {        if (this != &r) {            release();            acquire(r);        }        return *this;    }#endif // NO_MEMBER_TEMPLATES    X& operator*()  const throw()   {return *itsPtr;}    X* operator->() const throw()   {return itsPtr;}    X* get()        const throw()   {return itsPtr;}    bool unique()   const throw()   {return itsPrev ? itsPrev==this : true;}private:    X*                          itsPtr;    mutable const linked_ptr*   itsPrev;    mutable const linked_ptr*   itsNext;    void acquire(const linked_ptr& r) throw()    { // insert this to the list        itsPtr = r.itsPtr;        itsNext = r.itsNext;        itsNext->itsPrev = this;        itsPrev = &r;#ifndef mutable        r.itsNext = this;#else // for ANSI-challenged compilers        (const_cast<linked_ptr<X>*>(&r))->itsNext = this;#endif    }#ifndef NO_MEMBER_TEMPLATES    template <class Y> void acquire(const linked_ptr<Y>& r) throw()    { // insert this to the list        itsPtr = r.itsPtr;        itsNext = r.itsNext;        itsNext->itsPrev = this;        itsPrev = &r;#ifndef mutable        r.itsNext = this;#else // for ANSI-challenged compilers        (const_cast<linked_ptr<X>*>(&r))->itsNext = this;#endif    }#endif // NO_MEMBER_TEMPLATES    void release()    { // erase this from the list, delete if unique        if (unique()) delete itsPtr;        else {            itsPrev->itsNext = itsNext;            itsNext->itsPrev = itsPrev;            itsPrev = itsNext = 0;        }        itsPtr = 0;    }};} // namespace utils_base#endif // UTILS_BASE_LINKED_PTR_H_

⌨️ 快捷键说明

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