void festring::EnsureOwnsData(bool Unique) { if(!OwnsData) CreateOwnData(Data, Size); else if(Unique && REFS(Data)) { --REFS(Data); CreateOwnData(Data, Size); } }
void festring::SlowAppend(const char* CStr, sizetype N) { char* OldPtr = Data; if(OldPtr) { sizetype OldSize = Size; sizetype NewSize = OldSize + N; Size = NewSize; ulong* DeletePtr = 0; if(OwnsData && !REFS(OldPtr)--) DeletePtr = &REFS(OldPtr); Reserved = NewSize|FESTRING_PAGE; char* NewPtr = sizeof(ulong) + new char[Reserved + sizeof(ulong) + 1]; REFS(NewPtr) = 0; Data = NewPtr; memcpy(NewPtr, OldPtr, OldSize); memcpy(NewPtr + OldSize, CStr, N); OwnsData = true; if(DeletePtr) delete [] DeletePtr; } else CreateOwnData(CStr, N); }
festring& festring::operator=(cchar* CStr) {DBGEXEC(bugTrackInvalidChars(CStr,strlen(CStr))); CheckNull(CStr); sizetype NewSize = strlen(CStr); if(OwnsData) { if(!REFS(Data) && NewSize <= Reserved) { memcpy(Data, CStr, NewSize); Size = NewSize; return *this; } if(!REFS(Data)--) delete [] &REFS(Data); } if(NewSize) CreateOwnData(CStr, NewSize); else Empty(); return *this; }
festring& festring::operator=(cfestring& Str) {DBGEXEC(bugTrackInvalidChars(Str.Data,Str.Size)); char* CStr = Str.Data; sizetype NewSize = Str.Size; if(OwnsData) { if(!REFS(Data) && NewSize <= Reserved) { memcpy(Data, CStr, NewSize); Size = NewSize; return *this; } if(!REFS(Data)--) delete [] &REFS(Data); } Size = NewSize; Data = CStr; OwnsData = Str.OwnsData; if(OwnsData) { if(REFS(Data) < FESTRING_REF_MAX) { ++REFS(Data); Reserved = Str.Reserved; } else CreateOwnData(CStr, NewSize); } return *this; }
festring& festring::Capitalize() { char* OldPtr = Data; if(*OldPtr > 0x60 && *OldPtr < 0x7B) { if(!OwnsData) CreateOwnData(OldPtr, Size); else if(REFS(OldPtr)) { --REFS(OldPtr); CreateOwnData(OldPtr, Size); } *Data ^= 0x20; } return *this; }
/// Resize the string and use a char for padding. void festring::Resize(sizetype NewSize, char Char) { if(Size > NewSize) { if(OwnsData) { if(!REFS(Data)) { Size = NewSize; return; } --REFS(Data); } CreateOwnData(Data, NewSize); return; } else if(Size < NewSize) { char* OldData = Data; sizetype OldSize = Size; decltype(&REFS(Data)) FreePtr = 0; if(OwnsData) { if(!REFS(OldData)) { if(NewSize <= Reserved) { memset(OldData + OldSize, Char, NewSize - OldSize); Size = NewSize; return; } else FreePtr = &REFS(OldData); } else --REFS(OldData); } CreateNewData(NewSize); memcpy(Data, OldData, OldSize); memset(Data + OldSize, Char, NewSize - OldSize); Size = NewSize; if(FreePtr) delete [] FreePtr; } else return; }
void festring::EnsureOwnsData() { if(!OwnsData) CreateOwnData(Data, Size); }