| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // This library is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| @@ -51,11 +53,11 @@ String String::VPrintf(char const *format, va_list ap) | |||
| size_t needed = vsnprintf(nullptr, 0, format, ap2) + 1; | |||
| #if defined va_copy || !defined _MSC_VER | |||
| /* do not call va_end() if va_copy() wasn’t called. */ | |||
| /* do not call va_end() if va_copy() wasn't called. */ | |||
| va_end(ap2); | |||
| #endif | |||
| ((Super &)ret).Reserve(needed); | |||
| ((super &)ret).reserve(needed); | |||
| ret.m_count = needed; | |||
| vsnprintf(&ret[0], needed, format, ap); | |||
| @@ -54,7 +54,7 @@ public: | |||
| m_count(0), | |||
| m_reserved(0) | |||
| { | |||
| Reserve(list.size()); | |||
| reserve(list.size()); | |||
| for (auto elem : list) | |||
| push(elem); | |||
| } | |||
| @@ -70,7 +70,7 @@ public: | |||
| { | |||
| /* Reserve the exact number of values instead of what the other | |||
| * array had reserved. Just a method for not wasting too much. */ | |||
| Reserve(that.m_count); | |||
| reserve(that.m_count); | |||
| for (ptrdiff_t i = 0; i < that.m_count; i++) | |||
| new(&m_data[i]) element_t(that[i]); | |||
| m_count = that.m_count; | |||
| @@ -88,7 +88,7 @@ public: | |||
| /* If not enough space, reserve memory, overwrite the first | |||
| * elements, then use placement new directly for the | |||
| * remaining elements. */ | |||
| Reserve(that.m_count); | |||
| reserve(that.m_count); | |||
| for (ptrdiff_t i = 0; i < m_count && i < that.m_count; i++) | |||
| m_data[i] = element_t(that[i]); | |||
| for (ptrdiff_t i = m_count; i < that.m_count; i++) | |||
| @@ -115,7 +115,7 @@ public: | |||
| array_base& operator+=(array_base const &that) | |||
| { | |||
| ptrdiff_t todo = that.m_count; | |||
| Reserve(m_count + todo); | |||
| reserve(m_count + todo); | |||
| for (ptrdiff_t i = 0; i < todo; i++) | |||
| new(&m_data[m_count + i]) element_t(that[i]); | |||
| m_count += todo; | |||
| @@ -125,7 +125,7 @@ public: | |||
| ARRAY operator+(ARRAY const &that) const | |||
| { | |||
| ARRAY ret; | |||
| ret.Reserve(m_count + that.m_count); | |||
| ret.reserve(m_count + that.m_count); | |||
| ret += *this; | |||
| ret += that; | |||
| return ret; | |||
| @@ -149,23 +149,23 @@ public: | |||
| return m_data[n]; | |||
| } | |||
| inline element_t& Last() | |||
| inline element_t& last() | |||
| { | |||
| ASSERT(m_count > 0); | |||
| return m_data[m_count - 1]; | |||
| } | |||
| inline element_t *Data() | |||
| inline element_t *data() | |||
| { | |||
| return m_data; | |||
| } | |||
| inline element_t const *Data() const | |||
| inline element_t const *data() const | |||
| { | |||
| return m_data; | |||
| } | |||
| inline element_t const& Last() const | |||
| inline element_t const& last() const | |||
| { | |||
| ASSERT(m_count > 0); | |||
| return m_data[m_count - 1]; | |||
| @@ -176,7 +176,7 @@ public: | |||
| if (m_count >= m_reserved) | |||
| { | |||
| T tmp = x; | |||
| Grow(); | |||
| grow(); | |||
| new (&m_data[m_count]) element_t(tmp); | |||
| } | |||
| else | |||
| @@ -189,7 +189,7 @@ public: | |||
| inline array_base& operator>>(T const &x) | |||
| { | |||
| RemoveItem(x); | |||
| remove_item(x); | |||
| return *this; | |||
| } | |||
| @@ -200,21 +200,21 @@ public: | |||
| inline bool push_unique(T const &x) | |||
| { | |||
| if (Find(x) != INDEX_NONE) | |||
| if (find(x) != INDEX_NONE) | |||
| return false; | |||
| push(x); | |||
| return true; | |||
| } | |||
| inline void Insert(T const &x, ptrdiff_t pos) | |||
| inline void insert(T const &x, ptrdiff_t pos) | |||
| { | |||
| ASSERT(pos >= 0 && pos <= m_count, | |||
| "cannot insert at index %lld in array of size %lld", | |||
| (long long int)pos, (long long int)m_count); | |||
| if (m_count >= m_reserved) | |||
| Grow(); | |||
| grow(); | |||
| for (ptrdiff_t i = m_count; i > pos; --i) | |||
| { | |||
| @@ -225,20 +225,20 @@ public: | |||
| ++m_count; | |||
| } | |||
| inline bool InsertUnique(T const &x, ptrdiff_t pos) | |||
| inline bool insert_unique(T const &x, ptrdiff_t pos) | |||
| { | |||
| ASSERT(pos >= 0 && pos <= m_count, | |||
| "cannot insert at index %lld in array of size %lld", | |||
| (long long int)pos, (long long int)m_count); | |||
| if (Find(x) != INDEX_NONE) | |||
| if (find(x) != INDEX_NONE) | |||
| return false; | |||
| Insert(x, pos); | |||
| insert(x, pos); | |||
| return true; | |||
| } | |||
| inline ptrdiff_t Find(T const &x) | |||
| inline ptrdiff_t find(T const &x) | |||
| { | |||
| for (ptrdiff_t i = 0; i < m_count; ++i) | |||
| if (m_data[i] == x) | |||
| @@ -246,9 +246,9 @@ public: | |||
| return INDEX_NONE; | |||
| } | |||
| bool RemoveItem(T const &x) | |||
| bool remove_item(T const &x) | |||
| { | |||
| ptrdiff_t idx = Find(x); | |||
| ptrdiff_t idx = find(x); | |||
| if (idx != INDEX_NONE) | |||
| { | |||
| remove(idx); | |||
| @@ -259,7 +259,7 @@ public: | |||
| bool RemoveSwapItem(T const &x) | |||
| { | |||
| ptrdiff_t idx = Find(x); | |||
| ptrdiff_t idx = find(x); | |||
| if (idx != INDEX_NONE) | |||
| { | |||
| RemoveSwap(idx); | |||
| @@ -270,8 +270,8 @@ public: | |||
| bool SwapItem(T const &x1, T const &x2) | |||
| { | |||
| ptrdiff_t idx1 = Find(x1); | |||
| ptrdiff_t idx2 = Find(x2); | |||
| ptrdiff_t idx1 = find(x1); | |||
| ptrdiff_t idx2 = find(x2); | |||
| if (idx1 != INDEX_NONE && idx2 != INDEX_NONE) | |||
| { | |||
| swap(idx1, idx2); | |||
| @@ -283,7 +283,7 @@ public: | |||
| inline T pop() | |||
| { | |||
| ASSERT(m_count > 0); | |||
| element_t tmp = Last(); | |||
| element_t tmp = last(); | |||
| remove(m_count - 1, 1); | |||
| return tmp; | |||
| } | |||
| @@ -339,20 +339,20 @@ public: | |||
| m_count -= todelete; | |||
| } | |||
| void Resize(ptrdiff_t count, element_t e = element_t()) | |||
| void resize(ptrdiff_t item_count, element_t e = element_t()) | |||
| { | |||
| ASSERT(count >= 0); | |||
| Reserve(count); | |||
| ASSERT(item_count >= 0); | |||
| reserve(item_count); | |||
| /* Too many elements? Remove them. */ | |||
| for (ptrdiff_t i = count; i < m_count; ++i) | |||
| for (ptrdiff_t i = item_count; i < m_count; ++i) | |||
| m_data[i].~element_t(); | |||
| /* Not enough elements? Add some. */ | |||
| for (ptrdiff_t i = m_count; i < count; ++i) | |||
| for (ptrdiff_t i = m_count; i < item_count; ++i) | |||
| new(&m_data[i]) element_t(e); | |||
| m_count = count; | |||
| m_count = item_count; | |||
| } | |||
| inline void empty() | |||
| @@ -360,7 +360,7 @@ public: | |||
| remove(0, m_count); | |||
| } | |||
| void Reserve(ptrdiff_t toreserve) | |||
| void reserve(ptrdiff_t toreserve) | |||
| { | |||
| if (toreserve <= m_reserved) | |||
| return; | |||
| @@ -393,6 +393,18 @@ public: | |||
| inline void Swap(ptrdiff_t pos1, ptrdiff_t pos2) { return swap(pos1, pos2); } | |||
| inline void Remove(ptrdiff_t pos, ptrdiff_t todelete = 1) { return remove(pos, todelete); } | |||
| inline void Empty() { empty(); } | |||
| inline element_t& Last() { return last(); } | |||
| inline element_t *Data() { return data(); } | |||
| inline element_t const *Data() const { return data(); } | |||
| inline element_t const& Last() const { return last(); } | |||
| inline void Insert(T const &x, ptrdiff_t pos) { return insert(x, pos); } | |||
| inline bool InsertUnique(T const &x, ptrdiff_t pos) { return insert_unique(x, pos); } | |||
| inline ptrdiff_t Find(T const &x) { return find(x); } | |||
| inline bool RemoveItem(T const &x) { return remove_item(x); } | |||
| inline void Resize(ptrdiff_t item_count, element_t e = element_t()) { return resize(item_count, e); } | |||
| inline void Reserve(ptrdiff_t toreserve) { return reserve(toreserve); } | |||
| inline ptrdiff_t Count() const { return count(); } | |||
| inline ptrdiff_t Bytes() const { return bytes(); } | |||
| /* Support C++11 range-based for loops */ | |||
| class ConstIterator | |||
| @@ -454,13 +466,13 @@ public: | |||
| }; | |||
| public: | |||
| inline ptrdiff_t Count() const { return m_count; } | |||
| inline ptrdiff_t Bytes() const { return m_count * sizeof(element_t); } | |||
| inline ptrdiff_t count() const { return m_count; } | |||
| inline ptrdiff_t bytes() const { return m_count * sizeof(element_t); } | |||
| protected: | |||
| void Grow() | |||
| void grow() | |||
| { | |||
| Reserve(m_count * 13 / 8 + 8); | |||
| reserve(m_count * 13 / 8 + 8); | |||
| } | |||
| element_t *m_data; | |||
| @@ -495,7 +507,7 @@ public: | |||
| if (this->m_count >= this->m_reserved) | |||
| { | |||
| tuple<T...> tmp = { args... }; | |||
| this->Grow(); | |||
| this->grow(); | |||
| new (&this->m_data[this->m_count].m1) tuple<T...>(tmp); | |||
| } | |||
| else | |||
| @@ -512,7 +524,7 @@ public: | |||
| (long long int)pos, (long long int)this->m_count); | |||
| if (this->m_count >= this->m_reserved) | |||
| this->Grow(); | |||
| this->grow(); | |||
| for (ptrdiff_t i = this->m_count; i > pos; --i) | |||
| { | |||
| @@ -561,7 +573,7 @@ typename array<T...>::Iterator begin(array<T...> &a) | |||
| template<typename... T> | |||
| typename array<T...>::Iterator end(array<T...> &a) | |||
| { | |||
| return typename array<T...>::Iterator(&a, a.Count()); | |||
| return typename array<T...>::Iterator(&a, a.count()); | |||
| } | |||
| template<typename... T> | |||
| @@ -573,7 +585,7 @@ typename array<T...>::ConstIterator begin(array<T...> const &a) | |||
| template<typename... T> | |||
| typename array<T...>::ConstIterator end(array<T...> const &a) | |||
| { | |||
| return typename array<T...>::ConstIterator(&a, a.Count()); | |||
| return typename array<T...>::ConstIterator(&a, a.count()); | |||
| } | |||
| /* | |||
| @@ -1,11 +1,14 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
| // © 2013—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
| // | |||
| // This library is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| @@ -28,70 +31,70 @@ namespace lol | |||
| class String : protected array<char> | |||
| { | |||
| private: | |||
| typedef array<char> Super; | |||
| typedef array<char> super; | |||
| public: | |||
| inline String() | |||
| : Super() | |||
| : super() | |||
| { | |||
| Push('\0'); | |||
| push('\0'); | |||
| } | |||
| inline String(char const *str) | |||
| : Super() | |||
| : super() | |||
| { | |||
| using namespace std; | |||
| ASSERT(str); | |||
| Resize(strlen(str)); | |||
| memcpy(&(*this)[0], str, Count() + 1); | |||
| resize(strlen(str)); | |||
| memcpy(&(*this)[0], str, count() + 1); | |||
| } | |||
| inline String(char const *str, ptrdiff_t count) | |||
| : Super() | |||
| inline String(char const *str, ptrdiff_t item_count) | |||
| : super() | |||
| { | |||
| using namespace std; | |||
| ASSERT(str); | |||
| Resize(count); | |||
| memcpy(&(*this)[0], str, count); | |||
| ((Super &)*this)[count] = '\0'; | |||
| resize(item_count); | |||
| memcpy(&(*this)[0], str, item_count); | |||
| ((super &)*this)[item_count] = '\0'; | |||
| } | |||
| inline String(String const &s) | |||
| : Super((Super const &)s) | |||
| : super((super const &)s) | |||
| { | |||
| } | |||
| inline char &operator [](ptrdiff_t n) | |||
| { | |||
| /* Allow n == Count() because we might have reasonable reasons | |||
| /* Allow n == count() because we might have reasonable reasons | |||
| * to access that hidden null character. */ | |||
| ASSERT(n >= 0); | |||
| ASSERT(n <= Count()); | |||
| return ((Super &)*this)[n]; | |||
| ASSERT(n <= count()); | |||
| return ((super &)*this)[n]; | |||
| } | |||
| inline char const &operator [](ptrdiff_t n) const | |||
| { | |||
| ASSERT(n >= 0); | |||
| ASSERT(n <= Count()); | |||
| return ((Super const &)*this)[n]; | |||
| ASSERT(n <= count()); | |||
| return ((super const &)*this)[n]; | |||
| } | |||
| inline char &Last() | |||
| inline char &last() | |||
| { | |||
| ASSERT(Count() > 0); | |||
| return (*this)[Count() - 1]; | |||
| ASSERT(count() > 0); | |||
| return (*this)[count() - 1]; | |||
| } | |||
| inline char const &Last() const | |||
| inline char const &last() const | |||
| { | |||
| ASSERT(Count() > 0); | |||
| return (*this)[Count() - 1]; | |||
| ASSERT(count() > 0); | |||
| return (*this)[count() - 1]; | |||
| } | |||
| inline ptrdiff_t Count() const | |||
| inline ptrdiff_t count() const | |||
| { | |||
| return ((Super const &)*this).Count() - 1; | |||
| return ((super const &)*this).count() - 1; | |||
| } | |||
| /* Return a C string */ | |||
| @@ -107,24 +110,24 @@ public: | |||
| } | |||
| /* Does not initialise the newly allocated characters */ | |||
| void Resize(ptrdiff_t count) | |||
| void resize(ptrdiff_t item_count) | |||
| { | |||
| ASSERT(count >= 0); | |||
| ((Super &)*this).Resize(count + 1); | |||
| ((Super &)*this).Last() = '\0'; | |||
| ASSERT(item_count >= 0); | |||
| ((super &)*this).resize(item_count + 1); | |||
| ((super &)*this).last() = '\0'; | |||
| } | |||
| String Sub(ptrdiff_t start, ptrdiff_t count = -1) const | |||
| String sub(ptrdiff_t start, ptrdiff_t item_count = -1) const | |||
| { | |||
| ASSERT(start >= 0); | |||
| if (start >= Count()) | |||
| if (start >= count()) | |||
| return String(); | |||
| if (count < 0 || count >= Count() - start) | |||
| count = Count() - start; | |||
| return String(&(*this)[start], count); | |||
| if (item_count < 0 || item_count >= count() - start) | |||
| item_count = count() - start; | |||
| return String(&(*this)[start], item_count); | |||
| } | |||
| ptrdiff_t IndexOf(char token) const | |||
| ptrdiff_t index_of(char token) const | |||
| { | |||
| using namespace std; | |||
| @@ -132,7 +135,7 @@ public: | |||
| return tmp ? (ptrdiff_t)(tmp - C()) : INDEX_NONE; | |||
| } | |||
| ptrdiff_t IndexOf(char const* token) const | |||
| ptrdiff_t index_of(char const* token) const | |||
| { | |||
| using namespace std; | |||
| @@ -140,12 +143,12 @@ public: | |||
| return tmp ? (ptrdiff_t)(tmp - C()) : INDEX_NONE; | |||
| } | |||
| bool Contains(String const &s) const | |||
| bool contains(String const &s) const | |||
| { | |||
| return IndexOf(s.C()) != INDEX_NONE; | |||
| return index_of(s.C()) != INDEX_NONE; | |||
| } | |||
| ptrdiff_t LastIndexOf(char token) const | |||
| ptrdiff_t last_index_of(char token) const | |||
| { | |||
| using namespace std; | |||
| @@ -153,7 +156,7 @@ public: | |||
| return tmp ? (ptrdiff_t)(tmp - C()) : INDEX_NONE; | |||
| } | |||
| int Replace(char const old_token, char const new_token, | |||
| int replace(char const old_token, char const new_token, | |||
| bool all_occurrences = false) | |||
| { | |||
| using namespace std; | |||
| @@ -170,50 +173,51 @@ public: | |||
| return res; | |||
| } | |||
| inline String& ToLower() | |||
| /* FIXME: it doesn't sound safe to apply this in place */ | |||
| inline String& to_lower() | |||
| { | |||
| char* p = C(); | |||
| for (ptrdiff_t i = 0; i < Count(); ++i) | |||
| for (ptrdiff_t i = 0; i < count(); ++i) | |||
| if ('A' <= p[i] && p[i] <= 'Z') | |||
| p[i] += 'a' - 'A'; | |||
| return *this; | |||
| } | |||
| inline String& ToUpper() | |||
| inline String& to_upper() | |||
| { | |||
| char* p = C(); | |||
| for (ptrdiff_t i = 0; i < Count(); ++i) | |||
| for (ptrdiff_t i = 0; i < count(); ++i) | |||
| if ('a' <= p[i] && p[i] <= 'z') | |||
| p[i] += 'A' - 'a'; | |||
| return *this; | |||
| } | |||
| ptrdiff_t LastIndexOf(char const* token) const | |||
| ptrdiff_t last_index_of(char const* token) const | |||
| { | |||
| using namespace std; | |||
| ptrdiff_t token_len = strlen(token); | |||
| for (ptrdiff_t i = Count() - token_len; i >= 0; --i) | |||
| for (ptrdiff_t i = count() - token_len; i >= 0; --i) | |||
| if (strstr(C() + i, token)) | |||
| return i; | |||
| return -1; | |||
| } | |||
| bool StartsWith(String const &s) const | |||
| bool starts_with(String const &s) const | |||
| { | |||
| using namespace std; | |||
| return Count() >= s.Count() | |||
| && memcmp(C(), s.C(), s.Count()) == 0; | |||
| return count() >= s.count() | |||
| && memcmp(C(), s.C(), s.count()) == 0; | |||
| } | |||
| bool EndsWith(String const &s) const | |||
| bool ends_with(String const &s) const | |||
| { | |||
| using namespace std; | |||
| return Count() >= s.Count() | |||
| && memcmp(C() + Count() - s.Count(), s.C(), s.Count()) == 0; | |||
| return count() >= s.count() | |||
| && memcmp(C() + count() - s.count(), s.C(), s.count()) == 0; | |||
| } | |||
| bool IsAlpha() | |||
| bool is_alpha() const | |||
| { | |||
| for (ptrdiff_t i = 0; i < m_count; i++) | |||
| if (m_data[i] != '\0' && (m_data[i] < '0' || '9' < m_data[i])) | |||
| @@ -230,9 +234,9 @@ public: | |||
| inline String& operator +=(String const &s) | |||
| { | |||
| using namespace std; | |||
| ptrdiff_t old_count = Count(); | |||
| Resize(Count() + s.Count()); | |||
| memcpy(&(*this)[old_count], &s[0], Count() - old_count); | |||
| ptrdiff_t old_count = count(); | |||
| resize(count() + s.count()); | |||
| memcpy(&(*this)[old_count], &s[0], count() - old_count); | |||
| return *this; | |||
| } | |||
| @@ -244,16 +248,16 @@ public: | |||
| inline String& operator +=(char c) | |||
| { | |||
| ((Super &)*this).Last() = c; | |||
| ((Super &)*this).Push('\0'); | |||
| ((super &)*this).last() = c; | |||
| ((super &)*this).push('\0'); | |||
| return *this; | |||
| } | |||
| inline bool operator ==(String const &s) const | |||
| { | |||
| using namespace std; | |||
| return Count() == s.Count() | |||
| && memcmp(C(), s.C(), Count()) == 0; | |||
| return count() == s.count() | |||
| && memcmp(C(), s.C(), count()) == 0; | |||
| } | |||
| inline bool operator !=(String const &s) const | |||
| @@ -267,7 +271,7 @@ public: | |||
| * but it's probably still faster than doing it by hand. */ | |||
| using namespace std; | |||
| ptrdiff_t sz_len = strlen(sz); | |||
| return Count() == sz_len | |||
| return count() == sz_len | |||
| && memcmp(C(), sz, sz_len) == 0; | |||
| } | |||
| @@ -279,10 +283,10 @@ public: | |||
| inline bool operator <(String const & s) const | |||
| { | |||
| using namespace std; | |||
| int res = memcmp(C(), s.C(), Count() < s.Count() ? Count() : s.Count()); | |||
| int res = memcmp(C(), s.C(), count() < s.count() ? count() : s.count()); | |||
| if (!res) | |||
| return Count() < s.Count(); | |||
| return count() < s.count(); | |||
| return res < 0; | |||
| } | |||
| @@ -295,6 +299,23 @@ public: | |||
| static String Printf(char const *format, ...) LOL_FMT_ATTR(1, 2); | |||
| #undef LOL_FMT_ATTR | |||
| static String VPrintf(char const *format, va_list ap); | |||
| /* TODO: remove these legacy functions one day */ | |||
| inline char &Last() { return last(); } | |||
| inline char const &Last() const { return last(); } | |||
| inline void Resize(ptrdiff_t item_count) { return resize(item_count); } | |||
| inline String& ToLower() { return to_lower(); } | |||
| inline String& ToUpper() { return to_upper(); } | |||
| inline String Sub(ptrdiff_t start, ptrdiff_t item_count = -1) const { return sub(start, item_count); } | |||
| inline bool Contains(String const &s) const { return contains(s); } | |||
| inline ptrdiff_t IndexOf(char token) const { return index_of(token); } | |||
| inline ptrdiff_t IndexOf(char const* token) const { return index_of(token); } | |||
| inline ptrdiff_t LastIndexOf(char token) const { return last_index_of(token); } | |||
| inline int Replace(char const old_token, char const new_token, bool all_occurrences = false) { return replace(old_token, new_token, all_occurrences); } | |||
| inline bool EndsWith(String const &s) const { return ends_with(s); } | |||
| inline bool IsAlpha() const { return is_alpha(); } | |||
| inline bool StartsWith(String const &s) const { return starts_with(s); } | |||
| inline ptrdiff_t Count() const { return count(); } | |||
| }; | |||
| inline bool operator ==(char const* sz, String const &s) | |||
| @@ -1,11 +1,14 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
| // © 2014—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
| // | |||
| // This program is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| @@ -15,34 +18,34 @@ | |||
| namespace lol | |||
| { | |||
| lolunit_declare_fixture(StringTest) | |||
| lolunit_declare_fixture(string_test) | |||
| { | |||
| void SetUp() {} | |||
| void TearDown() {} | |||
| lolunit_declare_test(StringBuild) | |||
| lolunit_declare_test(string_build) | |||
| { | |||
| String s1; | |||
| lolunit_assert_equal(s1.Count(), 0); | |||
| lolunit_assert_equal(s1.count(), 0); | |||
| lolunit_assert_equal(s1[0], '\0'); | |||
| String s2(""); | |||
| lolunit_assert_equal(s2.Count(), 0); | |||
| lolunit_assert_equal(s2.count(), 0); | |||
| lolunit_assert_equal(s2[0], '\0'); | |||
| String s3("a"); | |||
| lolunit_assert_equal(s3.Count(), 1); | |||
| lolunit_assert_equal(s3.count(), 1); | |||
| lolunit_assert_equal(s3[0], 'a'); | |||
| lolunit_assert_equal(s3[1], '\0'); | |||
| String s4(s3); | |||
| lolunit_assert_equal(s4.Count(), 1); | |||
| lolunit_assert_equal(s4.count(), 1); | |||
| lolunit_assert_equal(s4[0], 'a'); | |||
| lolunit_assert_equal(s4[1], '\0'); | |||
| } | |||
| lolunit_declare_test(StringAppendChar) | |||
| lolunit_declare_test(string_append_char) | |||
| { | |||
| String s; | |||
| s += 'a'; | |||
| @@ -55,7 +58,7 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert_equal(s[3], '\0'); | |||
| } | |||
| lolunit_declare_test(StringCopy) | |||
| lolunit_declare_test(string_copy) | |||
| { | |||
| String s1 = "abc"; | |||
| @@ -67,7 +70,7 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert_equal(s1[3], s2[3]); | |||
| } | |||
| lolunit_declare_test(StringConcat) | |||
| lolunit_declare_test(string_concat) | |||
| { | |||
| String s1("ab"), s2("cd"); | |||
| @@ -79,12 +82,12 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert_equal(s3[4], '\0'); | |||
| } | |||
| lolunit_declare_test(StringAppendString) | |||
| lolunit_declare_test(string_append_string) | |||
| { | |||
| String s1("ab"), s2("cd"); | |||
| s1 += s2; | |||
| lolunit_assert_equal(s1.Count(), 4); | |||
| lolunit_assert_equal(s1.count(), 4); | |||
| lolunit_assert_equal(s1[0], 'a'); | |||
| lolunit_assert_equal(s1[1], 'b'); | |||
| lolunit_assert_equal(s1[2], 'c'); | |||
| @@ -92,7 +95,7 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert_equal(s1[4], '\0'); | |||
| s2 += s2; | |||
| lolunit_assert_equal(s2.Count(), 4); | |||
| lolunit_assert_equal(s2.count(), 4); | |||
| lolunit_assert_equal(s2[0], 'c'); | |||
| lolunit_assert_equal(s2[1], 'd'); | |||
| lolunit_assert_equal(s2[2], 'c'); | |||
| @@ -100,7 +103,7 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert_equal(s2[4], '\0'); | |||
| } | |||
| lolunit_declare_test(StringEqual) | |||
| lolunit_declare_test(string_equal) | |||
| { | |||
| String s1("abc"); | |||
| String s2("abc"); | |||
| @@ -110,7 +113,7 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert(!(s1 == s3)); | |||
| } | |||
| lolunit_declare_test(StringDifferent) | |||
| lolunit_declare_test(string_different) | |||
| { | |||
| String s1("abc"); | |||
| String s2("ab"); | |||
| @@ -120,7 +123,7 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert(!(s1 != s3)); | |||
| } | |||
| lolunit_declare_test(StringCharsEqual) | |||
| lolunit_declare_test(string_chars_equal) | |||
| { | |||
| char const* sz = "abc"; | |||
| String s1("abc"); | |||
| @@ -132,7 +135,7 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert(!(sz == s2)); | |||
| } | |||
| lolunit_declare_test(StringCharsDifferent) | |||
| lolunit_declare_test(string_chars_different) | |||
| { | |||
| char const* sz = "abc"; | |||
| String s1("ab"); | |||
| @@ -145,7 +148,7 @@ lolunit_declare_fixture(StringTest) | |||
| } | |||
| lolunit_declare_test(StringPrintf) | |||
| lolunit_declare_test(string_printf) | |||
| { | |||
| String s1 = "3a"; | |||
| String s2 = String::Printf("%d%x", 3, 10); | |||
| @@ -158,30 +161,30 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert(s3 == s4); | |||
| } | |||
| lolunit_declare_test(SubString) | |||
| lolunit_declare_test(substring) | |||
| { | |||
| String s1 = "Hello World"; | |||
| String s2 = s1.Sub(0, 5); | |||
| String s2 = s1.sub(0, 5); | |||
| String s3 = "Hello"; | |||
| lolunit_assert(s2 == s3); | |||
| String s4 = s1.Sub(6, 5); | |||
| String s4 = s1.sub(6, 5); | |||
| String s5 = "World"; | |||
| lolunit_assert(s4 == s5); | |||
| } | |||
| lolunit_declare_test(IndexOf) | |||
| lolunit_declare_test(index_of) | |||
| { | |||
| String s1 = "Hello World"; | |||
| ptrdiff_t i1 = s1.IndexOf('H'); | |||
| ptrdiff_t i2 = s1.IndexOf('W'); | |||
| ptrdiff_t i3 = s1.IndexOf('d'); | |||
| ptrdiff_t i4 = s1.IndexOf("Hello"); | |||
| ptrdiff_t i5 = s1.IndexOf("World"); | |||
| ptrdiff_t i6 = s1.IndexOf("lo"); | |||
| ptrdiff_t i7 = s1.IndexOf("Hello World"); | |||
| ptrdiff_t i8 = s1.IndexOf("Sup' dude"); | |||
| ptrdiff_t i1 = s1.index_of('H'); | |||
| ptrdiff_t i2 = s1.index_of('W'); | |||
| ptrdiff_t i3 = s1.index_of('d'); | |||
| ptrdiff_t i4 = s1.index_of("Hello"); | |||
| ptrdiff_t i5 = s1.index_of("World"); | |||
| ptrdiff_t i6 = s1.index_of("lo"); | |||
| ptrdiff_t i7 = s1.index_of("Hello World"); | |||
| ptrdiff_t i8 = s1.index_of("Sup' dude"); | |||
| lolunit_assert(i1 == 0); | |||
| lolunit_assert(i2 == 6); | |||
| @@ -193,18 +196,18 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert(i8 == -1); | |||
| } | |||
| lolunit_declare_test(LastIndexOf) | |||
| lolunit_declare_test(last_index_of) | |||
| { | |||
| String s1 = "Hello World"; | |||
| ptrdiff_t i1 = s1.LastIndexOf('H'); | |||
| ptrdiff_t i2 = s1.LastIndexOf('W'); | |||
| ptrdiff_t i3 = s1.LastIndexOf('d'); | |||
| ptrdiff_t i4 = s1.LastIndexOf("Hello"); | |||
| ptrdiff_t i5 = s1.LastIndexOf("World"); | |||
| ptrdiff_t i6 = s1.LastIndexOf("lo"); | |||
| ptrdiff_t i7 = s1.LastIndexOf("Hello World"); | |||
| ptrdiff_t i8 = s1.LastIndexOf("Sup' dude"); | |||
| ptrdiff_t i9 = s1.LastIndexOf('l'); | |||
| ptrdiff_t i1 = s1.last_index_of('H'); | |||
| ptrdiff_t i2 = s1.last_index_of('W'); | |||
| ptrdiff_t i3 = s1.last_index_of('d'); | |||
| ptrdiff_t i4 = s1.last_index_of("Hello"); | |||
| ptrdiff_t i5 = s1.last_index_of("World"); | |||
| ptrdiff_t i6 = s1.last_index_of("lo"); | |||
| ptrdiff_t i7 = s1.last_index_of("Hello World"); | |||
| ptrdiff_t i8 = s1.last_index_of("Sup' dude"); | |||
| ptrdiff_t i9 = s1.last_index_of('l'); | |||
| lolunit_assert(i1 == 0); | |||
| lolunit_assert(i2 == 6); | |||
| @@ -217,18 +220,18 @@ lolunit_declare_fixture(StringTest) | |||
| lolunit_assert(i9 == 9); | |||
| } | |||
| lolunit_declare_test(StartsEndsWith) | |||
| lolunit_declare_test(starts_ends_with) | |||
| { | |||
| String s = "lolilol"; | |||
| lolunit_assert(s.StartsWith("loli")); | |||
| lolunit_assert(!s.StartsWith("lolo")); | |||
| lolunit_assert(!s.StartsWith("lolilolilol")); | |||
| lolunit_assert(s.EndsWith("ilol")); | |||
| lolunit_assert(!s.EndsWith("olol")); | |||
| lolunit_assert(!s.EndsWith("lolilolilol")); | |||
| lolunit_assert(s.starts_with("loli")); | |||
| lolunit_assert(!s.starts_with("lolo")); | |||
| lolunit_assert(!s.starts_with("lolilolilol")); | |||
| lolunit_assert(s.ends_with("ilol")); | |||
| lolunit_assert(!s.ends_with("olol")); | |||
| lolunit_assert(!s.ends_with("lolilolilol")); | |||
| } | |||
| lolunit_declare_test(StringCompare) | |||
| lolunit_declare_test(string_compare) | |||
| { | |||
| String s1 = "lolilol"; | |||
| String s2 = s1; | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // This library is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| @@ -80,7 +82,7 @@ void Text::TickDraw(float seconds, Scene &scene) | |||
| { | |||
| Entity::TickDraw(seconds, scene); | |||
| int length = data->m_text.Count(); | |||
| int length = data->m_text.count(); | |||
| if (length) | |||
| { | |||
| Font *font = Forge::GetFont(data->font); | |||
| @@ -1,12 +1,14 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2012-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
| // (c) 2012-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
| // © 2012—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
| // | |||
| // This library is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| @@ -62,10 +64,10 @@ template< class T > inline int GetRandom(array<T> src) | |||
| template<class T> inline T FindValue(const char* name) | |||
| { | |||
| String n = name; | |||
| n.ToLower(); | |||
| n.to_lower(); | |||
| for (int i = 0; i < T::Max; ++i) | |||
| { | |||
| String s = T(i).ToString().ToLower(); | |||
| String s = T(i).ToString().to_lower(); | |||
| if (s == n) | |||
| return T(i); | |||
| } | |||