smartptr.h

来自「Windows Mobile平台上使用GDI+。GDI+功能很强大」· C头文件 代码 · 共 1,779 行 · 第 1/4 页

H
1,779
字号
        }        ReferenceType operator*()        {            KP::OnDereference(GetImplRef(*this));            return SP::operator*();        }        ConstReferenceType operator*() const        {            KP::OnDereference(GetImplRef(*this));            return SP::operator*();        }        bool operator!() const // Enables "if (!sp) ..."        { return GetImpl(*this) == 0; }        static inline T * GetPointer( const SmartPtr & sp )        { return GetImpl( sp ); }        // Ambiguity buster        template        <            typename T1,            template <class> class OP1,            class CP1,            template <class> class KP1,            template <class> class SP1,            template <class> class CNP1        >        bool operator==(const SmartPtr<T1, OP1, CP1, KP1, SP1, CNP1 >& rhs) const        { return GetImpl(*this) == GetImpl(rhs); }        // Ambiguity buster        template        <            typename T1,            template <class> class OP1,            class CP1,            template <class> class KP1,            template <class> class SP1,            template <class> class CNP1        >        bool operator!=(const SmartPtr<T1, OP1, CP1, KP1, SP1, CNP1 >& rhs) const        { return !(*this == rhs); }        // Ambiguity buster        template        <            typename T1,            template <class> class OP1,            class CP1,            template <class> class KP1,            template <class> class SP1,            template <class> class CNP1        >        bool operator<(const SmartPtr<T1, OP1, CP1, KP1, SP1, CNP1 >& rhs) const        { return GetImpl(*this) < GetImpl(rhs); }        // Ambiguity buster        template        <            typename T1,            template <class> class OP1,            class CP1,            template <class> class KP1,            template <class> class SP1,            template <class> class CNP1        >        inline bool operator > ( const SmartPtr< T1, OP1, CP1, KP1, SP1, CNP1 > & rhs )        {            return ( GetImpl( rhs ) < GetImpl( *this ) );        }        // Ambiguity buster        template        <            typename T1,            template <class> class OP1,            class CP1,            template <class> class KP1,            template <class> class SP1,            template <class> class CNP1        >        inline bool operator <= ( const SmartPtr< T1, OP1, CP1, KP1, SP1, CNP1 > & rhs )        {            return !( GetImpl( rhs ) < GetImpl( *this ) );        }        // Ambiguity buster        template        <            typename T1,            template <class> class OP1,            class CP1,            template <class> class KP1,            template <class> class SP1,            template <class> class CNP1        >        inline bool operator >= ( const SmartPtr< T1, OP1, CP1, KP1, SP1, CNP1 > & rhs )        {            return !( GetImpl( *this ) < GetImpl( rhs ) );        }    private:        // Helper for enabling 'if (sp)'        struct Tester        {            Tester(int) {}            void dummy() {}        };        typedef void (Tester::*unspecified_boolean_type_)();        typedef typename Select<CP::allow, Tester, unspecified_boolean_type_>::Result            unspecified_boolean_type;    public:        // enable 'if (sp)'        operator unspecified_boolean_type() const        {            return !*this ? 0 : &Tester::dummy;        }    private:        // Helper for disallowing automatic conversion        struct Insipid        {            Insipid(PointerType) {}        };        typedef typename Select<CP::allow, PointerType, Insipid>::Result            AutomaticConversionResult;    public:        operator AutomaticConversionResult() const        { return GetImpl(*this); }    };////////////////////////////////////////////////////////////////////////////////// friends////////////////////////////////////////////////////////////////////////////////#ifndef LOKI_ENABLE_FRIEND_TEMPLATE_TEMPLATE_PARAMETER_WORKAROUND    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP    >    inline void Release(SmartPtr<T, OP, CP, KP, SP, CNP>& sp,                        typename SP<T>::StoredType& p)    {      p = GetImplRef(sp);      GetImplRef(sp) = SP<T>::Default();    }    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP    >    inline void Reset(SmartPtr<T, OP, CP, KP, SP, CNP>& sp,                      typename SP<T>::StoredType p)    { SmartPtr<T, OP, CP, KP, SP, CNP>(p).Swap(sp); }#endif////////////////////////////////////////////////////////////////////////////////// free comparison operators for class template SmartPtr///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  operator== for lhs = SmartPtr, rhs = raw pointer///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP1,        typename U    >    inline bool operator==(const SmartPtr<T, OP, CP, KP, SP, CNP1 >& lhs,        U* rhs)    { return GetImpl(lhs) == rhs; }///////////////////////////////////////////////////////////////////////////////////  operator== for lhs = raw pointer, rhs = SmartPtr///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP1,        typename U    >    inline bool operator==(U* lhs,        const SmartPtr<T, OP, CP, KP, SP, CNP1 >& rhs)    { return rhs == lhs; }///////////////////////////////////////////////////////////////////////////////////  operator!= for lhs = SmartPtr, rhs = raw pointer///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator!=(const SmartPtr<T, OP, CP, KP, SP, CNP >& lhs,        U* rhs)    { return !(lhs == rhs); }///////////////////////////////////////////////////////////////////////////////////  operator!= for lhs = raw pointer, rhs = SmartPtr///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator!=(U* lhs,        const SmartPtr<T, OP, CP, KP, SP, CNP >& rhs)    { return rhs != lhs; }///////////////////////////////////////////////////////////////////////////////////  operator< for lhs = SmartPtr, rhs = raw pointer///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator<(const SmartPtr<T, OP, CP, KP, SP, CNP >& lhs,        U* rhs)    {        return ( GetImpl( lhs ) < rhs );    }///////////////////////////////////////////////////////////////////////////////////  operator< for lhs = raw pointer, rhs = SmartPtr///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator<(U* lhs,        const SmartPtr<T, OP, CP, KP, SP, CNP >& rhs)    {        return ( GetImpl( rhs ) < lhs );    }//////////////////////////////////////////////////////////////////////////////////  operator> for lhs = SmartPtr, rhs = raw pointer///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator>(const SmartPtr<T, OP, CP, KP, SP, CNP >& lhs,        U* rhs)    { return rhs < lhs; }///////////////////////////////////////////////////////////////////////////////////  operator> for lhs = raw pointer, rhs = SmartPtr///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator>(U* lhs,        const SmartPtr<T, OP, CP, KP, SP, CNP >& rhs)    { return rhs < lhs; }///////////////////////////////////////////////////////////////////////////////////  operator<= for lhs = SmartPtr, rhs = raw pointer///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator<=(const SmartPtr<T, OP, CP, KP, SP, CNP >& lhs,        U* rhs)    { return !(rhs < lhs); }///////////////////////////////////////////////////////////////////////////////////  operator<= for lhs = raw pointer, rhs = SmartPtr///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator<=(U* lhs,        const SmartPtr<T, OP, CP, KP, SP, CNP >& rhs)    { return !(rhs < lhs); }///////////////////////////////////////////////////////////////////////////////////  operator>= for lhs = SmartPtr, rhs = raw pointer///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator>=(const SmartPtr<T, OP, CP, KP, SP, CNP >& lhs,        U* rhs)    { return !(lhs < rhs); }///////////////////////////////////////////////////////////////////////////////////  operator>= for lhs = raw pointer, rhs = SmartPtr///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP,        typename U    >    inline bool operator>=(U* lhs,        const SmartPtr<T, OP, CP, KP, SP, CNP >& rhs)    { return !(lhs < rhs); }} // namespace Loki///////////////////////////////////////////////////////////////////////////////////  specialization of std::less for SmartPtr///  \ingroup SmartPointerGroup////////////////////////////////////////////////////////////////////////////////namespace std{    template    <        typename T,        template <class> class OP,        class CP,        template <class> class KP,        template <class> class SP,        template <class> class CNP    >    struct less< Loki::SmartPtr<T, OP, CP, KP, SP, CNP > >        : public binary_function<Loki::SmartPtr<T, OP, CP, KP, SP, CNP >,            Loki::SmartPtr<T, OP, CP, KP, SP, CNP >, bool>    {        bool operator()(const Loki::SmartPtr<T, OP, CP, KP, SP, CNP >& lhs,            const Loki::SmartPtr<T, OP, CP, KP, SP, CNP >& rhs) const        { return less<T*>()(GetImpl(lhs), GetImpl(rhs)); }    };}#endif // end file guardian

⌨️ 快捷键说明

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