From 5082251b3e48ee490567d9a36fe99cb9a036dd50 Mon Sep 17 00:00:00 2001 From: "scc%mozilla.org" Date: Fri, 11 Aug 2000 00:42:41 +0000 Subject: [PATCH] bug #48464. explicitly picking my own or the auto-generated function, in particular |operator=|. r={vidur, waterson}, a=vidur --- string/public/nsAReadableString.h | 45 +++++++++++++++++++++++-- string/public/nsAWritableString.h | 13 +++++-- string/public/nsSharedString.h | 33 +++++++++++------- xpcom/ds/nsAReadableString.h | 45 +++++++++++++++++++++++-- xpcom/ds/nsAWritableString.h | 13 +++++-- xpcom/ds/nsSharedString.h | 33 +++++++++++------- xpcom/string/public/nsAReadableString.h | 45 +++++++++++++++++++++++-- xpcom/string/public/nsAWritableString.h | 13 +++++-- xpcom/string/public/nsSharedString.h | 33 +++++++++++------- 9 files changed, 225 insertions(+), 48 deletions(-) diff --git a/string/public/nsAReadableString.h b/string/public/nsAReadableString.h index 0461bc181ebb..7738ab87af25 100644 --- a/string/public/nsAReadableString.h +++ b/string/public/nsAReadableString.h @@ -115,8 +115,8 @@ class nsReadingIterator } public: - // nsReadingIterator( const nsReadingIterator& ); ...use default copy-constructor - // nsReadingIterator& operator=( const nsReadingIterator& ); ...use default copy-assignment operator + // nsReadingIterator( const nsReadingIterator& ); // auto-generated copy-constructor OK + // nsReadingIterator& operator=( const nsReadingIterator& ); // auto-generated copy-assignment operator OK inline void normalize_forward(); inline void normalize_backward(); @@ -259,7 +259,13 @@ class basic_nsAReadableString typedef nsReadingIterator const_iterator; + // basic_nsAReadableString(); // auto-generated default constructor OK (we're abstract anyway) + // basic_nsAReadableString( const basic_nsAReadableString& ); // auto-generated copy-constructor OK (again, only because we're abstract) + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsAReadableString& ); // but assignment is _not_ OK (we're immutable) so make it impossible + public: virtual ~basic_nsAReadableString() { } // ...yes, I expect to be sub-classed. @@ -685,6 +691,15 @@ class basic_nsLiteralString } } + // basic_nsLiteralString( const basic_nsLiteralString& ); // auto-generated copy-constructor OK + // ~basic_nsLiteralString(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsLiteralString& ); // we're immutable + + public: + virtual PRUint32 Length() const; operator const CharT*() const @@ -785,6 +800,15 @@ class basic_nsLiteralChar // nothing else to do here } + // basic_nsLiteralChar( const basic_nsLiteralString& ); // auto-generated copy-constructor OK + // ~basic_nsLiteralChar(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsLiteralChar& ); // we're immutable + + public: + virtual PRUint32 Length() const @@ -889,6 +913,15 @@ class nsPromiseConcatenation mStrings[kRightString] = &aRightString; } + // nsPromiseConcatenation( const nsPromiseConcatenation& ); // auto-generated copy-constructor should be OK + // ~nsPromiseConcatenation(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const nsPromiseConcatenation& ); // we're immutable, you can't assign into a concatenation + + public: + virtual PRUint32 Length() const; virtual PRBool Promises( const basic_nsAReadableString& ) const; // virtual PRBool PromisesExactly( const basic_nsAReadableString& ) const; @@ -1035,6 +1068,14 @@ class nsPromiseSubstring // nothing else to do here } + // nsPromiseSubstring( const nsPromiseSubstring& ); // auto-generated copy-constructor should be OK + // ~nsPromiseSubstring(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const nsPromiseSubstring& ); // we're immutable, you can't assign into a substring + + public: virtual PRUint32 Length() const; virtual PRBool Promises( const basic_nsAReadableString& aString ) const { return mString.Promises(aString); } diff --git a/string/public/nsAWritableString.h b/string/public/nsAWritableString.h index 93f921fd934f..6954103f8879 100644 --- a/string/public/nsAWritableString.h +++ b/string/public/nsAWritableString.h @@ -77,8 +77,8 @@ class nsWritingIterator } public: - // nsWritingIterator( const nsWritingIterator& ); ...use default copy-constructor - // nsWritingIterator& operator=( const nsWritingIterator& ); ...use default copy-assignment operator + // nsWritingIterator( const nsWritingIterator& ); // auto-generated copy-constructor OK + // nsWritingIterator& operator=( const nsWritingIterator& ); // auto-generated copy-assignment operator OK inline void normalize_forward(); inline void normalize_backward(); @@ -224,11 +224,17 @@ class basic_nsAWritableString // friend class nsWritingIterator; public: + typedef CharT char_type; typedef PRUint32 size_type; typedef PRUint32 index_type; typedef nsWritingIterator iterator; + // basic_nsAWritableString(); // auto-generated default constructor OK (we're abstract anyway) + // basic_nsAWritableString( const basic_nsAWritableString& ); // auto-generated copy-constructor OK (again, only because we're abstract) + // ~basic_nsAWritableString(); // auto-generated destructor OK + // see below for copy-assignment operator + virtual CharT* GetWritableFragment( nsWritableFragment&, nsFragmentRequest, PRUint32 = 0 ) = 0; @@ -311,6 +317,9 @@ class basic_nsAWritableString void Assign( const CharT* aPtr, PRUint32 aLength ) { do_AssignFromElementPtrLength(aPtr, aLength); } void Assign( CharT aChar ) { do_AssignFromElement(aChar); } + // copy-assignment operator. I must define my own if I don't want the compiler to make me one + basic_nsAWritableString& operator=( const basic_nsAWritableString& aWritable ) { Assign(aWritable); return *this; } + basic_nsAWritableString& operator=( const basic_nsAReadableString& aReadable ) { Assign(aReadable); return *this; } basic_nsAWritableString& operator=( const nsPromiseReadable& aReadable ) { Assign(aReadable); return *this; } basic_nsAWritableString& operator=( const CharT* aPtr ) { Assign(aPtr); return *this; } diff --git a/string/public/nsSharedString.h b/string/public/nsSharedString.h index 746b077d7e3d..80f2c1333560 100644 --- a/string/public/nsSharedString.h +++ b/string/public/nsSharedString.h @@ -37,11 +37,23 @@ class basic_nsSharedString ... */ { - private: - ~basic_nsSharedString() { } - // You can't sub-class me, or make an instance of me on the stack + public: + basic_nsSharedString( const CharT* data, size_t length ) + : mRefCount(0), mData(data), mLength(length) + { + // nothing else to do here + } - // operator delete + private: + ~basic_nsSharedString() { } // You can't sub-class me, or make an instance of me on the stack + + // NOT TO BE IMPLEMENTED + // we're reference counted, remember. copying and passing by value are wrong + // basic_nsSharedString(); // we define at least one constructor, so the default constructor will not be auto-generated. It's wrong to create me with no data anyway + basic_nsSharedString( const basic_nsSharedString& ); // copy-constructor, the auto generated one would reference somebody elses data + void operator=( const basic_nsSharedString& ); // copy-assignment operator + + // operator delete? public: @@ -54,12 +66,6 @@ class basic_nsSharedString return mLength; } - basic_nsSharedString( const CharT* data, size_t length ) - : mRefCount(0), mData(data), mLength(length) - { - // nothing else to do here - } - nsrefcnt AddRef() const { @@ -72,8 +78,8 @@ class basic_nsSharedString nsrefcnt result = --mRefCount; if ( !mRefCount ) { - delete this; - // BULLSHIT ALERT: need to make |delete| match |new| + // would have to call my destructor by hand here, if there was anything to destruct + operator delete(this); // form of |delete| should always match the |new| } return result; } @@ -111,8 +117,10 @@ template class basic_nsSharedStringPtr { public: + // default constructor basic_nsSharedStringPtr() : mRawPtr(0) { } + // copy-constructor basic_nsSharedStringPtr( const basic_nsSharedStringPtr& rhs ) : mRawPtr(rhs.mRawPtr) { @@ -125,6 +133,7 @@ class basic_nsSharedStringPtr mRawPtr->Release(); } + // copy-assignment operator basic_nsSharedStringPtr& operator=( const basic_nsSharedStringPtr& ); diff --git a/xpcom/ds/nsAReadableString.h b/xpcom/ds/nsAReadableString.h index 0461bc181ebb..7738ab87af25 100644 --- a/xpcom/ds/nsAReadableString.h +++ b/xpcom/ds/nsAReadableString.h @@ -115,8 +115,8 @@ class nsReadingIterator } public: - // nsReadingIterator( const nsReadingIterator& ); ...use default copy-constructor - // nsReadingIterator& operator=( const nsReadingIterator& ); ...use default copy-assignment operator + // nsReadingIterator( const nsReadingIterator& ); // auto-generated copy-constructor OK + // nsReadingIterator& operator=( const nsReadingIterator& ); // auto-generated copy-assignment operator OK inline void normalize_forward(); inline void normalize_backward(); @@ -259,7 +259,13 @@ class basic_nsAReadableString typedef nsReadingIterator const_iterator; + // basic_nsAReadableString(); // auto-generated default constructor OK (we're abstract anyway) + // basic_nsAReadableString( const basic_nsAReadableString& ); // auto-generated copy-constructor OK (again, only because we're abstract) + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsAReadableString& ); // but assignment is _not_ OK (we're immutable) so make it impossible + public: virtual ~basic_nsAReadableString() { } // ...yes, I expect to be sub-classed. @@ -685,6 +691,15 @@ class basic_nsLiteralString } } + // basic_nsLiteralString( const basic_nsLiteralString& ); // auto-generated copy-constructor OK + // ~basic_nsLiteralString(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsLiteralString& ); // we're immutable + + public: + virtual PRUint32 Length() const; operator const CharT*() const @@ -785,6 +800,15 @@ class basic_nsLiteralChar // nothing else to do here } + // basic_nsLiteralChar( const basic_nsLiteralString& ); // auto-generated copy-constructor OK + // ~basic_nsLiteralChar(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsLiteralChar& ); // we're immutable + + public: + virtual PRUint32 Length() const @@ -889,6 +913,15 @@ class nsPromiseConcatenation mStrings[kRightString] = &aRightString; } + // nsPromiseConcatenation( const nsPromiseConcatenation& ); // auto-generated copy-constructor should be OK + // ~nsPromiseConcatenation(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const nsPromiseConcatenation& ); // we're immutable, you can't assign into a concatenation + + public: + virtual PRUint32 Length() const; virtual PRBool Promises( const basic_nsAReadableString& ) const; // virtual PRBool PromisesExactly( const basic_nsAReadableString& ) const; @@ -1035,6 +1068,14 @@ class nsPromiseSubstring // nothing else to do here } + // nsPromiseSubstring( const nsPromiseSubstring& ); // auto-generated copy-constructor should be OK + // ~nsPromiseSubstring(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const nsPromiseSubstring& ); // we're immutable, you can't assign into a substring + + public: virtual PRUint32 Length() const; virtual PRBool Promises( const basic_nsAReadableString& aString ) const { return mString.Promises(aString); } diff --git a/xpcom/ds/nsAWritableString.h b/xpcom/ds/nsAWritableString.h index 93f921fd934f..6954103f8879 100644 --- a/xpcom/ds/nsAWritableString.h +++ b/xpcom/ds/nsAWritableString.h @@ -77,8 +77,8 @@ class nsWritingIterator } public: - // nsWritingIterator( const nsWritingIterator& ); ...use default copy-constructor - // nsWritingIterator& operator=( const nsWritingIterator& ); ...use default copy-assignment operator + // nsWritingIterator( const nsWritingIterator& ); // auto-generated copy-constructor OK + // nsWritingIterator& operator=( const nsWritingIterator& ); // auto-generated copy-assignment operator OK inline void normalize_forward(); inline void normalize_backward(); @@ -224,11 +224,17 @@ class basic_nsAWritableString // friend class nsWritingIterator; public: + typedef CharT char_type; typedef PRUint32 size_type; typedef PRUint32 index_type; typedef nsWritingIterator iterator; + // basic_nsAWritableString(); // auto-generated default constructor OK (we're abstract anyway) + // basic_nsAWritableString( const basic_nsAWritableString& ); // auto-generated copy-constructor OK (again, only because we're abstract) + // ~basic_nsAWritableString(); // auto-generated destructor OK + // see below for copy-assignment operator + virtual CharT* GetWritableFragment( nsWritableFragment&, nsFragmentRequest, PRUint32 = 0 ) = 0; @@ -311,6 +317,9 @@ class basic_nsAWritableString void Assign( const CharT* aPtr, PRUint32 aLength ) { do_AssignFromElementPtrLength(aPtr, aLength); } void Assign( CharT aChar ) { do_AssignFromElement(aChar); } + // copy-assignment operator. I must define my own if I don't want the compiler to make me one + basic_nsAWritableString& operator=( const basic_nsAWritableString& aWritable ) { Assign(aWritable); return *this; } + basic_nsAWritableString& operator=( const basic_nsAReadableString& aReadable ) { Assign(aReadable); return *this; } basic_nsAWritableString& operator=( const nsPromiseReadable& aReadable ) { Assign(aReadable); return *this; } basic_nsAWritableString& operator=( const CharT* aPtr ) { Assign(aPtr); return *this; } diff --git a/xpcom/ds/nsSharedString.h b/xpcom/ds/nsSharedString.h index 746b077d7e3d..80f2c1333560 100644 --- a/xpcom/ds/nsSharedString.h +++ b/xpcom/ds/nsSharedString.h @@ -37,11 +37,23 @@ class basic_nsSharedString ... */ { - private: - ~basic_nsSharedString() { } - // You can't sub-class me, or make an instance of me on the stack + public: + basic_nsSharedString( const CharT* data, size_t length ) + : mRefCount(0), mData(data), mLength(length) + { + // nothing else to do here + } - // operator delete + private: + ~basic_nsSharedString() { } // You can't sub-class me, or make an instance of me on the stack + + // NOT TO BE IMPLEMENTED + // we're reference counted, remember. copying and passing by value are wrong + // basic_nsSharedString(); // we define at least one constructor, so the default constructor will not be auto-generated. It's wrong to create me with no data anyway + basic_nsSharedString( const basic_nsSharedString& ); // copy-constructor, the auto generated one would reference somebody elses data + void operator=( const basic_nsSharedString& ); // copy-assignment operator + + // operator delete? public: @@ -54,12 +66,6 @@ class basic_nsSharedString return mLength; } - basic_nsSharedString( const CharT* data, size_t length ) - : mRefCount(0), mData(data), mLength(length) - { - // nothing else to do here - } - nsrefcnt AddRef() const { @@ -72,8 +78,8 @@ class basic_nsSharedString nsrefcnt result = --mRefCount; if ( !mRefCount ) { - delete this; - // BULLSHIT ALERT: need to make |delete| match |new| + // would have to call my destructor by hand here, if there was anything to destruct + operator delete(this); // form of |delete| should always match the |new| } return result; } @@ -111,8 +117,10 @@ template class basic_nsSharedStringPtr { public: + // default constructor basic_nsSharedStringPtr() : mRawPtr(0) { } + // copy-constructor basic_nsSharedStringPtr( const basic_nsSharedStringPtr& rhs ) : mRawPtr(rhs.mRawPtr) { @@ -125,6 +133,7 @@ class basic_nsSharedStringPtr mRawPtr->Release(); } + // copy-assignment operator basic_nsSharedStringPtr& operator=( const basic_nsSharedStringPtr& ); diff --git a/xpcom/string/public/nsAReadableString.h b/xpcom/string/public/nsAReadableString.h index 0461bc181ebb..7738ab87af25 100644 --- a/xpcom/string/public/nsAReadableString.h +++ b/xpcom/string/public/nsAReadableString.h @@ -115,8 +115,8 @@ class nsReadingIterator } public: - // nsReadingIterator( const nsReadingIterator& ); ...use default copy-constructor - // nsReadingIterator& operator=( const nsReadingIterator& ); ...use default copy-assignment operator + // nsReadingIterator( const nsReadingIterator& ); // auto-generated copy-constructor OK + // nsReadingIterator& operator=( const nsReadingIterator& ); // auto-generated copy-assignment operator OK inline void normalize_forward(); inline void normalize_backward(); @@ -259,7 +259,13 @@ class basic_nsAReadableString typedef nsReadingIterator const_iterator; + // basic_nsAReadableString(); // auto-generated default constructor OK (we're abstract anyway) + // basic_nsAReadableString( const basic_nsAReadableString& ); // auto-generated copy-constructor OK (again, only because we're abstract) + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsAReadableString& ); // but assignment is _not_ OK (we're immutable) so make it impossible + public: virtual ~basic_nsAReadableString() { } // ...yes, I expect to be sub-classed. @@ -685,6 +691,15 @@ class basic_nsLiteralString } } + // basic_nsLiteralString( const basic_nsLiteralString& ); // auto-generated copy-constructor OK + // ~basic_nsLiteralString(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsLiteralString& ); // we're immutable + + public: + virtual PRUint32 Length() const; operator const CharT*() const @@ -785,6 +800,15 @@ class basic_nsLiteralChar // nothing else to do here } + // basic_nsLiteralChar( const basic_nsLiteralString& ); // auto-generated copy-constructor OK + // ~basic_nsLiteralChar(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const basic_nsLiteralChar& ); // we're immutable + + public: + virtual PRUint32 Length() const @@ -889,6 +913,15 @@ class nsPromiseConcatenation mStrings[kRightString] = &aRightString; } + // nsPromiseConcatenation( const nsPromiseConcatenation& ); // auto-generated copy-constructor should be OK + // ~nsPromiseConcatenation(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const nsPromiseConcatenation& ); // we're immutable, you can't assign into a concatenation + + public: + virtual PRUint32 Length() const; virtual PRBool Promises( const basic_nsAReadableString& ) const; // virtual PRBool PromisesExactly( const basic_nsAReadableString& ) const; @@ -1035,6 +1068,14 @@ class nsPromiseSubstring // nothing else to do here } + // nsPromiseSubstring( const nsPromiseSubstring& ); // auto-generated copy-constructor should be OK + // ~nsPromiseSubstring(); // auto-generated destructor OK + + private: + // NOT TO BE IMPLEMENTED + void operator=( const nsPromiseSubstring& ); // we're immutable, you can't assign into a substring + + public: virtual PRUint32 Length() const; virtual PRBool Promises( const basic_nsAReadableString& aString ) const { return mString.Promises(aString); } diff --git a/xpcom/string/public/nsAWritableString.h b/xpcom/string/public/nsAWritableString.h index 93f921fd934f..6954103f8879 100644 --- a/xpcom/string/public/nsAWritableString.h +++ b/xpcom/string/public/nsAWritableString.h @@ -77,8 +77,8 @@ class nsWritingIterator } public: - // nsWritingIterator( const nsWritingIterator& ); ...use default copy-constructor - // nsWritingIterator& operator=( const nsWritingIterator& ); ...use default copy-assignment operator + // nsWritingIterator( const nsWritingIterator& ); // auto-generated copy-constructor OK + // nsWritingIterator& operator=( const nsWritingIterator& ); // auto-generated copy-assignment operator OK inline void normalize_forward(); inline void normalize_backward(); @@ -224,11 +224,17 @@ class basic_nsAWritableString // friend class nsWritingIterator; public: + typedef CharT char_type; typedef PRUint32 size_type; typedef PRUint32 index_type; typedef nsWritingIterator iterator; + // basic_nsAWritableString(); // auto-generated default constructor OK (we're abstract anyway) + // basic_nsAWritableString( const basic_nsAWritableString& ); // auto-generated copy-constructor OK (again, only because we're abstract) + // ~basic_nsAWritableString(); // auto-generated destructor OK + // see below for copy-assignment operator + virtual CharT* GetWritableFragment( nsWritableFragment&, nsFragmentRequest, PRUint32 = 0 ) = 0; @@ -311,6 +317,9 @@ class basic_nsAWritableString void Assign( const CharT* aPtr, PRUint32 aLength ) { do_AssignFromElementPtrLength(aPtr, aLength); } void Assign( CharT aChar ) { do_AssignFromElement(aChar); } + // copy-assignment operator. I must define my own if I don't want the compiler to make me one + basic_nsAWritableString& operator=( const basic_nsAWritableString& aWritable ) { Assign(aWritable); return *this; } + basic_nsAWritableString& operator=( const basic_nsAReadableString& aReadable ) { Assign(aReadable); return *this; } basic_nsAWritableString& operator=( const nsPromiseReadable& aReadable ) { Assign(aReadable); return *this; } basic_nsAWritableString& operator=( const CharT* aPtr ) { Assign(aPtr); return *this; } diff --git a/xpcom/string/public/nsSharedString.h b/xpcom/string/public/nsSharedString.h index 746b077d7e3d..80f2c1333560 100644 --- a/xpcom/string/public/nsSharedString.h +++ b/xpcom/string/public/nsSharedString.h @@ -37,11 +37,23 @@ class basic_nsSharedString ... */ { - private: - ~basic_nsSharedString() { } - // You can't sub-class me, or make an instance of me on the stack + public: + basic_nsSharedString( const CharT* data, size_t length ) + : mRefCount(0), mData(data), mLength(length) + { + // nothing else to do here + } - // operator delete + private: + ~basic_nsSharedString() { } // You can't sub-class me, or make an instance of me on the stack + + // NOT TO BE IMPLEMENTED + // we're reference counted, remember. copying and passing by value are wrong + // basic_nsSharedString(); // we define at least one constructor, so the default constructor will not be auto-generated. It's wrong to create me with no data anyway + basic_nsSharedString( const basic_nsSharedString& ); // copy-constructor, the auto generated one would reference somebody elses data + void operator=( const basic_nsSharedString& ); // copy-assignment operator + + // operator delete? public: @@ -54,12 +66,6 @@ class basic_nsSharedString return mLength; } - basic_nsSharedString( const CharT* data, size_t length ) - : mRefCount(0), mData(data), mLength(length) - { - // nothing else to do here - } - nsrefcnt AddRef() const { @@ -72,8 +78,8 @@ class basic_nsSharedString nsrefcnt result = --mRefCount; if ( !mRefCount ) { - delete this; - // BULLSHIT ALERT: need to make |delete| match |new| + // would have to call my destructor by hand here, if there was anything to destruct + operator delete(this); // form of |delete| should always match the |new| } return result; } @@ -111,8 +117,10 @@ template class basic_nsSharedStringPtr { public: + // default constructor basic_nsSharedStringPtr() : mRawPtr(0) { } + // copy-constructor basic_nsSharedStringPtr( const basic_nsSharedStringPtr& rhs ) : mRawPtr(rhs.mRawPtr) { @@ -125,6 +133,7 @@ class basic_nsSharedStringPtr mRawPtr->Release(); } + // copy-assignment operator basic_nsSharedStringPtr& operator=( const basic_nsSharedStringPtr& );