📄 smartptr.h
字号:
} 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -