BStringList: Add Join()
This commit is contained in:
@@ -50,6 +50,8 @@ public:
|
|||||||
int32 CountStrings() const;
|
int32 CountStrings() const;
|
||||||
bool IsEmpty() const;
|
bool IsEmpty() const;
|
||||||
|
|
||||||
|
BString Join(const char* separator, int32 length = -1);
|
||||||
|
|
||||||
// Iteration
|
// Iteration
|
||||||
void DoForEach(bool (*func)(const BString& string));
|
void DoForEach(bool (*func)(const BString& string));
|
||||||
void DoForEach(bool (*func)(const BString& string,
|
void DoForEach(bool (*func)(const BString& string,
|
||||||
@@ -63,6 +65,8 @@ private:
|
|||||||
void _IncrementRefCounts() const;
|
void _IncrementRefCounts() const;
|
||||||
void _DecrementRefCounts() const;
|
void _DecrementRefCounts() const;
|
||||||
|
|
||||||
|
BString _Join(const char* separator, int32 length);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BList fStrings;
|
BList fStrings;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -260,6 +260,14 @@ BStringList::IsEmpty() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BString
|
||||||
|
BStringList::Join(const char* separator, int32 length)
|
||||||
|
{
|
||||||
|
return _Join(separator,
|
||||||
|
length >= 0 ? strnlen(separator, length) : strlen(separator));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BStringList::DoForEach(bool (*func)(const BString& string))
|
BStringList::DoForEach(bool (*func)(const BString& string))
|
||||||
{
|
{
|
||||||
@@ -328,3 +336,39 @@ BStringList::_DecrementRefCounts() const
|
|||||||
for (int32 i = 0; i < count; i++)
|
for (int32 i = 0; i < count; i++)
|
||||||
BString::Private::DecrementDataRefCount((char*)fStrings.ItemAt(i));
|
BString::Private::DecrementDataRefCount((char*)fStrings.ItemAt(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BString
|
||||||
|
BStringList::_Join(const char* separator, int32 length)
|
||||||
|
{
|
||||||
|
// handle simple cases (0 or 1 element)
|
||||||
|
int32 count = CountStrings();
|
||||||
|
if (count == 0)
|
||||||
|
return BString();
|
||||||
|
if (count == 1)
|
||||||
|
return StringAt(0);
|
||||||
|
|
||||||
|
// determine the total length
|
||||||
|
int32 totalLength = length * (count - 1);
|
||||||
|
for (int32 i = 0; i < count; i++)
|
||||||
|
totalLength += StringAt(i).Length();
|
||||||
|
|
||||||
|
// compose the result string
|
||||||
|
BString result;
|
||||||
|
char* buffer = result.LockBuffer(totalLength);
|
||||||
|
if (buffer == NULL)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
for (int32 i = 0; i < count; i++) {
|
||||||
|
if (i > 0 && length > 0) {
|
||||||
|
memcpy(buffer, separator, length);
|
||||||
|
buffer += length;
|
||||||
|
}
|
||||||
|
|
||||||
|
BString string = StringAt(i);
|
||||||
|
memcpy(buffer, string.String(), string.Length());
|
||||||
|
buffer += string.Length();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.UnlockBuffer(totalLength);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user