Patch by Julun: implements a refcounted BString. Thank You!
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24102 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+292
-238
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku Inc. All Rights Reserved.
|
* Copyright 2001-2008, Haiku Inc. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef __BSTRING__
|
#ifndef __BSTRING__
|
||||||
#define __BSTRING__
|
#define __BSTRING__
|
||||||
|
|
||||||
@@ -11,252 +11,256 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
class BString {
|
class BStringRef;
|
||||||
public:
|
|
||||||
BString();
|
|
||||||
BString(const char* string);
|
|
||||||
BString(const BString& string);
|
|
||||||
BString(const char* string, int32 maxLength);
|
|
||||||
~BString();
|
|
||||||
|
|
||||||
// Access
|
|
||||||
const char* String() const;
|
|
||||||
|
|
||||||
int32 Length() const;
|
class BString
|
||||||
// length of corresponding string
|
{
|
||||||
int32 CountChars() const;
|
public:
|
||||||
// returns number of UTF8 characters in string
|
BString();
|
||||||
|
BString(const char* string);
|
||||||
|
BString(const BString& string);
|
||||||
|
BString(const char* string, int32 maxLength);
|
||||||
|
~BString();
|
||||||
|
|
||||||
// Assignment
|
// Access
|
||||||
BString& operator=(const BString& string);
|
const char* String() const;
|
||||||
BString& operator=(const char* string);
|
int32 Length() const;
|
||||||
BString& operator=(char c);
|
int32 CountChars() const;
|
||||||
|
int32 ReferenceCount() const;
|
||||||
|
|
||||||
BString& SetTo(const char* string);
|
// Assignment
|
||||||
BString& SetTo(const char* string, int32 maxLength);
|
BString& operator=(const BString& string);
|
||||||
|
BString& operator=(const char* string);
|
||||||
|
BString& operator=(char c);
|
||||||
|
|
||||||
BString& SetTo(const BString& string);
|
BString& SetTo(const char* string);
|
||||||
BString& Adopt(BString& from);
|
BString& SetTo(const char* string, int32 maxLength);
|
||||||
|
|
||||||
BString& SetTo(const BString& string, int32 maxLength);
|
BString& SetTo(const BString& string);
|
||||||
BString& Adopt(BString& from, int32 maxLength);
|
BString& Adopt(BString& from);
|
||||||
|
|
||||||
BString& SetTo(char c, int32 count);
|
BString& SetTo(const BString& string, int32 maxLength);
|
||||||
|
BString& Adopt(BString& from, int32 maxLength);
|
||||||
|
|
||||||
// Substring copying
|
BString& SetTo(char c, int32 count);
|
||||||
BString& CopyInto(BString& into, int32 fromOffset,
|
|
||||||
int32 length) const;
|
|
||||||
void CopyInto(char* into, int32 fromOffset,
|
|
||||||
int32 length) const;
|
|
||||||
|
|
||||||
// Appending
|
// Substring copying
|
||||||
BString& operator+=(const BString& string);
|
BString& CopyInto(BString& into, int32 fromOffset, int32 length) const;
|
||||||
BString& operator+=(const char* string);
|
void CopyInto(char* into, int32 fromOffset, int32 length) const;
|
||||||
BString& operator+=(char c);
|
|
||||||
|
|
||||||
BString& Append(const BString& string);
|
// Appending
|
||||||
BString& Append(const char* string);
|
BString& operator+=(const BString& string);
|
||||||
|
BString& operator+=(const char* string);
|
||||||
|
BString& operator+=(char c);
|
||||||
|
|
||||||
BString& Append(const BString& string, int32 length);
|
BString& Append(const BString& string);
|
||||||
BString& Append(const char* string, int32 length);
|
BString& Append(const char* string);
|
||||||
BString& Append(char c, int32 count);
|
|
||||||
|
|
||||||
// Prepending
|
BString& Append(const BString& string, int32 length);
|
||||||
BString& Prepend(const char* string);
|
BString& Append(const char* string, int32 length);
|
||||||
BString& Prepend(const BString& string);
|
BString& Append(char c, int32 count);
|
||||||
BString& Prepend(const char* string, int32 length);
|
|
||||||
BString& Prepend(const BString& string, int32 length);
|
|
||||||
BString& Prepend(char c, int32 count);
|
|
||||||
|
|
||||||
// Inserting
|
// Prepending
|
||||||
BString& Insert(const char* string, int32 pos);
|
BString& Prepend(const char* string);
|
||||||
BString& Insert(const char* string, int32 length, int32 pos);
|
BString& Prepend(const BString& string);
|
||||||
BString& Insert(const char* string, int32 fromOffset,
|
BString& Prepend(const char* string, int32 length);
|
||||||
int32 length, int32 pos);
|
BString& Prepend(const BString& string, int32 length);
|
||||||
|
BString& Prepend(char c, int32 count);
|
||||||
|
|
||||||
BString& Insert(const BString& string, int32 pos);
|
// Inserting
|
||||||
BString& Insert(const BString& string, int32 length, int32 pos);
|
BString& Insert(const char* string, int32 position);
|
||||||
BString& Insert(const BString& string, int32 fromOffset,
|
BString& Insert(const char* string, int32 length, int32 position);
|
||||||
int32 length, int32 pos);
|
BString& Insert(const char* string, int32 fromOffset, int32 length,
|
||||||
BString& Insert(char, int32 count, int32 pos);
|
int32 position);
|
||||||
|
BString& Insert(const BString& string, int32 position);
|
||||||
|
BString& Insert(const BString& string, int32 length, int32 position);
|
||||||
|
BString& Insert(const BString& string, int32 fromOffset, int32 length,
|
||||||
|
int32 position);
|
||||||
|
BString& Insert(char c, int32 count, int32 position);
|
||||||
|
|
||||||
// Removing
|
// Removing
|
||||||
BString& Truncate(int32 newLength, bool lazy = true);
|
BString& Truncate(int32 newLength, bool lazy = true);
|
||||||
BString& Remove(int32 from, int32 length);
|
BString& Remove(int32 from, int32 length);
|
||||||
|
|
||||||
BString& RemoveFirst(const BString& string);
|
BString& RemoveFirst(const BString& string);
|
||||||
BString& RemoveLast(const BString& string);
|
BString& RemoveLast(const BString& string);
|
||||||
BString& RemoveAll(const BString& string);
|
BString& RemoveAll(const BString& string);
|
||||||
|
|
||||||
BString& RemoveFirst(const char* string);
|
BString& RemoveFirst(const char* string);
|
||||||
BString& RemoveLast(const char* string);
|
BString& RemoveLast(const char* string);
|
||||||
BString& RemoveAll(const char* string);
|
BString& RemoveAll(const char* string);
|
||||||
|
|
||||||
BString& RemoveSet(const char* setOfCharsToRemove);
|
BString& RemoveSet(const char* setOfCharsToRemove);
|
||||||
|
|
||||||
BString& MoveInto(BString& into, int32 from, int32 length);
|
BString& MoveInto(BString& into, int32 from, int32 length);
|
||||||
void MoveInto(char* into, int32 from, int32 length);
|
void MoveInto(char* into, int32 from, int32 length);
|
||||||
|
|
||||||
// Compare functions
|
// Compare functions
|
||||||
bool operator<(const BString& string) const;
|
bool operator<(const BString& string) const;
|
||||||
bool operator<=(const BString& string) const;
|
bool operator<=(const BString& string) const;
|
||||||
bool operator==(const BString& string) const;
|
bool operator==(const BString& string) const;
|
||||||
bool operator>=(const BString& string) const;
|
bool operator>=(const BString& string) const;
|
||||||
bool operator>(const BString& string) const;
|
bool operator>(const BString& string) const;
|
||||||
bool operator!=(const BString& string) const;
|
bool operator!=(const BString& string) const;
|
||||||
|
|
||||||
bool operator<(const char* string) const;
|
bool operator<(const char* string) const;
|
||||||
bool operator<=(const char* string) const;
|
bool operator<=(const char* string) const;
|
||||||
bool operator==(const char* string) const;
|
bool operator==(const char* string) const;
|
||||||
bool operator>=(const char* string) const;
|
bool operator>=(const char* string) const;
|
||||||
bool operator>(const char* string) const;
|
bool operator>(const char* string) const;
|
||||||
bool operator!=(const char* string) const;
|
bool operator!=(const char* string) const;
|
||||||
|
|
||||||
// strcmp()-style compare functions
|
// strcmp()-style compare functions
|
||||||
int Compare(const BString& string) const;
|
int Compare(const BString& string) const;
|
||||||
int Compare(const char* string) const;
|
int Compare(const char* string) const;
|
||||||
int Compare(const BString& string, int32 length) const;
|
int Compare(const BString& string, int32 length) const;
|
||||||
int Compare(const char* string, int32 length) const;
|
int Compare(const char* string, int32 length) const;
|
||||||
int ICompare(const BString& string) const;
|
int ICompare(const BString& string) const;
|
||||||
int ICompare(const char* string) const;
|
int ICompare(const char* string) const;
|
||||||
int ICompare(const BString& string, int32 length) const;
|
int ICompare(const BString& string, int32 length) const;
|
||||||
int ICompare(const char* string, int32 length) const;
|
int ICompare(const char* string, int32 length) const;
|
||||||
|
|
||||||
// Searching
|
// Searching
|
||||||
int32 FindFirst(const BString& string) const;
|
int32 FindFirst(const BString& string) const;
|
||||||
int32 FindFirst(const char* string) const;
|
int32 FindFirst(const char* string) const;
|
||||||
int32 FindFirst(const BString& string, int32 fromOffset) const;
|
int32 FindFirst(const BString& string, int32 fromOffset) const;
|
||||||
int32 FindFirst(const char* string, int32 fromOffset) const;
|
int32 FindFirst(const char* string, int32 fromOffset) const;
|
||||||
int32 FindFirst(char c) const;
|
int32 FindFirst(char c) const;
|
||||||
int32 FindFirst(char c, int32 fromOffset) const;
|
int32 FindFirst(char c, int32 fromOffset) const;
|
||||||
|
|
||||||
int32 FindLast(const BString& string) const;
|
int32 FindLast(const BString& string) const;
|
||||||
int32 FindLast(const char* string) const;
|
int32 FindLast(const char* string) const;
|
||||||
int32 FindLast(const BString& string, int32 beforeOffset) const;
|
int32 FindLast(const BString& string, int32 beforeOffset) const;
|
||||||
int32 FindLast(const char* string, int32 beforeOffset) const;
|
int32 FindLast(const char* string, int32 beforeOffset) const;
|
||||||
int32 FindLast(char c) const;
|
int32 FindLast(char c) const;
|
||||||
int32 FindLast(char c, int32 beforeOffset) const;
|
int32 FindLast(char c, int32 beforeOffset) const;
|
||||||
|
|
||||||
int32 IFindFirst(const BString& string) const;
|
int32 IFindFirst(const BString& string) const;
|
||||||
int32 IFindFirst(const char* string) const;
|
int32 IFindFirst(const char* string) const;
|
||||||
int32 IFindFirst(const BString& string, int32 fromOffset) const;
|
int32 IFindFirst(const BString& string, int32 fromOffset) const;
|
||||||
int32 IFindFirst(const char* string, int32 fromOffset) const;
|
int32 IFindFirst(const char* string, int32 fromOffset) const;
|
||||||
|
|
||||||
int32 IFindLast(const BString& string) const;
|
int32 IFindLast(const BString& string) const;
|
||||||
int32 IFindLast(const char* string) const;
|
int32 IFindLast(const char* string) const;
|
||||||
int32 IFindLast(const BString& string, int32 beforeOffset) const;
|
int32 IFindLast(const BString& string, int32 beforeOffset) const;
|
||||||
int32 IFindLast(const char* string, int32 beforeOffset) const;
|
int32 IFindLast(const char* string, int32 beforeOffset) const;
|
||||||
|
|
||||||
// Replacing
|
// Replacing
|
||||||
BString& ReplaceFirst(char replaceThis, char withThis);
|
BString& ReplaceFirst(char replaceThis, char withThis);
|
||||||
BString& ReplaceLast(char replaceThis, char withThis);
|
BString& ReplaceLast(char replaceThis, char withThis);
|
||||||
BString& ReplaceAll(char replaceThis, char withThis,
|
BString& ReplaceAll(char replaceThis, char withThis, int32 fromOffset = 0);
|
||||||
int32 fromOffset = 0);
|
BString& Replace(char replaceThis, char withThis, int32 maxReplaceCount,
|
||||||
BString& Replace(char replaceThis, char withThis,
|
int32 fromOffset = 0);
|
||||||
int32 maxReplaceCount, int32 fromOffset = 0);
|
BString& ReplaceFirst(const char* replaceThis, const char* withThis);
|
||||||
BString& ReplaceFirst(const char* replaceThis,
|
BString& ReplaceLast(const char* replaceThis, const char* withThis);
|
||||||
const char* withThis);
|
BString& ReplaceAll(const char* replaceThis, const char* withThis,
|
||||||
BString& ReplaceLast(const char* replaceThis,
|
int32 fromOffset = 0);
|
||||||
const char* withThis);
|
BString& Replace(const char* replaceThis, const char* withThis,
|
||||||
BString& ReplaceAll(const char* replaceThis,
|
int32 maxReplaceCount, int32 fromOffset = 0);
|
||||||
const char* withThis, int32 fromOffset = 0);
|
|
||||||
BString& Replace(const char* replaceThis, const char* withThis,
|
|
||||||
int32 maxReplaceCount, int32 fromOffset = 0);
|
|
||||||
|
|
||||||
BString& IReplaceFirst(char replaceThis, char withThis);
|
BString& IReplaceFirst(char replaceThis, char withThis);
|
||||||
BString& IReplaceLast(char replaceThis, char withThis);
|
BString& IReplaceLast(char replaceThis, char withThis);
|
||||||
BString& IReplaceAll(char replaceThis, char withThis,
|
BString& IReplaceAll(char replaceThis, char withThis, int32 fromOffset = 0);
|
||||||
int32 fromOffset = 0);
|
BString& IReplace(char replaceThis, char withThis, int32 maxReplaceCount,
|
||||||
BString& IReplace(char replaceThis, char withThis,
|
int32 fromOffset = 0);
|
||||||
int32 maxReplaceCount, int32 fromOffset = 0);
|
BString& IReplaceFirst(const char* replaceThis, const char* withThis);
|
||||||
BString& IReplaceFirst(const char* replaceThis,
|
BString& IReplaceLast(const char* replaceThis, const char* withThis);
|
||||||
const char* withThis);
|
BString& IReplaceAll(const char* replaceThis, const char* withThis,
|
||||||
BString& IReplaceLast(const char* replaceThis,
|
int32 fromOffset = 0);
|
||||||
const char* withThis);
|
BString& IReplace(const char* replaceThis, const char* withThis,
|
||||||
BString& IReplaceAll(const char* replaceThis,
|
int32 maxReplaceCount, int32 fromOffset = 0);
|
||||||
const char* withThis, int32 fromOffset = 0);
|
|
||||||
BString& IReplace(const char* replaceThis, const char* withThis,
|
|
||||||
int32 maxReplaceCount, int32 fromOffset = 0);
|
|
||||||
|
|
||||||
BString& ReplaceSet(const char* setOfChars, char with);
|
BString& ReplaceSet(const char* setOfChars, char with);
|
||||||
BString& ReplaceSet(const char* setOfChars, const char *with);
|
BString& ReplaceSet(const char* setOfChars, const char* with);
|
||||||
|
|
||||||
// Unchecked char access
|
// Unchecked char access
|
||||||
char operator[](int32 index) const;
|
char operator[](int32 index) const;
|
||||||
char& operator[](int32 index);
|
|
||||||
|
|
||||||
// Checked char access
|
#if __GNUC__ > 3
|
||||||
char ByteAt(int32 index) const;
|
BStringRef operator[](int32 index);
|
||||||
|
|
||||||
// Fast low-level manipulation
|
|
||||||
char* LockBuffer(int32 maxLength);
|
|
||||||
BString& UnlockBuffer(int32 length = -1);
|
|
||||||
|
|
||||||
// Upercase <-> Lowercase
|
|
||||||
BString& ToLower();
|
|
||||||
BString& ToUpper();
|
|
||||||
|
|
||||||
BString& Capitalize();
|
|
||||||
BString& CapitalizeEachWord();
|
|
||||||
|
|
||||||
// Escaping and De-escaping
|
|
||||||
BString& CharacterEscape(const char* original,
|
|
||||||
const char* setOfCharsToEscape, char escapeWith);
|
|
||||||
BString& CharacterEscape(const char* setOfCharsToEscape,
|
|
||||||
char escapeWith);
|
|
||||||
|
|
||||||
BString& CharacterDeescape(const char* original, char escapeChar);
|
|
||||||
BString& CharacterDeescape(char escapeChar);
|
|
||||||
|
|
||||||
// Slower than sprintf() but type and overflow safe
|
|
||||||
BString& operator<<(const char* string);
|
|
||||||
BString& operator<<(const BString& string);
|
|
||||||
BString& operator<<(char c);
|
|
||||||
BString& operator<<(int value);
|
|
||||||
BString& operator<<(unsigned int value);
|
|
||||||
BString& operator<<(uint32 value);
|
|
||||||
BString& operator<<(int32 value);
|
|
||||||
BString& operator<<(uint64 value);
|
|
||||||
BString& operator<<(int64 value);
|
|
||||||
BString& operator<<(float value);
|
|
||||||
// float output hardcodes %.2f style formatting
|
|
||||||
|
|
||||||
private:
|
|
||||||
void _Init(const char *, int32);
|
|
||||||
void _DoAssign(const char *, int32);
|
|
||||||
void _DoAppend(const char *, int32);
|
|
||||||
char* _GrowBy(int32);
|
|
||||||
char* _OpenAtBy(int32, int32);
|
|
||||||
char* _ShrinkAtBy(int32, int32);
|
|
||||||
void _DoPrepend(const char *, int32);
|
|
||||||
|
|
||||||
int32 _FindAfter(const char *, int32, int32) const;
|
|
||||||
int32 _IFindAfter(const char *, int32, int32) const;
|
|
||||||
int32 _ShortFindAfter(const char *, int32) const;
|
|
||||||
int32 _FindBefore(const char *, int32, int32) const;
|
|
||||||
int32 _IFindBefore(const char *, int32, int32) const;
|
|
||||||
BString& _DoReplace(const char *, const char *, int32, int32,
|
|
||||||
bool);
|
|
||||||
void _SetLength(int32);
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
void _SetUsingAsCString(bool);
|
|
||||||
void _AssertNotUsingAsCString() const;
|
|
||||||
#else
|
#else
|
||||||
void _SetUsingAsCString(bool) {}
|
char& operator[](int32 index);
|
||||||
void _AssertNotUsingAsCString() const {}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char* _Alloc(int32 size);
|
// Checked char access
|
||||||
|
char ByteAt(int32 index) const;
|
||||||
|
|
||||||
class PosVect;
|
// Fast low-level manipulation
|
||||||
void _ReplaceAtPositions(const PosVect* positions,
|
char* LockBuffer(int32 maxLength);
|
||||||
int32 searchLength, const char* with, int32 withLen);
|
BString& UnlockBuffer(int32 length = -1);
|
||||||
|
|
||||||
protected:
|
// Upercase <-> Lowercase
|
||||||
char* fPrivateData;
|
BString& ToLower();
|
||||||
|
BString& ToUpper();
|
||||||
|
|
||||||
|
BString& Capitalize();
|
||||||
|
BString& CapitalizeEachWord();
|
||||||
|
|
||||||
|
// Escaping and De-escaping
|
||||||
|
BString& CharacterEscape(const char* original, const char* setOfCharsToEscape,
|
||||||
|
char escapeWith);
|
||||||
|
BString& CharacterEscape(const char* setOfCharsToEscape, char escapeWith);
|
||||||
|
BString& CharacterDeescape(const char* original, char escapeChar);
|
||||||
|
BString& CharacterDeescape(char escapeChar);
|
||||||
|
|
||||||
|
// Insert
|
||||||
|
BString& operator<<(const char* string);
|
||||||
|
BString& operator<<(const BString& string);
|
||||||
|
BString& operator<<(char c);
|
||||||
|
BString& operator<<(int value);
|
||||||
|
BString& operator<<(unsigned int value);
|
||||||
|
BString& operator<<(uint32 value);
|
||||||
|
BString& operator<<(int32 value);
|
||||||
|
BString& operator<<(uint64 value);
|
||||||
|
BString& operator<<(int64 value);
|
||||||
|
// float output hardcodes %.2f style formatting
|
||||||
|
BString& operator<<(float value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
class PosVect;
|
||||||
|
friend class BStringRef;
|
||||||
|
|
||||||
|
// Management
|
||||||
|
status_t _Detach();
|
||||||
|
char* _Realloc(int32 length);
|
||||||
|
void _Init(const char* src, int32 length);
|
||||||
|
char* _Clone(const char* data, int32 length);
|
||||||
|
char* _OpenAtBy(int32 offset, int32 length);
|
||||||
|
char* _ShrinkAtBy(int32 offset, int32 length);
|
||||||
|
status_t _DetachWith(const char* string, int32 length);
|
||||||
|
|
||||||
|
// Data
|
||||||
|
void _SetLength(int32 length);
|
||||||
|
void _SetReferenceCount(int32 count);
|
||||||
|
bool _DoAppend(const char* string, int32 length);
|
||||||
|
bool _DoPrepend(const char* string, int32 length);
|
||||||
|
bool _DoInsert(const char* string, int32 offset, int32 length);
|
||||||
|
|
||||||
|
// Search
|
||||||
|
int32 _ShortFindAfter(const char* string, int32 len) const;
|
||||||
|
int32 _FindAfter(const char* string, int32 offset, int32 strlen) const;
|
||||||
|
int32 _IFindAfter(const char* string, int32 offset, int32 strlen) const;
|
||||||
|
|
||||||
|
int32 _FindBefore(const char* string, int32 offset, int32 strlen) const;
|
||||||
|
int32 _IFindBefore(const char* string, int32 offset, int32 strlen) const;
|
||||||
|
|
||||||
|
// Escape
|
||||||
|
BString& _DoCharacterEscape(const char* string,
|
||||||
|
const char *setOfCharsToEscape, char escapeChar);
|
||||||
|
BString& _DoCharacterDeescape(const char* string, char escapeChar);
|
||||||
|
|
||||||
|
// Replace
|
||||||
|
BString& _DoReplace(const char* findThis, const char* replaceWith,
|
||||||
|
int32 maxReplaceCount, int32 fromOffset, bool ignoreCase);
|
||||||
|
void _ReplaceAtPositions(const PosVect* positions, int32 searchLen,
|
||||||
|
const char* with, int32 withLen);
|
||||||
|
|
||||||
|
private:
|
||||||
|
char* fPrivateData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Commutative compare operators
|
// Commutative compare operators
|
||||||
bool operator<(const char* a, const BString& b);
|
bool operator<(const char* a, const BString& b);
|
||||||
bool operator<=(const char* a, const BString& b);
|
bool operator<=(const char* a, const BString& b);
|
||||||
@@ -265,6 +269,7 @@ bool operator>(const char* a, const BString& b);
|
|||||||
bool operator>=(const char* a, const BString& b);
|
bool operator>=(const char* a, const BString& b);
|
||||||
bool operator!=(const char* a, const BString& b);
|
bool operator!=(const char* a, const BString& b);
|
||||||
|
|
||||||
|
|
||||||
// Non-member compare for sorting, etc.
|
// Non-member compare for sorting, etc.
|
||||||
int Compare(const BString& a, const BString& b);
|
int Compare(const BString& a, const BString& b);
|
||||||
int ICompare(const BString& a, const BString& b);
|
int ICompare(const BString& a, const BString& b);
|
||||||
@@ -272,16 +277,16 @@ int Compare(const BString* a, const BString* b);
|
|||||||
int ICompare(const BString* a, const BString* b);
|
int ICompare(const BString* a, const BString* b);
|
||||||
|
|
||||||
|
|
||||||
inline int32
|
inline int32
|
||||||
BString::Length() const
|
BString::Length() const
|
||||||
{
|
{
|
||||||
return fPrivateData ? (*((int32 *)fPrivateData - 1) & 0x7fffffff) : 0;
|
// the most significant bit is reserved; accessing
|
||||||
/* the most significant bit is reserved; accessing
|
// it in any way will cause the computer to explode
|
||||||
* it in any way will cause the computer to explode
|
return fPrivateData ? (*(((int32 *)fPrivateData) - 1) & 0x7fffffff) : 0;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const char *
|
|
||||||
|
inline const char*
|
||||||
BString::String() const
|
BString::String() const
|
||||||
{
|
{
|
||||||
if (!fPrivateData)
|
if (!fPrivateData)
|
||||||
@@ -289,19 +294,29 @@ BString::String() const
|
|||||||
return fPrivateData;
|
return fPrivateData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int32
|
||||||
|
BString::ReferenceCount() const
|
||||||
|
{
|
||||||
|
return fPrivateData ? (*(((int32 *)fPrivateData) - 2)) : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline BString &
|
inline BString &
|
||||||
BString::SetTo(const char *string)
|
BString::SetTo(const char* string)
|
||||||
{
|
{
|
||||||
return operator=(string);
|
return operator=(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline char
|
|
||||||
|
inline char
|
||||||
BString::operator[](int32 index) const
|
BString::operator[](int32 index) const
|
||||||
{
|
{
|
||||||
return fPrivateData[index];
|
return fPrivateData[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline char
|
|
||||||
|
inline char
|
||||||
BString::ByteAt(int32 index) const
|
BString::ByteAt(int32 index) const
|
||||||
{
|
{
|
||||||
if (!fPrivateData || index < 0 || index > Length())
|
if (!fPrivateData || index < 0 || index > Length())
|
||||||
@@ -309,6 +324,7 @@ BString::ByteAt(int32 index) const
|
|||||||
return fPrivateData[index];
|
return fPrivateData[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline BString &
|
inline BString &
|
||||||
BString::operator+=(const BString &string)
|
BString::operator+=(const BString &string)
|
||||||
{
|
{
|
||||||
@@ -316,6 +332,7 @@ BString::operator+=(const BString &string)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline BString &
|
inline BString &
|
||||||
BString::Append(const BString &string)
|
BString::Append(const BString &string)
|
||||||
{
|
{
|
||||||
@@ -323,88 +340,125 @@ BString::Append(const BString &string)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline BString &
|
inline BString &
|
||||||
BString::Append(const char *str)
|
BString::Append(const char* string)
|
||||||
{
|
{
|
||||||
return operator+=(str);
|
return operator+=(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
BString::operator==(const BString &string) const
|
BString::operator==(const BString &string) const
|
||||||
{
|
{
|
||||||
return strcmp(String(), string.String()) == 0;
|
return strcmp(String(), string.String()) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
BString::operator<(const BString &string) const
|
BString::operator<(const BString &string) const
|
||||||
{
|
{
|
||||||
return strcmp(String(), string.String()) < 0;
|
return strcmp(String(), string.String()) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
BString::operator<=(const BString &string) const
|
BString::operator<=(const BString &string) const
|
||||||
{
|
{
|
||||||
return strcmp(String(), string.String()) <= 0;
|
return strcmp(String(), string.String()) <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
BString::operator>=(const BString &string) const
|
BString::operator>=(const BString &string) const
|
||||||
{
|
{
|
||||||
return strcmp(String(), string.String()) >= 0;
|
return strcmp(String(), string.String()) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
BString::operator>(const BString &string) const
|
BString::operator>(const BString &string) const
|
||||||
{
|
{
|
||||||
return strcmp(String(), string.String()) > 0;
|
return strcmp(String(), string.String()) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
BString::operator!=(const BString &string) const
|
BString::operator!=(const BString &string) const
|
||||||
{
|
{
|
||||||
return strcmp(String(), string.String()) != 0;
|
return strcmp(String(), string.String()) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
BString::operator!=(const char *str) const
|
inline bool
|
||||||
|
BString::operator!=(const char* string) const
|
||||||
{
|
{
|
||||||
return !operator==(str);
|
return !operator==(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
operator<(const char *str, const BString &string)
|
operator<(const char *str, const BString &string)
|
||||||
{
|
{
|
||||||
return string > str;
|
return string > str;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
operator<=(const char *str, const BString &string)
|
operator<=(const char *str, const BString &string)
|
||||||
{
|
{
|
||||||
return string >= str;
|
return string >= str;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
operator==(const char *str, const BString &string)
|
operator==(const char *str, const BString &string)
|
||||||
{
|
{
|
||||||
return string == str;
|
return string == str;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
operator>(const char *str, const BString &string)
|
operator>(const char *str, const BString &string)
|
||||||
{
|
{
|
||||||
return string < str;
|
return string < str;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
operator>=(const char *str, const BString &string)
|
operator>=(const char *str, const BString &string)
|
||||||
{
|
{
|
||||||
return string <= str;
|
return string <= str;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
|
||||||
|
inline bool
|
||||||
operator!=(const char *str, const BString &string)
|
operator!=(const char *str, const BString &string)
|
||||||
{
|
{
|
||||||
return string != str;
|
return string != str;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __BSTRING__ */
|
|
||||||
|
// #pragma mark - BStringRef
|
||||||
|
|
||||||
|
|
||||||
|
class BStringRef
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BStringRef(BString& string, int32 position);
|
||||||
|
~BStringRef() {}
|
||||||
|
|
||||||
|
operator char() const;
|
||||||
|
|
||||||
|
char* operator&();
|
||||||
|
const char* operator&() const;
|
||||||
|
|
||||||
|
BStringRef& operator=(char c);
|
||||||
|
BStringRef &operator=(const BStringRef &rc);
|
||||||
|
|
||||||
|
private:
|
||||||
|
BString& fString;
|
||||||
|
int32 fPosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __BSTRING__
|
||||||
|
|||||||
+894
-803
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user