From 997e888feb949a110177536fc292c716441d4af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Sat, 8 Dec 2018 18:23:03 +0200 Subject: [PATCH] libcore: Improved string iteration; App initialization String iterators were simplified. the_Foundation must be initialization before App is constructed. --- doomsday/libs/core/include/de/data/string.h | 28 ++++++++--------- doomsday/libs/core/src/core/app.cpp | 4 +-- doomsday/libs/core/src/data/string.cpp | 34 +++++---------------- 3 files changed, 23 insertions(+), 43 deletions(-) diff --git a/doomsday/libs/core/include/de/data/string.h b/doomsday/libs/core/include/de/data/string.h index ec22ae4e95..0894f9b044 100644 --- a/doomsday/libs/core/include/de/data/string.h +++ b/doomsday/libs/core/include/de/data/string.h @@ -112,19 +112,17 @@ using CharPos = StronglyTypedPosition; /** * Multibyte character iterator. */ -struct DE_PUBLIC mb_iterator -{ - const char *i; - const char *start; +struct DE_PUBLIC mb_iterator { + const char * cur; + const char * start; mutable mbstate_t mb{}; - //mutable int curCharLen = 0; - mb_iterator() : i{nullptr}, start{nullptr} {} - mb_iterator(const char *p) : i{p}, start{p} {} - mb_iterator(const char *p, const char *start) : i{p}, start{start} {} + mb_iterator() : cur{nullptr}, start{nullptr} {} + mb_iterator(const char *p) : cur{p}, start{p} {} + mb_iterator(const char *p, const char *start) : cur{p}, start{start} {} mb_iterator(const String &str); - operator const char *() const { return i; } + operator const char *() const { return cur; } Char operator*() const; mb_iterator &operator++(); mb_iterator operator++(int); @@ -134,14 +132,14 @@ struct DE_PUBLIC mb_iterator mb_iterator &operator+=(int offset); mb_iterator operator-(int offset) const; mb_iterator &operator-=(int offset); - bool operator==(const char *ptr) const { return i == ptr; } - bool operator!=(const char *ptr) const { return i != ptr; } - bool operator==(const mb_iterator &other) const { return i == other.i; } + bool operator==(const char *ptr) const { return cur == ptr; } + bool operator!=(const char *ptr) const { return cur != ptr; } + bool operator==(const mb_iterator &other) const { return cur == other.cur; } bool operator!=(const mb_iterator &other) const { return !(*this == other); } - explicit operator bool() const { return i != nullptr; } + explicit operator bool() const { return cur != nullptr; } - BytePos pos() const { return BytePos(i - start); } - BytePos pos(const char *reference) const { return BytePos(i - reference); } + BytePos pos() const { return BytePos(cur - start); } + BytePos pos(const char *reference) const { return BytePos(cur - reference); } BytePos pos(const String &reference) const; Char decode(const char **end = nullptr) const; diff --git a/doomsday/libs/core/src/core/app.cpp b/doomsday/libs/core/src/core/app.cpp index 7869287f3f..9cc6235efe 100644 --- a/doomsday/libs/core/src/core/app.cpp +++ b/doomsday/libs/core/src/core/app.cpp @@ -159,6 +159,8 @@ DE_PIMPL(App) , config(nullptr) , terminateFunc(nullptr) { + DE_ASSERT(isInitialized_Foundation()); + appPath = cmdLine.startupPath() / cmdLine.at(0); metadata.set(APP_NAME, "Doomsday Engine"); @@ -402,8 +404,6 @@ DE_AUDIENCE_METHOD(App, StartupComplete) App::App(const StringList &args) : d(new Impl(this, args)) { - init_Foundation(); - d->unixInfo.reset(new UnixInfo); // Global time source for animations. diff --git a/doomsday/libs/core/src/data/string.cpp b/doomsday/libs/core/src/data/string.cpp index 42e76e2b11..3f2b45817b 100644 --- a/doomsday/libs/core/src/data/string.cpp +++ b/doomsday/libs/core/src/data/string.cpp @@ -1153,7 +1153,7 @@ String::const_reverse_iterator::const_reverse_iterator(const String &str) //------------------------------------------------------------------------------------------------ mb_iterator::mb_iterator(const String &str) - : i(str.data()) + : cur(str.data()) , start(str.data()) {} @@ -1165,18 +1165,18 @@ Char mb_iterator::operator*() const Char mb_iterator::decode(const char **end) const { wchar_t ch = 0; - size_t rc = std::mbrtowc(&ch, i, MB_CUR_MAX, &mb); + size_t rc = std::mbrtowc(&ch, cur, MB_CUR_MAX, &mb); if (int(rc) < 0) { // Multibyte decoding failed. Let's return something valid, though, so the iterator // doesn't hang due to never reaching the end of the string. ch = '?'; -// curCharLen = 1; if (end) *end = nullptr; } else { - if (end) *end = i + rc; + DE_ASSERT(rc > 0 || *cur == 0); + if (end) *end = cur + rc; } return ch; } @@ -1184,15 +1184,14 @@ Char mb_iterator::decode(const char **end) const mb_iterator &mb_iterator::operator++() { const char *end; - //if (curCharLen == 0) decode(); decode(&end); if (end) { - i = end; + cur = end; } else { - ++i; + ++cur; } return *this; } @@ -1206,7 +1205,7 @@ mb_iterator mb_iterator::operator++(int) mb_iterator &mb_iterator::operator--() { - while (--i > start) + while (--cur > start) { const char *end; memset(&mb, 0, sizeof(mb)); @@ -1214,23 +1213,6 @@ mb_iterator &mb_iterator::operator--() if (end) break; } return *this; - -// bool moved = false; -// for (int j = 1; j < MB_CUR_MAX; ++j) -// { -// mb_iterator prec = i - j; -// bool ok; -// prec.decode(&ok); -// if (ok) // && prec.curCharLen == j) -// { -// moved = (prec.i != i); -// prec.start = start; -// *this = prec; -// break; -// } -// } -// DE_ASSERT(moved); - return *this; } mb_iterator mb_iterator::operator--(int) @@ -1272,7 +1254,7 @@ mb_iterator &mb_iterator::operator-=(int offset) BytePos mb_iterator::pos(const String &reference) const { - return BytePos(i - reference.c_str()); + return BytePos(cur - reference.c_str()); } //------------------------------------------------------------------------------------------------