update nsStringX classes; not part of build

This commit is contained in:
rickg%netscape.com 2000-04-05 06:11:03 +00:00
parent d9f7558a70
commit 30e0f8aa94
6 changed files with 290 additions and 446 deletions

View File

@ -15,6 +15,13 @@
* 03.10.2000: Fixed off-by-1 error in StripChar() (rickg)
* 03.20.2000: Ran regressions by comparing operations against original nsString (rickg)
*
* To Do:
*
* 1. Use shared buffer for empty strings
* 2. Test refcounting
* 3. Implement copy semantics between autostring and nsCSubsumeString to ensure
* that actual character copying occurs if necessary.
*
*************************************************************************************/
#ifndef NS_BUFFERMANAGER_
@ -198,14 +205,15 @@ inline nsresult SVRealloc(nsStringValueImpl<CharType>&aDest,PRUint32 aCount){
nsresult result=SVAlloc(temp,aCount);
if(NS_SUCCEEDED(result)) {
if(0<aDest.mLength) {
memcpy(temp.mBuffer,aDest.mBuffer,aDest.mLength*sizeof(CharType));
temp.mLength=aDest.mLength;
temp.mBuffer[temp.mLength]=0;
if(aDest.mBuffer) {
if(0<aDest.mLength) {
memcpy(temp.mBuffer,aDest.mBuffer,aDest.mLength*sizeof(CharType));
temp.mLength=aDest.mLength;
}
SVFree(aDest);
}
SVFree(aDest);
aDest=temp;
aDest.mBuffer[aDest.mLength]=0;
}
return result;
}

View File

@ -1,5 +1,4 @@
#include "nsString2.h"
#include "nsString.h"
#include "nsBufferManager.h"
#include <stdio.h>
@ -13,32 +12,49 @@ static const char* kWhitespace="\b\t\r\n ";
// Ctor's
//******************************************
void Subsume(nsStringValueImpl<PRUnichar> &aDest,nsStringValueImpl<PRUnichar> &aSource){
if(aSource.mBuffer && aSource.mLength) {
#if 0
if(aSource.mOwnsBuffer){
nsStr::Destroy(aDest);
aDest.mStr=aSource.mStr;
aDest.mLength=aSource.mLength;
aDest.mCapacity=aSource.mCapacity;
aDest.mOwnsBuffer=aSource.mOwnsBuffer;
aSource.mOwnsBuffer=PR_FALSE;
aSource.mStr=0;
}
else{
nsStr::StrAssign(aDest,aSource,0,aSource.mLength);
}
#endif
}
else SVTruncate(aDest,0);
}
nsString::nsString() : mStringValue() {
}
//call this version for nsString,nsString and the autostrings
nsString::nsString(const nsString& aString,PRInt32 aLength) : mStringValue() {
Assign(aString,aLength,0);
SVAppend(mStringValue,aString.mStringValue,aLength,0);
}
//call this version with nsCString
nsString::nsString(const nsCString &aString,PRInt32 aLength) : mStringValue() {
Assign(aString,aLength);
SVAppend(mStringValue,aString.mStringValue,aLength,0);
}
//call this version for a single char of type char...
nsString::nsString(const nsSubsumeStr &aSubsumeString) : mStringValue(aSubsumeString.mLHS) {
SVAppend(mStringValue,aSubsumeString.mRHS,aSubsumeString.mRHS.mLength,0);
}
//call this version for a single char of type char...
nsString::nsString(nsSubsumeStr &aSubsumeString) : mStringValue(aSubsumeString.mLHS) {
SVAppend(mStringValue,aSubsumeString.mRHS,aSubsumeString.mRHS.mLength,0);
nsString::nsString(nsSubsumeStr &aSubsumeString) : mStringValue() {
mStringValue=aSubsumeString.mStringValue;
memset(&aSubsumeString.mStringValue,0,sizeof(mStringValue));
}
//call this version for char*'s....
nsString::nsString(const PRUnichar* aString,PRInt32 aLength) : mStringValue() {
Assign(aString,aLength,0);
Append(aString,aLength,0);
}
//call this version for a single char of type char...
@ -49,8 +65,8 @@ nsString::nsString(const char aChar) : mStringValue() {
//call this version for PRUnichar*'s....
nsString::nsString(const char* aString,PRInt32 aLength) : mStringValue() {
nsStringValueImpl<char> theString(CONST_CAST(char*,aString),aLength);
SVAssign(mStringValue,theString,theString.mLength,0);
nsStringValueImpl<char> theString(NS_CONST_CAST(char*,aString),aLength);
SVAppend(mStringValue,theString,theString.mLength,0);
}
//call this version for all other ABT versions of readable strings
@ -58,12 +74,10 @@ nsString::nsString(const nsAReadableString &aString) : mStringValue() {
Assign(aString);
}
//call this version for stack-based string buffers...
nsString::nsString(const nsUStackBuffer &aBuffer) : mStringValue(aBuffer) {
nsString::~nsString() {
SVFree(mStringValue);
}
nsString::~nsString() { }
void nsString::Reinitialize(PRUnichar* aBuffer,PRUint32 aCapacity,PRInt32 aLength) {
mStringValue.mBuffer=aBuffer;
mStringValue.mCapacity=aCapacity;
@ -88,21 +102,22 @@ nsString& nsString::operator=(const nsCString &aString) {
}
nsString& nsString::operator=(const nsSubsumeStr &aSubsumeString) {
//XXX NOT IMPLEMENTED
mStringValue=aSubsumeString.mStringValue;
memset((void*)&aSubsumeString.mStringValue,0,sizeof(mStringValue));
return *this;
}
nsString& nsString::operator=(const PRUnichar *aString) {
if(mStringValue.mBuffer!=aString) {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString));
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString));
Assign(aString);
}
return *this;
}
nsString& nsString::operator=(const char *aString) {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
SVAssign(mStringValue,theStringValue,theStringValue.mLength,0);
return *this;
}
@ -234,7 +249,7 @@ nsresult nsString::Append(const char* aString,PRInt32 aLength,PRUint32 aSrcOffse
nsresult result=NS_OK;
if(aString) {
if(aLength<0) aLength=stringlen(aString);
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aLength);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aLength);
result=SVAppend(mStringValue,theStringValue,aLength,aSrcOffset);
}
return result;
@ -276,7 +291,7 @@ nsresult nsString::Append(const PRUnichar aChar) {
nsresult nsString::Append(const PRUnichar* aString,PRInt32 aLength,PRUint32 aSrcOffset) {
nsresult result=NS_OK;
if(aString) {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString),aLength);
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString),aLength);
result=SVAppend (mStringValue,theStringValue,aLength,aSrcOffset);
}
return result;
@ -416,7 +431,7 @@ nsresult nsString::Insert(const char* aString,PRUint32 anOffset,PRInt32 aLength)
nsresult result=NS_OK;
if(aString){
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aLength);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aLength);
if(0<theStringValue.mLength){
result=SVInsert(mStringValue,anOffset,theStringValue,theStringValue.mLength,0);
@ -440,7 +455,7 @@ nsresult nsString::Insert(const PRUnichar* aString,PRUint32 anOffset,PRInt32 aLe
nsresult result=NS_OK;
if(aString){
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString),aLength);
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString),aLength);
if(0<theStringValue.mLength){
result=SVInsert(mStringValue,anOffset,theStringValue,theStringValue.mLength,0);
@ -500,8 +515,8 @@ nsresult nsString::ReplaceSubstring( const nsString& aTarget,const nsString& aNe
nsresult nsString::ReplaceSubstring(const char* aTarget,const char* aNewValue) {
nsresult result=NS_OK;
const nsStringValueImpl<char> theTarget(CONST_CAST(char*,aTarget));
const nsStringValueImpl<char> theNewValue(CONST_CAST(char*,aNewValue));
const nsStringValueImpl<char> theTarget(NS_CONST_CAST(char*,aTarget));
const nsStringValueImpl<char> theNewValue(NS_CONST_CAST(char*,aNewValue));
return SVReplace(mStringValue,theTarget,theNewValue,mStringValue.mLength,0);
}
@ -545,7 +560,7 @@ nsresult nsString::StripChar(PRInt32 anInt,PRUint32 anOffset){
* @return *this
*/
nsresult nsString::StripChars(const char* aSet,PRInt32 aLength){
nsStringValueImpl<char> theSet(CONST_CAST(char*,aSet),aLength);
nsStringValueImpl<char> theSet(NS_CONST_CAST(char*,aSet),aLength);
return SVStripCharsInSet(mStringValue,aSet,mStringValue.mLength,0);
}
@ -585,23 +600,29 @@ nsresult nsString::Right(nsString& aCopy,PRInt32 aCount) const {
//******************************************
nsSubsumeStr nsString::operator+(const nsString &aString) {
nsSubsumeStr result(mStringValue,aString.mStringValue);
return result;
nsString theString(*this);
SVAppend(theString.mStringValue,aString.mStringValue);
return nsSubsumeStr(theString);
}
nsSubsumeStr nsString::operator+(const PRUnichar* aString) {
nsSubsumeStr result; //NOT IMPLEMENTED
return result;
nsString theTempString(*this);
nsStringValueImpl<PRUnichar> theTempStrValue(NS_CONST_CAST(PRUnichar*,aString));
SVAppend(theTempString.mStringValue,theTempStrValue);
return nsSubsumeStr(theTempString);
}
nsSubsumeStr nsString::operator+(const char* aCString) {
nsSubsumeStr result; //NOT IMPLEMENTED
return result;
nsSubsumeStr nsString::operator+(const char* aString) {
nsString theTempString(*this);
nsStringValueImpl<char> theTempStrValue(NS_CONST_CAST(char*,aString));
SVAppend(theTempString.mStringValue,theTempStrValue);
return nsSubsumeStr(theTempString);
}
nsSubsumeStr nsString::operator+(PRUnichar aChar) {
nsSubsumeStr result; //NOT IMPLEMENTED
return result;
nsString theTempString(*this);
theTempString.Append(aChar);
return nsSubsumeStr(theTempString);
}
//*******************************************
// Here come the operator+=() methods...
@ -667,12 +688,12 @@ PRInt32 nsString::Compare(const nsCString &aString,PRBool aIgnoreCase,PRInt32 a
}
PRInt32 nsString::Compare(const char* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aCount);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aCount);
return SVCompare(mStringValue,theStringValue,aIgnoreCase,aCount);
}
PRInt32 nsString::Compare(const PRUnichar* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString),aCount);
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString),aCount);
return SVCompareChars(mStringValue,theStringValue,aIgnoreCase,aCount);
}
@ -685,13 +706,13 @@ PRBool nsString::Equals(const nsCString &aString,PRBool aIgnoreCase,PRInt32 aCo
}
PRBool nsString::Equals(const char* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aCount);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aCount);
return PRBool(0==SVCompare(mStringValue,theStringValue,aIgnoreCase,aCount));
}
PRBool nsString::Equals(const PRUnichar* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString),aCount);
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString),aCount);
return PRBool(0==SVCompareChars(mStringValue,theStringValue,aIgnoreCase,aCount));
}
@ -776,7 +797,7 @@ PRInt32 nsString::Find(const nsCString &aString,PRBool aIgnoreCase,PRUint32 anOf
* @return offset in string, or -1 (kNotFound)
*/
PRInt32 nsString::Find(const char* aString,PRBool aIgnoreCase,PRUint32 anOffset,PRInt32 aRepCount) const {
nsStringValueImpl<char> theString(CONST_CAST(char*,aString));
nsStringValueImpl<char> theString(NS_CONST_CAST(char*,aString));
return SVFind(mStringValue,theString,aIgnoreCase,aRepCount,anOffset);
}
@ -792,7 +813,7 @@ PRInt32 nsString::Find(const char* aString,PRBool aIgnoreCase,PRUint32 anOffset,
*/
PRInt32 nsString::Find(const PRUnichar* aString,PRBool aIgnoreCase,PRUint32 anOffset,PRInt32 aRepCount) const {
nsStringValueImpl<PRUnichar> theString(CONST_CAST(PRUnichar*,aString));
nsStringValueImpl<PRUnichar> theString(NS_CONST_CAST(PRUnichar*,aString));
return SVFind(mStringValue,theString,aIgnoreCase,aRepCount,anOffset);
}
@ -821,7 +842,7 @@ PRInt32 nsString::FindCharInSet(const nsString& aString,PRUint32 anOffset) const
*/
PRInt32 nsString::FindCharInSet(const char *aString,PRUint32 anOffset) const{
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
return SVFindCharInSet(mStringValue,theStringValue,PR_FALSE,mStringValue.mLength,anOffset);
}
@ -836,7 +857,7 @@ PRInt32 nsString::FindCharInSet(const char *aString,PRUint32 anOffset) const{
*/
PRInt32 nsString::FindCharInSet(const PRUnichar *aString,PRUint32 anOffset) const{
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString));
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString));
return SVFindCharInSet(mStringValue,theStringValue,PR_FALSE,mStringValue.mLength,anOffset);
}
@ -889,13 +910,13 @@ PRInt32 nsString::RFind(const nsString& aString,PRBool aIgnoreCase,PRInt32 anOff
}
PRInt32 nsString::RFind(const char* aString,PRBool aIgnoreCase,PRInt32 anOffset,PRInt32 aRepCount) const{
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
return SVRFind(mStringValue,theStringValue,aIgnoreCase,aRepCount,anOffset);
}
PRInt32 nsString::RFind(const PRUnichar* aString,PRBool aIgnoreCase,PRInt32 anOffset,PRInt32 aRepCount) const{
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString));
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString));
return SVRFind(mStringValue,theStringValue,aIgnoreCase,aRepCount,anOffset);
}
/**
@ -921,7 +942,7 @@ PRInt32 nsString::RFindCharInSet(const nsString& aString,PRInt32 anOffset) const
* @return
*/
PRInt32 nsString::RFindCharInSet(const PRUnichar* aString,PRInt32 anOffset) const{
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString));
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString));
return SVRFindCharInSet(mStringValue,theStringValue,PR_FALSE,mStringValue.mLength,anOffset);
}
@ -935,7 +956,7 @@ PRInt32 nsString::RFindCharInSet(const PRUnichar* aString,PRInt32 anOffset) cons
* @return
*/
PRInt32 nsString::RFindCharInSet(const char* aString,PRInt32 anOffset) const{
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
return SVRFindCharInSet(mStringValue,theStringValue,PR_FALSE,mStringValue.mLength,anOffset);
}
@ -973,9 +994,7 @@ PRUnichar* nsString::ToNewUnicode() const {
char* nsString::ToCString(char* aBuf,PRUint32 aBufLength,PRUint32 anOffset) const {
int len=(mStringValue.mLength<aBufLength) ? mStringValue.mLength : aBufLength;
for(int i=0;i<len;i++){
aBuf[i]=(char)mStringValue.mBuffer[i];
}
SVCopyBuffer_(aBuf,mStringValue.mBuffer,len);
aBuf[len]=0;
return aBuf;
}
@ -1031,54 +1050,17 @@ nsresult nsString::Append(const nsStringValueImpl<char> &aString,PRInt32 aLength
}
/*****************************************************************
Now we declare the nsCSubsumeString class
Now we define the nsSubsumeStr class
*****************************************************************/
nsSubsumeStr::nsSubsumeStr() {
nsSubsumeStr::nsSubsumeStr(nsString& aString) : nsString() {
Subsume(mStringValue,aString.mStringValue);
}
nsSubsumeStr::nsSubsumeStr(const nsString& aString) : mLHS(aString.mStringValue), mRHS() {
}
nsSubsumeStr::nsSubsumeStr(const nsSubsumeStr& aSubsumeString) :
mLHS(aSubsumeString.mLHS),
mRHS(aSubsumeString.mRHS) {
}
nsSubsumeStr::nsSubsumeStr(const nsStringValueImpl<PRUnichar> &aLHS,const nsSubsumeStr& aSubsumeString) :
mLHS(aLHS),
mRHS(aSubsumeString.mLHS) {
}
nsSubsumeStr::nsSubsumeStr(const nsStringValueImpl<PRUnichar> &aLHS,const nsStringValueImpl<PRUnichar> &aRHS) :
mLHS(aLHS),
mRHS(aRHS) {
}
nsSubsumeStr::nsSubsumeStr(PRUnichar* aString,PRBool assumeOwnership,PRInt32 aLength) {
}
nsSubsumeStr nsSubsumeStr::operator+(const nsSubsumeStr &aSubsumeString) {
nsSubsumeStr result(*this);
return result;
}
nsSubsumeStr nsSubsumeStr::operator+(const nsString &aString) {
SVAppend(mLHS,mRHS,mRHS.mLength,0);
memcpy(&mRHS,&aString.mStringValue,sizeof(mRHS));
return *this;
}
int nsSubsumeStr::Subsume(PRUnichar* aString,PRBool assumeOwnership,PRInt32 aLength) {
//XXX NOT IMPLEMENTED
int result=0;
return result;
nsSubsumeStr::nsSubsumeStr(PRUnichar * aString,PRBool assumeOwnership,PRInt32 aLength) : nsString() {
// mStringValue.mBuffer=aString;
// mStringValue.mCapacity=mStringValue.mLength=(-1==aLength) ? strlen(aString) : aLength;
// mOwnsBuffer=assumeOwnership;
}
/**
@ -1136,7 +1118,7 @@ nsAutoString::nsAutoString() : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
mStringValue.mRefCount=2;
}
//call this version nsAutoString derivatives...
@ -1144,59 +1126,55 @@ nsAutoString::nsAutoString(const nsAutoString& aString,PRInt32 aLength) : nsStri
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
Assign(aString,aLength);
mStringValue.mRefCount=2;
nsString::Assign(aString,aLength,0);
}
//call this version for nsString and the autostrings
nsAutoString::nsAutoString(const nsString& aString,PRInt32 aLength) : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
Assign(aString,aLength);
mStringValue.mRefCount=2;
nsString::Assign(aString,aLength,0);
}
//call this version with nsCString
nsAutoString::nsAutoString(const nsCString& aString) : nsString(aString) {
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
nsAutoString::nsAutoString(const nsCString& aString) : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount=2;
nsString::Assign(aString);
}
//call this version for char*'s....
nsAutoString::nsAutoString(const char* aString,PRInt32 aLength) : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
nsStringValueImpl<char> theString(CONST_CAST(char*,aString),aLength);
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
SVAssign(mStringValue,theString,aLength,0);
mStringValue.mRefCount=2;; //so we don't try to delete our internal buffer
nsString::Assign(aString,aLength,0);
}
//call this version for a single char of type char...
nsAutoString::nsAutoString(char aChar) : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
PRUnichar theBuffer[]={aChar,0};
Assign(theBuffer,1,0);
mStringValue.mRefCount=2; //so we don't try to delete our internal buffer
nsString::Assign(aChar);
}
//call this version for a single char of type char...
nsAutoString::nsAutoString(PRUnichar aChar) : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
PRUnichar theBuffer[]={aChar,0};
Assign(theBuffer,1,0);
mStringValue.mRefCount=2; //so we don't try to delete our internal buffer
nsString::Assign(aChar);
}
@ -1205,9 +1183,8 @@ nsAutoString::nsAutoString(const PRUnichar* aString,PRInt32 aLength) : nsString(
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
nsStringValueImpl<PRUnichar> theString(CONST_CAST(PRUnichar*,aString),aLength);
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
SVAssign(mStringValue,theString,theString.mLength,0);
mStringValue.mRefCount=2; //so we don't try to delete our internal buffer
nsString::Assign(aString,aLength,0);
}
@ -1216,28 +1193,19 @@ nsAutoString::nsAutoString(const nsAReadableString &aString) : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
Assign(aString);
mStringValue.mRefCount=2; //so we don't try to delete our internal buffer
nsString::Assign(aString);
}
nsAutoString::nsAutoString(const nsUStackBuffer &aBuffer) : nsString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mLength=aBuffer.mLength;
mStringValue.mCapacity=aBuffer.mCapacity;
nsAutoString::nsAutoString(const UBufDescriptor &aBuffer) : nsString() {
mStringValue.mBuffer=aBuffer.mBuffer;
mStringValue.mRefCount++; //so we don't try to delete our internal buffer
}
nsAutoString::nsAutoString(const CBufDescriptor& aBuffer) : nsString() {
mStringValue.mBuffer=(PRUnichar*)aBuffer.mBuffer;
mStringValue.mCapacity=aBuffer.mCapacity;
mStringValue.mLength=aBuffer.mLength;
mStringValue.mRefCount=(aBuffer.mStackBased) ? 2 : 1;
mStringValue.mRefCount=(aBuffer.mOwnsBuffer) ? 1 : 2;
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
}
nsAutoString::nsAutoString(const nsSubsumeStr& aSubsumeStringX) : nsString() {
}
@ -1245,39 +1213,33 @@ nsAutoString::nsAutoString(const nsSubsumeStr& aSubsumeStringX) : nsString() {
nsAutoString::~nsAutoString() { }
nsAutoString& nsAutoString::operator=(const nsAutoString& aCopy) {
if(aCopy.mStringValue.mBuffer!=mStringValue.mBuffer) {
Assign(aCopy);
}
nsAutoString& nsAutoString::operator=(const nsAutoString& aString) {
nsString::operator=(aString);
return *this;
}
nsAutoString& nsAutoString::operator=(const nsString& aString) {
Assign(aString);
nsString::operator=(aString);
return *this;
}
nsAutoString& nsAutoString::operator=(const nsCString& aString) {
Assign(aString);
nsString::operator=(aString);
return *this;
}
nsAutoString& nsAutoString::operator=(const PRUnichar* aString) {
if(mStringValue.mBuffer!=aString) {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString));
Assign(aString);
}
nsString::operator=(aString);
return *this;
}
nsAutoString& nsAutoString::operator=(const char* aString) {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
SVAssign(mStringValue,theStringValue,theStringValue.mLength,0);
nsString::operator=(aString);
return *this;
}
nsAutoString& nsAutoString::operator=(const PRUnichar aChar) {
Assign(aChar);
nsString::operator=(aChar);
return *this;
}

View File

@ -22,13 +22,30 @@
#include "nsStringValue.h"
typedef nsStackBuffer<PRUnichar> nsUStackBuffer;
class NS_COM nsCString;
class NS_COM nsSubsumeStr;
/***************************************************************************
*
* This is the templatized base class from which stringvalues are derived. (rickg)
*
***************************************************************************/
struct UBufDescriptor {
UBufDescriptor(PRUnichar *aBuffer,PRUint32 aLength,PRUint32 aCapacity,PRBool aOwnsBuffer) {
mBuffer=aBuffer;
mLength=aLength;
mCapacity=aCapacity-1;
mOwnsBuffer=aOwnsBuffer;
}
PRUnichar* mBuffer;
PRUint32 mLength;
PRUint32 mCapacity;
PRBool mOwnsBuffer;
};
class NS_COM nsString {
public:
@ -65,8 +82,6 @@ public:
//call this version for all other ABT versions of readable strings
nsString(const nsAReadableString &aString) ;
//call this version for stack-based string buffers...
nsString(const nsUStackBuffer &aBuffer);
virtual ~nsString();
@ -489,39 +504,15 @@ protected:
/*****************************************************************
Now we declare the nsSubsumeStr class
*****************************************************************/
class NS_COM nsSubsumeStr {
class NS_COM nsSubsumeStr : public nsString {
public:
nsSubsumeStr();
nsSubsumeStr(const nsString& aString);
nsSubsumeStr(const nsSubsumeStr& aSubsumeString);
nsSubsumeStr(const nsStringValueImpl<PRUnichar> &aLHS,const nsSubsumeStr& aSubsumeString);
nsSubsumeStr(const nsStringValueImpl<PRUnichar> &aLHS,const nsStringValueImpl<PRUnichar> &aSubsumeString);
nsSubsumeStr(nsString& aString);
nsSubsumeStr(PRUnichar* aString,PRBool assumeOwnership,PRInt32 aLength=-1);
nsSubsumeStr operator+(const nsSubsumeStr &aSubsumeString);
nsSubsumeStr operator+(const nsString &aString);
operator const PRUnichar*() {return 0;}
int Subsume(PRUnichar* aString,PRBool assumeOwnership,PRInt32 aLength=-1);
nsStringValueImpl<PRUnichar> mLHS;
nsStringValueImpl<PRUnichar> mRHS;
PRBool mOwnsBuffer;
};
/*****************************************************************
Now we declare the nsAutoString class
*****************************************************************/
@ -554,9 +545,7 @@ public:
//call this version for all other ABT versions of readable strings
nsAutoString(const nsAReadableString &aString);
nsAutoString(const nsUStackBuffer &aBuffer) ;
nsAutoString(const CBufDescriptor& aBuffer) ;
nsAutoString(const UBufDescriptor &aBuffer) ;
nsAutoString(const nsSubsumeStr& aSubsumeStringX) ;

View File

@ -25,7 +25,6 @@
#include "nscore.h"
#include "nsIAllocator.h"
#include <string.h>
#include "nsCRT.h"
#if 0
typedef int PRInt32;
@ -97,74 +96,6 @@ inline size_t stringlen(const char* theString) {
return ::strlen(theString);
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
class NS_COM CBufDescriptor {
public:
CBufDescriptor(char* aString, PRBool aStackBased,PRUint32 aCapacity,PRInt32 aLength=-1) {
mBuffer=aString;
mCharSize=1;
mStackBased=aStackBased;
mIsConst=PR_FALSE;
mLength=mCapacity=0;
if(aString && aCapacity>1) {
mCapacity=aCapacity-1;
mLength=(-1==aLength) ? strlen(aString) : aLength;
if(mLength>PRInt32(mCapacity))
mLength=mCapacity;
}
}
CBufDescriptor(const char* aString,PRBool aStackBased,PRUint32 aCapacity,PRInt32 aLength=-1) {
mBuffer=(char*)aString;
mCharSize=1;
mStackBased=aStackBased;
mIsConst=PR_TRUE;
mLength=mCapacity=0;
if(aString && aCapacity>1) {
mCapacity=aCapacity-1;
mLength=(-1==aLength) ? stringlen(aString) : aLength;
if(mLength>PRInt32(mCapacity))
mLength=mCapacity;
}
}
CBufDescriptor(PRUnichar* aString, PRBool aStackBased,PRUint32 aCapacity,PRInt32 aLength=-1) {
mBuffer=(char*)aString;
mCharSize=2;
mStackBased=aStackBased;
mLength=mCapacity=0;
mIsConst=PR_FALSE;
if(aString && aCapacity>1) {
mCapacity=aCapacity-1;
mLength=(-1==aLength) ? stringlen(aString) : aLength;
if(mLength>PRInt32(mCapacity))
mLength=mCapacity;
}
}
CBufDescriptor(const PRUnichar* aString,PRBool aStackBased,PRUint32 aCapacity,PRInt32 aLength=-1) {
mBuffer=(char*)aString;
mCharSize=2;
mStackBased=aStackBased;
mLength=mCapacity=0;
mIsConst=PR_TRUE;
if(aString && aCapacity>1) {
mCapacity=aCapacity-1;
mLength=(-1==aLength) ? stringlen(aString) : aLength;
if(mLength>PRInt32(mCapacity))
mLength=mCapacity;
}
}
char* mBuffer;
PRUint32 mCapacity;
PRInt32 mLength;
PRBool mStackBased;
PRBool mIsConst;
char mCharSize;
};
//----------------------------------------------------------------------------------------
@ -218,9 +149,9 @@ template <class CharType>
struct nsStringValueImpl {
nsStringValueImpl() {
mBuffer=0;
mBuffer=(CharType*)gCommonEmptyBuffer;
mLength=mCapacity=0;
mRefCount=1;
mRefCount=2; //so we don't ever try to free the shared buffer
}
nsStringValueImpl(const nsStringValueImpl<CharType>& aCopy) {
@ -244,7 +175,7 @@ struct nsStringValueImpl {
mBuffer=theString;
}
else {
mBuffer=0;
mBuffer=(CharType*)gCommonEmptyBuffer;
mLength=mCapacity=0;
}
mRefCount=1;
@ -266,6 +197,7 @@ struct nsStringValueImpl {
void* GetBuffer() {return mBuffer;}
PRUint32 GetLength() {return mLength;}
PRUint32 GetCapacity() {return mCapacity;}
size_t GetCharSize() {return sizeof(CharType);}
CharType* mBuffer;

View File

@ -1,5 +1,4 @@
#include "nsString2.h"
#include "nsString.h"
#include "nsBufferManager.h"
#include <stdio.h>
@ -9,6 +8,27 @@
static const char* kWhitespace="\b\t\r\n ";
void Subsume(nsStringValueImpl<char> &aDest,nsStringValueImpl<char> &aSource){
if(aSource.mBuffer && aSource.mLength) {
#if 0
if(aSource.mOwnsBuffer){
nsStr::Destroy(aDest);
aDest.mStr=aSource.mStr;
aDest.mLength=aSource.mLength;
aDest.mCapacity=aSource.mCapacity;
aDest.mOwnsBuffer=aSource.mOwnsBuffer;
aSource.mOwnsBuffer=PR_FALSE;
aSource.mStr=0;
}
else{
nsStr::StrAssign(aDest,aSource,0,aSource.mLength);
}
#endif
}
else SVTruncate(aDest,0);
}
//******************************************
// Ctor's
//******************************************
@ -18,33 +38,30 @@ nsCString::nsCString() : mStringValue() {
//call this to copy construct nsCString
nsCString::nsCString(const nsCString& aString,PRInt32 aLength) : mStringValue() {
Assign(aString,aLength,0);
SVAppend(mStringValue,aString.mStringValue,aLength,0);
}
//call this to construct from nsString
nsCString::nsCString(const nsString& aString,PRInt32 aLength) : mStringValue() {
Assign(aString,aLength,0);
SVAppend(mStringValue,aString.mStringValue,aLength,0);
}
//call this version for char*'s....
nsCString::nsCString(const char* aString,PRInt32 aLength) : mStringValue() {
Assign(aString,aLength);
Append(aString,aLength);
}
//call this version for PRUnichar*'s....
nsCString::nsCString(const PRUnichar* aString,PRInt32 aLength) : mStringValue() {
Assign(aString,aLength,0);
Append(aString,aLength,0);
}
//call this version for a single char of type char...
nsCString::nsCString(const nsSubsumeCStr &aSubsumeString) : mStringValue(aSubsumeString.mLHS) {
SVAppend(mStringValue,aSubsumeString.mRHS,aSubsumeString.mRHS.mLength,0);
nsCString::nsCString(nsSubsumeCStr &aSubsumeString) : mStringValue() {
mStringValue=aSubsumeString.mStringValue;
memset(&aSubsumeString.mStringValue,0,sizeof(mStringValue));
}
//call this version for a single char of type char...
nsCString::nsCString(nsSubsumeCStr &aSubsumeString) : mStringValue(aSubsumeString.mLHS) {
SVAppend(mStringValue,aSubsumeString.mRHS,aSubsumeString.mRHS.mLength,0);
}
//call this version for a single char of type char...
nsCString::nsCString(const char aChar) : mStringValue() {
@ -56,12 +73,10 @@ nsCString::nsCString(const nsAReadableString &aString) : mStringValue() {
Assign(aString);
}
//call this version for stack-based string buffers...
nsCString::nsCString(const nsCStackBuffer &aBuffer) : mStringValue(aBuffer) {
nsCString::~nsCString() {
SVFree(mStringValue);
}
nsCString::~nsCString() { }
void nsCString::Reinitialize(char* aBuffer,PRUint32 aCapacity,PRInt32 aLength) {
mStringValue.mBuffer=aBuffer;
@ -76,18 +91,22 @@ void nsCString::Reinitialize(char* aBuffer,PRUint32 aCapacity,PRInt32 aLength) {
//******************************************
nsSubsumeCStr nsCString::operator+(const nsCString &aCString) {
nsSubsumeCStr result(mStringValue,aCString.mStringValue);
return result;
nsCString theString(*this);
SVAppend(theString.mStringValue,aCString.mStringValue);
return nsSubsumeCStr(theString);
}
nsSubsumeCStr nsCString::operator+(const char* aCString) {
nsSubsumeCStr result; //NOT IMPLEMENTED
return result;
nsSubsumeCStr nsCString::operator+(const char* aString) {
nsCString theTempString(*this);
nsStringValueImpl<char> theTempStrValue(NS_CONST_CAST(char*,aString));
SVAppend(theTempString.mStringValue,theTempStrValue);
return nsSubsumeCStr(theTempString);
}
nsSubsumeCStr nsCString::operator+(char aChar) {
nsSubsumeCStr result; //NOT IMPLEMENTED
return result;
nsCString theTempString(*this);
theTempString.Append(aChar);
return nsSubsumeCStr(theTempString);
}
//******************************************
@ -108,14 +127,14 @@ nsCString& nsCString::operator=(const nsString &aString) {
nsCString& nsCString::operator=(const char *aString) {
if(mStringValue.mBuffer!=aString) {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
SVAssign(mStringValue,theStringValue,theStringValue.mLength,0);
}
return *this;
}
nsCString& nsCString::operator=(const PRUnichar *aString) {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString));
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString));
Assign(aString);
return *this;
}
@ -126,7 +145,8 @@ nsCString& nsCString::operator=(const char aChar) {
}
nsCString& nsCString::operator=(const nsSubsumeCStr &aSubsumeString) {
//NOT IMPLEMENTED
mStringValue=aSubsumeString.mStringValue;
memset((void*)&aSubsumeString.mStringValue,0,sizeof(mStringValue));
return *this;
}
@ -176,11 +196,7 @@ nsresult nsCString::Truncate(PRUint32 anOffset) {
* @return this
*/
nsresult nsCString::Assign(const nsCString& aString,PRInt32 aLength,PRUint32 aSrcOffset) {
nsresult result=NS_OK;
if(mStringValue.mBuffer!=aString.mStringValue.mBuffer){
Truncate();
result=Append(aString,aLength,aSrcOffset);
}
nsresult result=SVAssign(mStringValue,aString.mStringValue,aLength,aSrcOffset);
return result;
}
@ -194,9 +210,8 @@ nsresult nsCString::Assign(const nsCString& aString,PRInt32 aLength,PRUint32 aSr
* @return this
*/
nsresult nsCString::Assign(const nsString& aString,PRInt32 aLength,PRUint32 aSrcOffset) {
nsresult result=NS_OK;
Truncate();
return Append(aString,aLength,aSrcOffset);
nsresult result=SVAssign(mStringValue,aString.mStringValue,aLength,aSrcOffset);
return result;
}
/*
@ -293,7 +308,7 @@ nsresult nsCString::Append(const nsString &aString,PRInt32 aLength,PRUint32 aSrc
nsresult nsCString::Append(const char* aString,PRInt32 aLength,PRUint32 aSrcOffset) {
nsresult result=NS_OK;
if(aString) {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aLength);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aLength);
result=SVAppend(mStringValue,theStringValue,aLength,aSrcOffset);
}
return result;
@ -339,7 +354,7 @@ nsresult nsCString::Append(const PRUnichar aChar) {
nsresult nsCString::Append(const PRUnichar* aString,PRInt32 aLength,PRUint32 aSrcOffset) {
nsresult result=NS_OK;
if(aString) {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString),aLength);
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString),aLength);
result=SVAppend(mStringValue,theStringValue,aLength,aSrcOffset);
}
return result;
@ -461,7 +476,7 @@ nsresult nsCString::Insert(const char* aString,PRUint32 anOffset,PRInt32 aLength
nsresult result=NS_OK;
if(aString){
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aLength);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aLength);
if(0<theStringValue.mLength){
result=SVInsert(mStringValue,anOffset,theStringValue,theStringValue.mLength,0);
@ -522,8 +537,8 @@ nsresult nsCString::ReplaceSubstring( const nsCString& aTarget,const nsCString&
nsresult nsCString::ReplaceSubstring(const char* aTarget,const char* aNewValue) {
nsresult result=NS_OK;
const nsStringValueImpl<char> theTarget(CONST_CAST(char*,aTarget));
const nsStringValueImpl<char> theNewValue(CONST_CAST(char*,aNewValue));
const nsStringValueImpl<char> theTarget(NS_CONST_CAST(char*,aTarget));
const nsStringValueImpl<char> theNewValue(NS_CONST_CAST(char*,aNewValue));
return SVReplace(mStringValue,theTarget,theNewValue,mStringValue.mLength,0);
}
@ -567,7 +582,7 @@ nsresult nsCString::StripChar(PRInt32 anInt,PRUint32 anOffset){
* @return *this
*/
nsresult nsCString::StripChars(const char* aSet,PRInt32 aLength){
nsStringValueImpl<char> theSet(CONST_CAST(char*,aSet),aLength);
nsStringValueImpl<char> theSet(NS_CONST_CAST(char*,aSet),aLength);
return SVStripCharsInSet(mStringValue,aSet,mStringValue.mLength,0);
}
@ -664,12 +679,12 @@ PRInt32 nsCString::Compare(const nsCString &aString,PRBool aIgnoreCase,PRInt32
}
PRInt32 nsCString::Compare(const char* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aCount);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aCount);
return SVCompareChars(mStringValue,theStringValue,aIgnoreCase,aCount);
}
PRInt32 nsCString::Compare(const PRUnichar* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString),aCount);
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString),aCount);
return SVCompare(mStringValue,theStringValue,aIgnoreCase,aCount);
}
@ -683,13 +698,13 @@ PRBool nsCString::Equals(const nsCString &aString,PRBool aIgnoreCase,PRInt32 aC
}
PRBool nsCString::Equals(const char* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString),aCount);
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString),aCount);
return PRBool(0==SVCompareChars(mStringValue,theStringValue,aIgnoreCase,aCount));
}
PRBool nsCString::Equals(const PRUnichar* aString,PRBool aIgnoreCase,PRInt32 aCount) const {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString),aCount);
nsStringValueImpl<PRUnichar> theStringValue(NS_CONST_CAST(PRUnichar*,aString),aCount);
return PRBool(0==SVCompare(mStringValue,theStringValue,aIgnoreCase,aCount));
}
@ -742,7 +757,7 @@ PRInt32 nsCString::Find(const nsCString &aString,PRBool aIgnoreCase,PRUint32 anO
* @return offset in string, or -1 (kNotFound)
*/
PRInt32 nsCString::Find(const char* aString,PRBool aIgnoreCase,PRUint32 anOffset,PRInt32 aRepCount) const {
nsStringValueImpl<char> theString(CONST_CAST(char*,aString));
nsStringValueImpl<char> theString(NS_CONST_CAST(char*,aString));
return SVFind(mStringValue,theString,aIgnoreCase,aRepCount,anOffset);
}
@ -758,7 +773,7 @@ PRInt32 nsCString::Find(const char* aString,PRBool aIgnoreCase,PRUint32 anOffset
*/
PRInt32 nsCString::Find(const PRUnichar* aString,PRBool aIgnoreCase,PRUint32 anOffset,PRInt32 aRepCount) const {
nsStringValueImpl<PRUnichar> theString(CONST_CAST(PRUnichar*,aString));
nsStringValueImpl<PRUnichar> theString(NS_CONST_CAST(PRUnichar*,aString));
return SVFind(mStringValue,theString,aIgnoreCase,aRepCount,anOffset);
}
@ -787,7 +802,7 @@ PRInt32 nsCString::FindCharInSet(const nsCString& aString,PRUint32 anOffset) con
*/
PRInt32 nsCString::FindCharInSet(const char *aString,PRUint32 anOffset) const{
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
return SVFindCharInSet(mStringValue,theStringValue,PR_FALSE,mStringValue.mLength,anOffset);
}
@ -821,7 +836,7 @@ PRInt32 nsCString::RFindChar(char aChar,PRBool aIgnoreCase,PRInt32 anOffset,PRIn
PRInt32 nsCString::RFind(const char* aString,PRBool aIgnoreCase,PRInt32 anOffset,PRInt32 aRepCount) const{
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
return SVRFind(mStringValue,theStringValue,aIgnoreCase,aRepCount,anOffset);
}
@ -850,7 +865,7 @@ PRInt32 nsCString::RFindCharInSet(const nsCString& aString,PRInt32 anOffset) con
* @return
*/
PRInt32 nsCString::RFindCharInSet(const char* aString,PRInt32 anOffset) const{
nsStringValueImpl<char> theStringValue(CONST_CAST(char*,aString));
nsStringValueImpl<char> theStringValue(NS_CONST_CAST(char*,aString));
return SVRFindCharInSet(mStringValue,theStringValue,PR_FALSE,mStringValue.mLength,anOffset);
}
@ -888,9 +903,7 @@ PRUnichar* nsCString::ToNewUnicode() const {
char* nsCString::ToCString(char* aBuf,PRUint32 aBufLength,PRUint32 anOffset) const {
int len=(mStringValue.mLength<aBufLength) ? mStringValue.mLength : aBufLength;
for(int i=0;i<len;i++){
aBuf[i]=(char)mStringValue.mBuffer[i];
}
SVCopyBuffer_(aBuf,mStringValue.mBuffer,len);
aBuf[len]=0;
return aBuf;
}
@ -943,46 +956,23 @@ PRInt32 nsCString::ToInteger(PRInt32* anErrorCode,PRUint32 aRadix) const{
/*****************************************************************
Now we declare the nsSubsumeCStr class
Now we define the nsSubsumeCStr class
*****************************************************************/
nsSubsumeCStr::nsSubsumeCStr() {
nsSubsumeCStr::nsSubsumeCStr(nsCString& aString) : nsCString() {
mStringValue=aString.mStringValue;
mOwnsBuffer=PR_TRUE;
aString.mStringValue.mBuffer=0;
aString.mStringValue.mRefCount=0;
}
nsSubsumeCStr::nsSubsumeCStr(const nsCString& aCString) : mLHS(aCString.mStringValue), mRHS() {
nsSubsumeCStr::nsSubsumeCStr(char* aString,PRBool assumeOwnership,PRInt32 aLength) : nsCString() {
mStringValue.mBuffer=aString;
mStringValue.mCapacity=mStringValue.mLength=(-1==aLength) ? stringlen(aString) : aLength;
mOwnsBuffer=assumeOwnership;
}
nsSubsumeCStr::nsSubsumeCStr(const nsSubsumeCStr& aSubsumeString) :
mLHS(aSubsumeString.mLHS),
mRHS(aSubsumeString.mRHS) {
}
nsSubsumeCStr::nsSubsumeCStr(const nsStringValueImpl<char> &aLHS,const nsSubsumeCStr& aSubsumeString) :
mLHS(aLHS),
mRHS(aSubsumeString.mLHS) {
}
nsSubsumeCStr::nsSubsumeCStr(const nsStringValueImpl<char> &aLHS,const nsStringValueImpl<char> &aRHS) :
mLHS(aLHS),
mRHS(aRHS) {
}
nsSubsumeCStr::nsSubsumeCStr(char* aString,PRBool assumeOwnership,PRInt32 aLength) {
}
nsSubsumeCStr nsSubsumeCStr::operator+(const nsSubsumeCStr &aSubsumeString) {
nsSubsumeCStr result(*this);
return result;
}
nsSubsumeCStr nsSubsumeCStr::operator+(const nsCString &aCString) {
SVAppend(mLHS,mRHS,mRHS.mLength,0);
memcpy(&mRHS,&aCString.mStringValue,sizeof(mRHS));
return *this;
}
/**
*
@ -1024,122 +1014,108 @@ void Recycle( char* aBuffer) {
nsCAutoString::nsCAutoString() : nsCString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mInternalBuffer[0]=0;
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
mStringValue.mRefCount=2;
}
//call this version nsAutoString derivatives...
nsCAutoString::nsCAutoString(const nsCAutoString& aString,PRInt32 aLength) : nsCString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mInternalBuffer[0]=0;
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
Assign(aString,aLength);
mStringValue.mRefCount=2;
nsCString::Assign(aString,aLength,0);
}
//call this version for nsCString,nsCString and the autostrings
nsCAutoString::nsCAutoString(const nsCString& aString,PRInt32 aLength) : nsCString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mInternalBuffer[0]=0;
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
Assign(aString,aLength);
mStringValue.mRefCount=2;
nsCString::Assign(aString,aLength,0);
}
//call this version for char*'s....
nsCAutoString::nsCAutoString(const char* aString,PRInt32 aLength) : nsCString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
nsCString theString(aString);
mInternalBuffer[0]=0;
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
Assign(theString,aLength);
mStringValue.mRefCount=2;
nsCString::Assign(aString,aLength,0);
}
//call this version for a single char of type char...
nsCAutoString::nsCAutoString(const char aChar) : nsCString() {
char theBuffer[]={aChar,0};
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mInternalBuffer[0]=0;
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
nsCString theString(theBuffer,1);
Assign(theString,1,0);
mStringValue.mRefCount=2;
nsCString::Assign(aChar);
}
//call this version for PRUnichar*'s....
nsCAutoString::nsCAutoString(const PRUnichar* aString,PRInt32 aLength) : nsCString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mInternalBuffer[0]=0;
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
nsStringValueImpl<PRUnichar> theString(CONST_CAST(PRUnichar*,aString),aLength);
SVAssign(mStringValue,theString,theString.mLength,0);
mStringValue.mRefCount=2;
nsCString::Assign(aString,aLength);
}
//call this version for all other ABT versions of readable strings
nsCAutoString::nsCAutoString(const nsAReadableString &aString) : nsCString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mInternalBuffer[0]=0;
mStringValue.mCapacity=kDefaultStringSize;
mStringValue.mBuffer=mInternalBuffer;
Assign(aString);
mStringValue.mRefCount=2;
nsCString::Assign(aString);
}
nsCAutoString::nsCAutoString(const nsCStackBuffer &aBuffer) : nsCString() {
memset(mInternalBuffer,0,sizeof(mInternalBuffer));
mStringValue.mLength=aBuffer.mLength;
mStringValue.mCapacity=aBuffer.mCapacity;
mStringValue.mBuffer=aBuffer.mBuffer;
}
nsCAutoString::nsCAutoString(const CBufDescriptor& aBuffer) : nsCString() {
nsCAutoString::nsCAutoString(const CBufDescriptor &aBuffer) : nsCString() {
mInternalBuffer[0]=0;
mStringValue.mBuffer=aBuffer.mBuffer;
mStringValue.mCapacity=aBuffer.mCapacity;
mStringValue.mLength=aBuffer.mLength;
mStringValue.mRefCount=(aBuffer.mStackBased) ? 2 : 1;
mStringValue.mRefCount=(aBuffer.mOwnsBuffer) ? 1 : 2;
}
nsCAutoString::nsCAutoString(const nsSubsumeCStr& aCSubsumeStringX) : nsCString() {
nsCAutoString::nsCAutoString(const nsSubsumeCStr& aSubsumeString) : nsCString() {
mInternalBuffer[0]=0;
mStringValue=aSubsumeString.mStringValue;
memset((void*)&aSubsumeString.mStringValue,0,sizeof(mStringValue));
}
nsCAutoString::~nsCAutoString() {
}
nsCAutoString& nsCAutoString::operator=(const nsCAutoString& aCopy) {
if(aCopy.mStringValue.mBuffer!=mStringValue.mBuffer) {
Assign(aCopy);
}
nsCAutoString& nsCAutoString::operator=(const nsCAutoString& aString) {
nsCString::operator=(aString);
return *this;
}
nsCAutoString& nsCAutoString::operator=(const nsCString& aString) {
Assign(aString);
nsCString::operator=(aString);
return *this;
}
nsCAutoString& nsCAutoString::operator=(const char* aString) {
if(mStringValue.mBuffer!=aString) {
nsCString theStringValue(CONST_CAST(char*,aString));
Assign(aString);
}
nsCString::operator=(aString);
return *this;
}
nsCAutoString& nsCAutoString::operator=(const PRUnichar* aString) {
nsStringValueImpl<PRUnichar> theStringValue(CONST_CAST(PRUnichar*,aString));
SVAssign(mStringValue,theStringValue,theStringValue.mLength,0);
nsCString::operator=(aString);
return *this;
}
nsCAutoString& nsCAutoString::operator=(const char aChar) {
Assign(aChar);
nsCString::operator=(aChar);
return *this;
}

View File

@ -22,10 +22,29 @@
#include "nsStringValue.h"
#include "nsString2.h"
#include <stddef.h>
class NS_COM nsSubsumeCStr;
typedef nsStackBuffer<char> nsCStackBuffer;
/***************************************************************************
*
* This is the templatized base class from which stringvalues are derived. (rickg)
*
***************************************************************************/
struct CBufDescriptor {
CBufDescriptor(char *aBuffer,PRUint32 aLength,PRUint32 aCapacity,PRBool aOwnsBuffer) {
mBuffer=aBuffer;
mLength=aLength;
mCapacity=aCapacity-1;
mOwnsBuffer=aOwnsBuffer;
}
char* mBuffer;
PRUint32 mLength;
PRUint32 mCapacity;
PRBool mOwnsBuffer;
};
class NS_COM nsCString {
public:
@ -57,12 +76,12 @@ public:
//call this version for stack-based string buffers...
nsCString(nsSubsumeCStr &aSubsumeString);
//call this version for cbufdescriptor string buffers...
nsCString(const CBufDescriptor &aSubsumeString);
//call this version for all other ABT versions of readable strings
nsCString(const nsAReadableString &aString) ;
//call this version for stack-based string buffers...
nsCString(const nsCStackBuffer &aBuffer);
virtual ~nsCString();
void Reinitialize(char* aBuffer,PRUint32 aCapacity,PRInt32 aLength=-1);
@ -86,7 +105,7 @@ public:
nsCString& operator=(const char* aString);
nsCString& operator=(const PRUnichar* aString);
nsCString& operator=(const char aChar);
nsCString& operator=(const nsSubsumeCStr &aSubsumeString);
nsCString& operator=(const nsSubsumeCStr &aBufDescriptor);
//******************************************
// Here are the accessor methods...
@ -156,15 +175,10 @@ public:
* @return this
*/
virtual nsresult Assign(const nsCString& aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Assign(const nsString& aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Assign(const char* aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Assign(const PRUnichar* aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Assign(const nsAReadableString &aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Assign(char aChar);
nsCString& SetString(const char* aString,PRInt32 aLength=-1) {Assign(aString, aLength); return *this;}
@ -185,21 +199,13 @@ public:
* @return this
*/
virtual nsresult Append(const nsCString &aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Append(const nsString &aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Append(const char* aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Append(const PRUnichar* aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Append(const char aChar) ;
virtual nsresult Append(const PRUnichar aChar);
virtual nsresult Append(const nsAReadableString &aString,PRInt32 aLength=-1,PRUint32 aSrcOffset=0);
virtual nsresult Append(PRInt32 anInteger,PRInt32 aRadix=10);
virtual nsresult Append(float aFloat);
@ -250,9 +256,7 @@ public:
* @return this
*/
nsresult Insert(const nsCString& aString,PRUint32 anOffset=0,PRInt32 aCount=-1);
nsresult Insert(const char* aString,PRUint32 anOffset=0,PRInt32 aLength=-1);
nsresult Insert(char aChar,PRUint32 anOffset=0);
@ -266,11 +270,8 @@ public:
* @return this
*/
nsresult ReplaceSubstring( const nsCString& aTarget,const nsCString& aNewValue);
nsresult ReplaceChar(char anOldChar, char aNewChar);
nsresult ReplaceChar(const char* aSet,char aNewPRUnichar);
nsresult ReplaceSubstring(const char* aTarget,const char* aNewValue);
@ -288,11 +289,8 @@ public:
* @return *this
*/
nsresult StripChar(char aChar,PRUint32 anOffset=0);
nsresult StripChar(PRInt32 anInt,PRUint32 anOffset=0);
nsresult StripChars(const char* aSet,PRInt32 aLength=-1);
nsresult StripWhitespace();
//**************************************************
@ -316,10 +314,7 @@ public:
nsCString& operator+=(const PRUnichar aChar);
nsCString& operator+=(const char aChar);
nsCString& operator+=(const int anInt);
nsCString& operator+=(const nsSubsumeCStr &aSubsumeString) {
//NOT IMPLEMENTED
return *this;
}
nsCString& operator+=(const nsSubsumeCStr &aBuffer);
/***********************************
@ -456,35 +451,19 @@ protected:
friend class nsString;
friend class nsSubsumeCStr;
friend class nsCAutoString;
};
/*****************************************************************
Now we declare the nsSubsumeCStr class
*****************************************************************/
class NS_COM nsSubsumeCStr {
class NS_COM nsSubsumeCStr : public nsCString {
public:
nsSubsumeCStr();
nsSubsumeCStr(const nsCString& aCString);
nsSubsumeCStr(const nsSubsumeCStr& aSubsumeString);
nsSubsumeCStr(const nsStringValueImpl<char> &aLHS,const nsSubsumeCStr& aSubsumeString);
nsSubsumeCStr(const nsStringValueImpl<char> &aLHS,const nsStringValueImpl<char> &aSubsumeString);
nsSubsumeCStr(nsCString& aString);
nsSubsumeCStr(char* aString,PRBool assumeOwnership,PRInt32 aLength=-1);
nsSubsumeCStr operator+(const nsSubsumeCStr &aSubsumeString);
nsSubsumeCStr operator+(const nsCString &aCString);
operator const char*() {return 0;}
nsStringValueImpl<char> mLHS;
nsStringValueImpl<char> mRHS;
PRBool mOwnsBuffer;
};
@ -515,11 +494,9 @@ public:
//call this version for all other ABT versions of readable strings
nsCAutoString(const nsAReadableString &aString);
nsCAutoString(const nsCStackBuffer &aBuffer) ;
nsCAutoString(const CBufDescriptor&aBuffer) ;
nsCAutoString(const CBufDescriptor& aBuffer) ;
nsCAutoString(const nsSubsumeCStr& aCSubsumeStringX) ;
nsCAutoString(const nsSubsumeCStr& aSubsumeString) ;
virtual ~nsCAutoString() ;