1d07c930cSIngo Weinhold/*
2d07c930cSIngo Weinhold * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de.
3d07c930cSIngo Weinhold * Distributed under the terms of the MIT License.
4d07c930cSIngo Weinhold */
5d07c930cSIngo Weinhold#ifndef STRING_H
6d07c930cSIngo Weinhold#define STRING_H
7d07c930cSIngo Weinhold
8d07c930cSIngo Weinhold
9d07c930cSIngo Weinhold#include "StringPool.h"
10d07c930cSIngo Weinhold
11d07c930cSIngo Weinhold
12d07c930cSIngo Weinholdclass String {
13d07c930cSIngo Weinholdpublic:
14d07c930cSIngo Weinhold								String();
15d07c930cSIngo Weinhold								String(const String& other);
16d07c930cSIngo Weinhold								~String();
17d07c930cSIngo Weinhold
18d07c930cSIngo Weinhold			bool				SetTo(const char* string);
19d07c930cSIngo Weinhold			bool				SetTo(const char* string, size_t maxLength);
20d07c930cSIngo Weinhold			bool				SetToExactLength(const char* string,
21d07c930cSIngo Weinhold									size_t length);
22d07c930cSIngo Weinhold
23d07c930cSIngo Weinhold			const char*			Data() const;
24d07c930cSIngo Weinhold			uint32				Hash() const;
25d07c930cSIngo Weinhold
26d07c930cSIngo Weinhold			bool				IsEmpty() const;
27d07c930cSIngo Weinhold
28d07c930cSIngo Weinhold			String&				operator=(const String& other);
29d07c930cSIngo Weinhold
30d07c930cSIngo Weinhold			bool				operator==(const String& other) const;
31d07c930cSIngo Weinhold			bool				operator!=(const String& other) const;
32d07c930cSIngo Weinhold
33d07c930cSIngo Weinhold								operator const char*() const;
34d07c930cSIngo Weinhold
35d07c930cSIngo Weinholdprivate:
36d07c930cSIngo Weinhold			StringData*			fData;
37d07c930cSIngo Weinhold};
38d07c930cSIngo Weinhold
39d07c930cSIngo Weinhold
40d07c930cSIngo Weinholdinline
41d07c930cSIngo WeinholdString::String()
42d07c930cSIngo Weinhold	:
43d07c930cSIngo Weinhold	fData(StringData::GetEmpty())
44d07c930cSIngo Weinhold{
45d07c930cSIngo Weinhold}
46d07c930cSIngo Weinhold
47d07c930cSIngo Weinhold
48d07c930cSIngo Weinholdinline
49d07c930cSIngo WeinholdString::String(const String& other)
50d07c930cSIngo Weinhold	:
51d07c930cSIngo Weinhold	fData(other.fData)
52d07c930cSIngo Weinhold{
53d07c930cSIngo Weinhold	fData->AcquireReference();
54d07c930cSIngo Weinhold}
55d07c930cSIngo Weinhold
56d07c930cSIngo Weinhold
57d07c930cSIngo Weinholdinline
58d07c930cSIngo WeinholdString::~String()
59d07c930cSIngo Weinhold{
60d07c930cSIngo Weinhold	fData->ReleaseReference();
61d07c930cSIngo Weinhold}
62d07c930cSIngo Weinhold
63d07c930cSIngo Weinhold
64d07c930cSIngo Weinholdinline bool
65d07c930cSIngo WeinholdString::SetTo(const char* string)
66d07c930cSIngo Weinhold{
67d07c930cSIngo Weinhold	return SetToExactLength(string, strlen(string));
68d07c930cSIngo Weinhold}
69d07c930cSIngo Weinhold
70d07c930cSIngo Weinhold
71d07c930cSIngo Weinholdinline bool
72d07c930cSIngo WeinholdString::SetTo(const char* string, size_t maxLength)
73d07c930cSIngo Weinhold{
74d07c930cSIngo Weinhold	return SetToExactLength(string, strnlen(string, maxLength));
75d07c930cSIngo Weinhold}
76d07c930cSIngo Weinhold
77d07c930cSIngo Weinhold
78d07c930cSIngo Weinholdinline const char*
79d07c930cSIngo WeinholdString::Data() const
80d07c930cSIngo Weinhold{
81d07c930cSIngo Weinhold	return fData->String();
82d07c930cSIngo Weinhold}
83d07c930cSIngo Weinhold
84d07c930cSIngo Weinhold
85d07c930cSIngo Weinholdinline uint32
86d07c930cSIngo WeinholdString::Hash() const
87d07c930cSIngo Weinhold{
88d07c930cSIngo Weinhold	return fData->Hash();
89d07c930cSIngo Weinhold}
90d07c930cSIngo Weinhold
91d07c930cSIngo Weinhold
92d07c930cSIngo Weinholdinline bool
93d07c930cSIngo WeinholdString::IsEmpty() const
94d07c930cSIngo Weinhold{
95d07c930cSIngo Weinhold	return fData == StringData::Empty();
96d07c930cSIngo Weinhold}
97d07c930cSIngo Weinhold
98d07c930cSIngo Weinhold
99d07c930cSIngo Weinholdinline bool
100d07c930cSIngo WeinholdString::operator==(const String& other) const
101d07c930cSIngo Weinhold{
102d07c930cSIngo Weinhold	return fData == other.fData;
103d07c930cSIngo Weinhold}
104d07c930cSIngo Weinhold
105d07c930cSIngo Weinhold
106d07c930cSIngo Weinholdinline bool
107d07c930cSIngo WeinholdString::operator!=(const String& other) const
108d07c930cSIngo Weinhold{
109d07c930cSIngo Weinhold	return !(*this == other);
110d07c930cSIngo Weinhold}
111d07c930cSIngo Weinhold
112d07c930cSIngo Weinhold
113d07c930cSIngo Weinholdinline
114d07c930cSIngo WeinholdString::operator const char*() const
115d07c930cSIngo Weinhold{
116d07c930cSIngo Weinhold	return fData->String();
117d07c930cSIngo Weinhold}
118d07c930cSIngo Weinhold
119d07c930cSIngo Weinhold
120d07c930cSIngo Weinhold#endif	// STRING_H
121