smartptr.h
来自「C++封装的视频采集代码」· C头文件 代码 · 共 1,203 行 · 第 1/3 页
H
1,203 行
template <class P> class NoCopy { public: NoCopy() {} template <class P1> NoCopy(const NoCopy<P1>&) {} static P Clone(const P&) { CT_ASSERT(false, This_Policy_Disallows_Value_Copying); } static bool Release(const P&) { return true; } static void Swap(NoCopy&) {} enum { destructiveCopy = false }; }; ////////////////////////////////////////////////////////////////////////////////// class template AllowConversion// Implementation of the ConversionPolicy used by SmartPtr// Allows implicit conversion from SmartPtr to the pointee type//////////////////////////////////////////////////////////////////////////////// struct AllowConversion { enum { allow = true }; void Swap(AllowConversion&) {} };////////////////////////////////////////////////////////////////////////////////// class template DisallowConversion// Implementation of the ConversionPolicy used by SmartPtr// Does not allow implicit conversion from SmartPtr to the pointee type// You can initialize a DisallowConversion with an AllowConversion//////////////////////////////////////////////////////////////////////////////// struct DisallowConversion { DisallowConversion() {} DisallowConversion(const AllowConversion&) {} enum { allow = false }; void Swap(DisallowConversion&) {} };////////////////////////////////////////////////////////////////////////////////// class template NoCheck// Implementation of the CheckingPolicy used by SmartPtr// Well, it's clear what it does :o)//////////////////////////////////////////////////////////////////////////////// template <class P> struct NoCheck { NoCheck() {} template <class P1> NoCheck(const NoCheck<P1>&) {} static void OnDefault(const P&) {} static void OnInit(const P&) {} static void OnDereference(const P&) {} static void Swap(NoCheck&) {} };////////////////////////////////////////////////////////////////////////////////// class template AssertCheck// Implementation of the CheckingPolicy used by SmartPtr// Checks the pointer before dereference//////////////////////////////////////////////////////////////////////////////// template <class P> struct AssertCheck { AssertCheck() {} template <class P1> AssertCheck(const AssertCheck<P1>&) {} template <class P1> AssertCheck(const NoCheck<P1>&) {} static void OnDefault(const P&) {} static void OnInit(const P&) {} static void OnDereference(P val) { ASSERT(val); } static void Swap(AssertCheck&) {} };////////////////////////////////////////////////////////////////////////////////// class template AssertCheckStrict// Implementation of the CheckingPolicy used by SmartPtr// Checks the pointer against zero upon initialization and before dereference// You can initialize an AssertCheckStrict with an AssertCheck //////////////////////////////////////////////////////////////////////////////// template <class P> struct AssertCheckStrict { AssertCheckStrict() {} template <class U> AssertCheckStrict(const AssertCheckStrict<U>&) {} template <class U> AssertCheckStrict(const AssertCheck<U>&) {} template <class P1> AssertCheckStrict(const NoCheck<P1>&) {} static void OnDefault(P val) { ASSERT(val); } static void OnInit(P val) { ASSERT(val); } static void OnDereference(P val) { ASSERT(val); } static void Swap(AssertCheckStrict&) {} };////////////////////////////////////////////////////////////////////////////////// class NullPointerException// Used by some implementations of the CheckingPolicy used by SmartPtr////////////////////////////////////////////////////////////////////////////////#ifndef OXSEMI_NO_EXCEPTIONS struct NullPointerException : public std::runtime_error { NullPointerException() : std::runtime_error("") { } const char* what() const throw () //### BCB: throw() added { return "Null Pointer Exception"; } };#endif ////////////////////////////////////////////////////////////////////////////////// class template RejectNullStatic// Implementation of the CheckingPolicy used by SmartPtr// Checks the pointer upon initialization and before dereference//////////////////////////////////////////////////////////////////////////////// template <class P> struct RejectNullStatic { RejectNullStatic() {} template <class P1> RejectNullStatic(const RejectNullStatic<P1>&) {} template <class P1> RejectNullStatic(const NoCheck<P1>&) {} template <class P1> RejectNullStatic(const AssertCheck<P1>&) {} template <class P1> RejectNullStatic(const AssertCheckStrict<P1>&) {} static void OnDefault(const P&) { CompileTimeError<false> ERROR_This_Policy_Does_Not_Allow_Default_Initialization; } static void OnInit(const P& val) { if (!val) THROW (NullPointerException()); } static void OnDereference(const P& val) { if (!val) THROW (NullPointerException()); } static void Swap(RejectNullStatic&) {} };////////////////////////////////////////////////////////////////////////////////// class template RejectNull// Implementation of the CheckingPolicy used by SmartPtr// Checks the pointer before dereference//////////////////////////////////////////////////////////////////////////////// template <class P> struct RejectNull { RejectNull() {} template <class P1> RejectNull(const RejectNull<P1>&) {} static void OnInit(P val) { if (!val) THROW (NullPointerException()); } static void OnDefault(P val) { OnInit(val); } void OnDereference(P val) { OnInit(val); } void Swap(RejectNull&) {} };////////////////////////////////////////////////////////////////////////////////// class template RejectNullStrict// Implementation of the CheckingPolicy used by SmartPtr// Checks the pointer upon initialization and before dereference//////////////////////////////////////////////////////////////////////////////// template <class P> struct RejectNullStrict { RejectNullStrict() {} template <class P1> RejectNullStrict(const RejectNullStrict<P1>&) {} template <class P1> RejectNullStrict(const RejectNull<P1>&) {} static void OnInit(P val) { if (!val) THROW(NullPointerException()); } void OnDereference(P val) { OnInit(val); } void Swap(RejectNullStrict&) {} };////////////////////////////////////////////////////////////////////////////////// class template ByRef// Transports a reference as a value// Serves to implement the Colvin/Gibbons trick for SmartPtr//////////////////////////////////////////////////////////////////////////////// template <class T> class ByRef { public: ByRef(T& v) : value_(v) {} operator T&() { return value_; } operator const T&() const { return value_; } private: T& value_; };////////////////////////////////////////////////////////////////////////////////// class template SmartPtr (declaration)// The reason for all the fuss above//////////////////////////////////////////////////////////////////////////////// template < typename T, template <class> class OwnershipPolicy = RefCounted, class ConversionPolicy = DisallowConversion, template <class> class CheckingPolicy = AssertCheck, template <class> class StoragePolicy = DefaultSPStorage > class SmartPtr;////////////////////////////////////////////////////////////////////////////////// class template SmartPtr (definition)//////////////////////////////////////////////////////////////////////////////// template < typename T, template <class> class OwnershipPolicy, class ConversionPolicy, template <class> class CheckingPolicy, template <class> class StoragePolicy > class SmartPtr : public StoragePolicy<T> , public OwnershipPolicy<typename StoragePolicy<T>::PointerType> , public CheckingPolicy<typename StoragePolicy<T>::StoredType> , public ConversionPolicy { typedef StoragePolicy<T> SP; typedef OwnershipPolicy<typename StoragePolicy<T>::PointerType> OP; typedef CheckingPolicy<typename StoragePolicy<T>::StoredType> KP; typedef ConversionPolicy CP; public: typedef typename SP::PointerType PointerType; typedef typename SP::StoredType StoredType; typedef typename SP::ReferenceType ReferenceType; enum { aux = OP::destructiveCopy }; //### BCB typedef const SmartPtr<T, OwnershipPolicy, ConversionPolicy, CheckingPolicy, StoragePolicy> Ptr_t; typedef const Ptr_t cPtr_t; typedef typename Select<aux, Ptr_t, cPtr_t>::Result CopyArg; SmartPtr() { KP::OnDefault(GetImpl(*this)); } SmartPtr(const StoredType& p) : SP(p) { KP::OnInit(GetImpl(*this)); } SmartPtr(CopyArg& rhs) : SP(rhs), OP(rhs), KP(rhs), CP(rhs) { GetImplRef(*this) = OP::Clone(GetImplRef(rhs)); } template < typename T1, template <class> class OP1, class CP1, template <class> class KP1, template <class> class SP1 > SmartPtr(const SmartPtr<T1, OP1, CP1, KP1, SP1>& rhs) : SP(rhs), OP(rhs), KP(rhs), CP(rhs) { GetImplRef(*this) = OP::Clone(GetImplRef(rhs)); } template < typename T1, template <class> class OP1, class CP1, template <class> class KP1, template <class> class SP1 > SmartPtr(SmartPtr<T1, OP1, CP1, KP1, SP1>& rhs) : SP(rhs), OP(rhs), KP(rhs), CP(rhs) { GetImplRef(*this) = OP::Clone(GetImplRef(rhs)); } //### BCB SmartPtr(ByRef<Ptr_t> rhs) : SP(rhs), OP(rhs), KP(rhs), CP(rhs) {} //### BCB operator ByRef<Ptr_t>() { return ByRef<SmartPtr>(*this); } SmartPtr& operator=(CopyArg& rhs) { SmartPtr temp(rhs); temp.Swap(*this); return *this; } template < typename T1, template <class> class OP1, class CP1, template <class> class KP1, template <class> class SP1 >
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?