⛏️ index : haiku.git

/*
 * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef STRING_H
#define STRING_H


#include "StringPool.h"


class String {
public:
								String();
								String(const String& other);
								~String();

			bool				SetTo(const char* string);
			bool				SetTo(const char* string, size_t maxLength);
			bool				SetToExactLength(const char* string,
									size_t length);

			const char*			Data() const;
			uint32				Hash() const;

			bool				IsEmpty() const;

			String&				operator=(const String& other);

			bool				operator==(const String& other) const;
			bool				operator!=(const String& other) const;

								operator const char*() const;

private:
			StringData*			fData;
};


inline
String::String()
	:
	fData(StringData::GetEmpty())
{
}


inline
String::String(const String& other)
	:
	fData(other.fData)
{
	fData->AcquireReference();
}


inline
String::~String()
{
	fData->ReleaseReference();
}


inline bool
String::SetTo(const char* string)
{
	return SetToExactLength(string, (string == NULL) ? 0 : strlen(string));
}


inline bool
String::SetTo(const char* string, size_t maxLength)
{
	return SetToExactLength(string, strnlen(string, maxLength));
}


inline const char*
String::Data() const
{
	return fData->String();
}


inline uint32
String::Hash() const
{
	return fData->Hash();
}


inline bool
String::IsEmpty() const
{
	return fData == StringData::Empty();
}


inline bool
String::operator==(const String& other) const
{
	return fData == other.fData;
}


inline bool
String::operator!=(const String& other) const
{
	return !(*this == other);
}


inline
String::operator const char*() const
{
	return fData->String();
}


#endif	// STRING_H