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

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

base: work around an annoying GCC warning we very well know about.

  • Property svn:keywords set to Id
File size: 3.8 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((unsigned)n <= (unsigned)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    /* Return a C string */
99    inline char const *C() const
100    {
101        return &(*this)[0];
102    }
103
104    /* Does not initialise the newly allocated characters */
105    void Resize(int count)
106    {
107        ASSERT(count >= 0);
108        ((Super &)*this).Resize(count + 1);
109        ((Super &)*this).Last() = '\0';
110    }
111
112    String Sub(int start, int count) const
113    {
114        ASSERT(start >= 0);
115        ASSERT(count >= 0);
116        ASSERT(start + count <= Count());
117        return String(&(*this)[start], count);
118    }
119
120    inline String operator +(String const &s) const
121    {
122        String ret(*this);
123        return ret += s;
124    }
125
126    inline String& operator +=(String const &s)
127    {
128        using namespace std;
129        int old_count = Count();
130        Resize(Count() + s.Count());
131        memcpy(&(*this)[old_count], &s[0], Count() - old_count);
132        return *this;
133    }
134
135    inline String operator +(char c) const
136    {
137        String ret(*this);
138        return ret += c;
139    }
140
141    inline String& operator +=(char c)
142    {
143        ((Super &)*this).Last() = c;
144        ((Super &)*this).Push('\0');
145        return *this;
146    }
147
148    inline bool operator ==(String const &s) const
149    {
150        if (this->m_count != s.m_count)
151            return false;
152
153        for (int i = 0; i < this->m_count; ++i)
154            if ((*this)[i] != s[i])
155                return false;
156
157        return true;
158    }
159
160    inline bool operator !=(String const &s) const
161    {
162        return !(*this == s);
163    }
164
165#ifdef __GNUC__
166#   define LOL_FMT_ATTR(n, p) __attribute__((format(printf, n, p)))
167#else
168#   define LOL_FMT_ATTR(n, p)
169#endif
170    static String Printf(char const *format, ...) LOL_FMT_ATTR(1, 2);
171#undef LOL_FMT_ATTR
172    static String Printf(char const *format, va_list ap);
173};
174
175} /* namespace lol */
176
177#endif // __LOL_BASE_STRING_H__
178
Note: See TracBrowser for help on using the repository browser.