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

Last change on this file since 2270 was 2270, checked in by sam, 7 years ago

base: add missing local using statement for namespace std.

  • Property svn:keywords set to Id
File size: 3.6 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        using namespace std;
122        int old_count = Count();
123        Resize(Count() + s.Count());
124        memcpy(&(*this)[old_count], &s[0], Count() - old_count);
125        return *this;
126    }
127
128    inline String operator +(char c) const
129    {
130        String ret(*this);
131        return ret += c;
132    }
133
134    inline String& operator +=(char c)
135    {
136        ((Super &)*this).Last() = c;
137        ((Super &)*this).Push('\0');
138        return *this;
139    }
140
141    inline bool operator ==(String const &s) const
142    {
143        if (this->m_count != s.m_count)
144            return false;
145
146        for (int i = 0; i < this->m_count; ++i)
147            if ((*this)[i] != s[i])
148                return false;
149
150        return true;
151    }
152
153    inline bool operator !=(String const &s) const
154    {
155        return !(*this == s);
156    }
157
158#ifdef __GNUC__
159#   define LOL_FMT_ATTR(n, p) __attribute__((format(printf, n, p)))
160#else
161#   define LOL_FMT_ATTR(n, p)
162#endif
163    static String Printf(char const *format, ...) LOL_FMT_ATTR(1, 2);
164#undef LOL_FMT_ATTR
165    static String Printf(char const *format, va_list ap);
166};
167
168} /* namespace lol */
169
170#endif // __LOL_BASE_STRING_H__
171
Note: See TracBrowser for help on using the repository browser.