added string-pooling for shader variable names and entity keys

git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@26 8a3a26a2-13c4-0310-b231-cf6edde360e5
This commit is contained in:
spog
2006-02-26 22:27:38 +00:00
parent 24230bb3a8
commit d584d94549
27 changed files with 159 additions and 111 deletions

View File

@@ -30,6 +30,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <algorithm>
#include "memory/allocator.h"
#include "generic/arrayrange.h"
/// \brief Returns true if \p string length is zero.
/// O(1)
@@ -191,10 +192,10 @@ inline char* string_clone(const char* other, Allocator& allocator)
/// \brief Returns a newly-allocated string which is a clone of [\p first, \p last), using \p allocator.
/// The returned buffer must be released with \c string_release using a matching \p allocator.
template<typename Allocator>
inline char* string_clone_range(const char* first, const char* last, Allocator& allocator)
inline char* string_clone_range(StringRange range, Allocator& allocator)
{
std::size_t length = last - first;
char* copied = strncpy(string_new(length, allocator), first, length);
std::size_t length = range.last - range.first;
char* copied = strncpy(string_new(length, allocator), range.first, length);
copied[length] = '\0';
return copied;
}
@@ -224,10 +225,10 @@ inline char* string_clone(const char* other)
/// \brief Returns a newly-allocated string which is a clone of [\p first, \p last).
/// The returned buffer must be released with \c string_release.
inline char* string_clone_range(const char* first, const char* last)
inline char* string_clone_range(StringRange range)
{
DefaultAllocator<char> allocator;
return string_clone_range(first, last, allocator);
return string_clone_range(range, allocator);
}
typedef char* char_pointer;
@@ -343,8 +344,8 @@ public:
: Buffer(string)
{
}
String(const char* first, const char* last)
: Buffer(first, last)
String(StringRange range)
: Buffer(range)
{
}
@@ -360,6 +361,12 @@ public:
temp.swap(*this);
return *this;
}
String& operator=(StringRange range)
{
String temp(range);
temp.swap(*this);
return *this;
}
void swap(String& other)
{
@@ -426,9 +433,9 @@ class CopiedBuffer : private Allocator
{
char* m_string;
char* copy_range(const char* first, const char* last)
char* copy_range(StringRange range)
{
return string_clone_range(first, last, static_cast<Allocator&>(*this));
return string_clone_range(range, static_cast<Allocator&>(*this));
}
char* copy(const char* other)
{
@@ -461,8 +468,8 @@ public:
: Allocator(allocator), m_string(copy(string))
{
}
CopiedBuffer(const char* first, const char* last, const Allocator& allocator = Allocator())
: Allocator(allocator), m_string(copy_range(first, last))
CopiedBuffer(StringRange range, const Allocator& allocator = Allocator())
: Allocator(allocator), m_string(copy_range(range))
{
}
const char* c_str() const
@@ -485,11 +492,11 @@ class SmartBuffer : private Allocator
{
char* m_buffer;
char* copy_range(const char* first, const char* last)
char* copy_range(StringRange range)
{
char* buffer = Allocator::allocate(sizeof(std::size_t) + (last - first) + 1);
strncpy(buffer + sizeof(std::size_t), first, last - first);
buffer[sizeof(std::size_t) + (last - first)] = '\0';
char* buffer = Allocator::allocate(sizeof(std::size_t) + (range.last - range.first) + 1);
strncpy(buffer + sizeof(std::size_t), range.first, range.last - range.first);
buffer[sizeof(std::size_t) + (range.last - range.first)] = '\0';
*reinterpret_cast<std::size_t*>(buffer) = 0;
return buffer;
}
@@ -541,8 +548,8 @@ public:
{
incref(m_buffer);
}
SmartBuffer(const char* first, const char* last, const Allocator& allocator = Allocator())
: Allocator(allocator), m_buffer(copy_range(first, last))
SmartBuffer(StringRange range, const Allocator& allocator = Allocator())
: Allocator(allocator), m_buffer(copy_range(range))
{
incref(m_buffer);
}