source: trunk/src/lol/base/string.h @ 2269

Last change on this file since 2269 was 2269, checked in by sam, 8 years ago

base: optimise array concatenation, fix string concatenation, and fix
string concatenation unit tests.

  • Property svn:keywords set to Id
File size: 3.5 KB
Line 
1//
2// Lol Engine
3//
4// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
5//   This program is free software; you can redistribute it and/or
6//   modify it under the terms of the Do What The Fuck You Want To
7//   Public License, Version 2, as published by Sam Hocevar. See
8//   http://www.wtfpl.net/ for more details.
9//
10
11//
12// The String class
13// ----------------
14// A very simple String class, based on Array.
15//
16
17#if !defined __LOL_BASE_STRING_H__
18#define __LOL_BASE_STRING_H__
19
20#include <lol/base/assert.h>
21#include <lol/base/array.h>
22
23#include <cstring>
24#include <cstdarg>
25
26namespace lol
27{
28
29class String : protected Array<char>
30{
31private:
32    typedef Array<char> Super;
33
34public:
35    inline String()
36      : Super()
37    {
38        Push('\0');
39    }
40
41    inline String(char const *str)
42      : Super()
43    {
44        using namespace std;
45        ASSERT(str);
46        Resize((int)strlen(str));
47        memcpy(&(*this)[0], str, Count() + 1);
48    }
49
50    inline String(char const *str, int count)
51      : Super()
52    {
53        using namespace std;
54        ASSERT(str);
55        Resize(count);
56        memcpy(&(*this)[0], str, count);
57        ((Super &)*this)[count] = '\0';
58    }
59
60    inline String(String const &s)
61      : Super((Super const &)s)
62    {
63    }
64
65    inline char &operator [](int n)
66    {
67        /* Allow n == Count() because we might have reasonable reasons
68         * to access that hidden null character. */
69        ASSERT(n >= 0);
70        ASSERT(n <= Count());
71        return ((Super &)*this)[n];
72    }
73
74    inline char const &operator [](int n) const
75    {
76        ASSERT(n >= 0);
77        ASSERT(n <= Count());
78        return ((Super const &)*this)[n];
79    }
80
81    inline char &Last()
82    {
83        ASSERT(Count() > 0);
84        return (*this)[Count() - 1];
85    }
86
87    inline char const &Last() const
88    {
89        ASSERT(Count() > 0);
90        return (*this)[Count() - 1];
91    }
92
93    inline int Count() const
94    {
95        return ((Super const &)*this).Count() - 1;
96    }
97
98    void Resize(int count)
99    {
100        ASSERT(count >= 0);
101        ((Super &)*this).Resize(count + 1);
102        ((Super &)*this).Last() = '\0';
103    }
104
105    String Sub(int start, int count) const
106    {
107        ASSERT(start >= 0);
108        ASSERT(count >= 0);
109        ASSERT(start + count <= Count());
110        return String(&(*this)[start], count);
111    }
112
113    inline String operator +(String const &s) const
114    {
115        String ret(*this);
116        return ret += s;
117    }
118
119    inline String& operator +=(String const &s)
120    {
121        int old_count = Count();
122        Resize(Count() + s.Count());
123        memcpy(&(*this)[old_count], &s[0], Count() - old_count);
124        return *this;
125    }
126
127    inline String operator +(char c) const
128    {
129        String ret(*this);
130        return ret += c;
131    }
132
133    inline String& operator +=(char c)
134    {
135        ((Super &)*this).Last() = c;
136        ((Super &)*this).Push('\0');
137        return *this;
138    }
139
140    inline bool operator ==(String const &s) const
141    {
142        if (this->m_count != s.m_count)
143            return false;
144
145        for (int i = 0; i < this->m_count; ++i)
146            if ((*this)[i] != s[i])
147                return false;
148
149        return true;
150    }
151
152    inline bool operator !=(String const &s) const
153    {
154        return !(*this == s);
155    }
156
157#ifdef __GNUC__
158#   define LOL_FMT_ATTR(n, p) __attribute__((format(printf, n, p)))
159#else
160#   define LOL_FMT_ATTR(n, p)
161#endif
162    static String Printf(char const *format, ...) LOL_FMT_ATTR(1, 2);
163#undef LOL_FMT_ATTR
164    static String Printf(char const *format, va_list ap);
165};
166
167} /* namespace lol */
168
169#endif // __LOL_BASE_STRING_H__
170
Note: See TracBrowser for help on using the repository browser.