📄 nscomptr.h
字号:
operator nsDerivedSafe<nsISupports>*() const /* ...makes an |nsCOMPtr| act like its underlying raw pointer type (except against |AddRef()|, |Release()|, and |delete|) whenever it is used in a context where a raw pointer is expected. It is this operator that makes an |nsCOMPtr| substitutable for a raw pointer. Prefer the implicit use of this operator to calling |get()|, except where necessary to resolve ambiguity. */ { return get(); } nsDerivedSafe<nsISupports>* operator->() const { NS_PRECONDITION(mRawPtr != 0, "You can't dereference a NULL nsCOMPtr with operator->()."); return get(); }#ifdef CANT_RESOLVE_CPP_CONST_AMBIGUITY // broken version for IRIX nsCOMPtr<nsISupports>* get_address() const // This is not intended to be used by clients. See |address_of| // below. { return NS_CONST_CAST(nsCOMPtr<nsISupports>*, this); }#else // CANT_RESOLVE_CPP_CONST_AMBIGUITY nsCOMPtr<nsISupports>* get_address() // This is not intended to be used by clients. See |address_of| // below. { return this; } const nsCOMPtr<nsISupports>* get_address() const // This is not intended to be used by clients. See |address_of| // below. { return this; }#endif // CANT_RESOLVE_CPP_CONST_AMBIGUITY public: nsDerivedSafe<nsISupports>& operator*() const { NS_PRECONDITION(mRawPtr != 0, "You can't dereference a NULL nsCOMPtr with operator*()."); return *get(); }#if 0 private: friend class nsGetterAddRefs<nsISupports>;#endif nsISupports** StartAssignment() {#ifndef NSCAP_FEATURE_INLINE_STARTASSIGNMENT return NS_REINTERPRET_CAST(nsISupports**, begin_assignment());#else assign_assuming_AddRef(0); return NS_REINTERPRET_CAST(nsISupports**, &mRawPtr);#endif } };#ifdef NSCAP_FEATURE_DEBUG_PTR_TYPEStemplate <class T>voidnsCOMPtr<T>::assign_with_AddRef( nsISupports* rawPtr ) { if ( rawPtr ) NSCAP_ADDREF(this, rawPtr); assign_assuming_AddRef(NS_REINTERPRET_CAST(T*, rawPtr)); }template <class T>voidnsCOMPtr<T>::assign_from_helper( const nsCOMPtr_helper& helper, const nsIID& aIID ) { T* newRawPtr; if ( NS_FAILED( helper(aIID, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) ) newRawPtr = 0; assign_assuming_AddRef(newRawPtr); }template <class T>void**nsCOMPtr<T>::begin_assignment() { assign_assuming_AddRef(0); return NS_REINTERPRET_CAST(void**, &mRawPtr); }#endif#ifdef CANT_RESOLVE_CPP_CONST_AMBIGUITY// This is the broken version for IRIX, which can't handle the version below.template <class T>inlinensCOMPtr<T>*address_of( const nsCOMPtr<T>& aPtr ) { return aPtr.get_address(); }#else // CANT_RESOLVE_CPP_CONST_AMBIGUITYtemplate <class T>inlinensCOMPtr<T>*address_of( nsCOMPtr<T>& aPtr ) { return aPtr.get_address(); }template <class T>inlineconst nsCOMPtr<T>*address_of( const nsCOMPtr<T>& aPtr ) { return aPtr.get_address(); }#endif // CANT_RESOLVE_CPP_CONST_AMBIGUITYtemplate <class T>class nsGetterAddRefs /* ... This class is designed to be used for anonymous temporary objects in the argument list of calls that return COM interface pointers, e.g., nsCOMPtr<IFoo> fooP; ...->QueryInterface(iid, getter_AddRefs(fooP)) DO NOT USE THIS TYPE DIRECTLY IN YOUR CODE. Use |getter_AddRefs()| instead. When initialized with a |nsCOMPtr|, as in the example above, it returns a |void**|, a |T**|, or an |nsISupports**| as needed, that the outer call (|QueryInterface| in this case) can fill in. This type should be a nested class inside |nsCOMPtr<T>|. */ { public: explicit nsGetterAddRefs( nsCOMPtr<T>& aSmartPtr ) : mTargetSmartPtr(aSmartPtr) { // nothing else to do }#if defined(NSCAP_FEATURE_TEST_DONTQUERY_CASES) || defined(NSCAP_LOG_EXTERNAL_ASSIGNMENT) ~nsGetterAddRefs() {#ifdef NSCAP_LOG_EXTERNAL_ASSIGNMENT NSCAP_LOG_ASSIGNMENT(NS_REINTERPRET_CAST(void *, address_of(mTargetSmartPtr)), mTargetSmartPtr.get());#endif#ifdef NSCAP_FEATURE_TEST_DONTQUERY_CASES mTargetSmartPtr.Assert_NoQueryNeeded();#endif }#endif operator void**() { return NS_REINTERPRET_CAST(void**, mTargetSmartPtr.StartAssignment()); } operator nsISupports**() { return NS_REINTERPRET_CAST(nsISupports**, mTargetSmartPtr.StartAssignment()); } operator T**() { return mTargetSmartPtr.StartAssignment(); } T*& operator*() { return *(mTargetSmartPtr.StartAssignment()); } private: nsCOMPtr<T>& mTargetSmartPtr; };NS_SPECIALIZE_TEMPLATEclass nsGetterAddRefs<nsISupports> { public: explicit nsGetterAddRefs( nsCOMPtr<nsISupports>& aSmartPtr ) : mTargetSmartPtr(aSmartPtr) { // nothing else to do }#ifdef NSCAP_LOG_EXTERNAL_ASSIGNMENT ~nsGetterAddRefs() { NSCAP_LOG_ASSIGNMENT(NS_REINTERPRET_CAST(void *, address_of(mTargetSmartPtr)), mTargetSmartPtr.get()); }#endif operator void**() { return NS_REINTERPRET_CAST(void**, mTargetSmartPtr.StartAssignment()); } operator nsISupports**() { return mTargetSmartPtr.StartAssignment(); } nsISupports*& operator*() { return *(mTargetSmartPtr.StartAssignment()); } private: nsCOMPtr<nsISupports>& mTargetSmartPtr; };template <class T>inlinensGetterAddRefs<T>getter_AddRefs( nsCOMPtr<T>& aSmartPtr ) /* Used around a |nsCOMPtr| when ...makes the class |nsGetterAddRefs<T>| invisible. */ { return nsGetterAddRefs<T>(aSmartPtr); } // Comparing two |nsCOMPtr|stemplate <class T, class U>inlineNSCAP_BOOLoperator==( const nsCOMPtr<T>& lhs, const nsCOMPtr<U>& rhs ) { return NS_STATIC_CAST(const void*, lhs.get()) == NS_STATIC_CAST(const void*, rhs.get()); }template <class T, class U>inlineNSCAP_BOOLoperator!=( const nsCOMPtr<T>& lhs, const nsCOMPtr<U>& rhs ) { return NS_STATIC_CAST(const void*, lhs.get()) != NS_STATIC_CAST(const void*, rhs.get()); } // Comparing an |nsCOMPtr| to a raw pointertemplate <class T, class U>inlineNSCAP_BOOLoperator==( const nsCOMPtr<T>& lhs, const U* rhs ) { return NS_STATIC_CAST(const void*, lhs.get()) == NS_STATIC_CAST(const void*, rhs); }template <class T, class U>inlineNSCAP_BOOLoperator==( const U* lhs, const nsCOMPtr<T>& rhs ) { return NS_STATIC_CAST(const void*, lhs) == NS_STATIC_CAST(const void*, rhs.get()); }template <class T, class U>inlineNSCAP_BOOLoperator!=( const nsCOMPtr<T>& lhs, const U* rhs ) { return NS_STATIC_CAST(const void*, lhs.get()) != NS_STATIC_CAST(const void*, rhs); }template <class T, class U>inlineNSCAP_BOOLoperator!=( const U* lhs, const nsCOMPtr<T>& rhs ) { return NS_STATIC_CAST(const void*, lhs) != NS_STATIC_CAST(const void*, rhs.get()); } // To avoid ambiguities caused by the presence of builtin |operator==|s // creating a situation where one of the |operator==| defined above // has a better conversion for one argument and the builtin has a // better conversion for the other argument, define additional // |operator==| without the |const| on the raw pointer. // See bug 65664 for details.// This is defined by an autoconf test, but VC++ also has a bug that// prevents us from using these. (It also, fortunately, has the bug// that we don't need them either.)#ifdef _MSC_VER#define NSCAP_DONT_PROVIDE_NONCONST_OPEQ#endif#ifndef NSCAP_DONT_PROVIDE_NONCONST_OPEQtemplate <class T, class U>inlineNSCAP_BOOLoperator==( const nsCOMPtr<T>& lhs, U* rhs ) { return NS_STATIC_CAST(const void*, lhs.get()) == NS_STATIC_CAST(void*, rhs); }template <class T, class U>inlineNSCAP_BOOLoperator==( U* lhs, const nsCOMPtr<T>& rhs ) { return NS_STATIC_CAST(void*, lhs) == NS_STATIC_CAST(const void*, rhs.get()); }template <class T, class U>inlineNSCAP_BOOLoperator!=( const nsCOMPtr<T>& lhs, U* rhs ) { return NS_STATIC_CAST(const void*, lhs.get()) != NS_STATIC_CAST(void*, rhs); }template <class T, class U>inlineNSCAP_BOOLoperator!=( U* lhs, const nsCOMPtr<T>& rhs ) { return NS_STATIC_CAST(void*, lhs) != NS_STATIC_CAST(const void*, rhs.get()); }#endif // Comparing an |nsCOMPtr| to |0|class NSCAP_Zero;template <class T>inlineNSCAP_BOOLoperator==( const nsCOMPtr<T>& lhs, NSCAP_Zero* rhs ) // specifically to allow |smartPtr == 0| { return NS_STATIC_CAST(const void*, lhs.get()) == NS_REINTERPRET_CAST(const void*, rhs); }template <class T>inlineNSCAP_BOOLoperator==( NSCAP_Zero* lhs, const nsCOMPtr<T>& rhs ) // specifically to allow |0 == smartPtr| { return NS_REINTERPRET_CAST(const void*, lhs) == NS_STATIC_CAST(const void*, rhs.get()); }template <class T>inlineNSCAP_BOOLoperator!=( const nsCOMPtr<T>& lhs, NSCAP_Zero* rhs ) // specifically to allow |smartPtr != 0| { return NS_STATIC_CAST(const void*, lhs.get()) != NS_REINTERPRET_CAST(const void*, rhs); }template <class T>inlineNSCAP_BOOLoperator!=( NSCAP_Zero* lhs, const nsCOMPtr<T>& rhs ) // specifically to allow |0 != smartPtr| { return NS_REINTERPRET_CAST(const void*, lhs) != NS_STATIC_CAST(const void*, rhs.get()); }#ifdef HAVE_CPP_TROUBLE_COMPARING_TO_ZERO // We need to explicitly define comparison operators for `int' // because the compiler is lame.template <class T>inlineNSCAP_BOOLoperator==( const nsCOMPtr<T>& lhs, int rhs ) // specifically to allow |smartPtr == 0| { return NS_STATIC_CAST(const void*, lhs.get()) == NS_REINTERPRET_CAST(const void*, rhs); }template <class T>inlineNSCAP_BOOLoperator==( int lhs, const nsCOMPtr<T>& rhs ) // specifically to allow |0 == smartPtr| { return NS_REINTERPRET_CAST(const void*, lhs) == NS_STATIC_CAST(const void*, rhs.get()); }#endif // !defined(HAVE_CPP_TROUBLE_COMPARING_TO_ZERO) // Comparing any two [XP]COM objects for identityinlineNSCAP_BOOLSameCOMIdentity( nsISupports* lhs, nsISupports* rhs ) { return nsCOMPtr<nsISupports>( do_QueryInterface(lhs) ) == nsCOMPtr<nsISupports>( do_QueryInterface(rhs) ); }template <class SourceType, class DestinationType>inlinensresultCallQueryInterface( nsCOMPtr<SourceType>& aSourcePtr, DestinationType** aDestPtr ) { return CallQueryInterface(aSourcePtr.get(), aDestPtr); }#endif // !defined(nsCOMPtr_h___)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -