Skip to content

Commit

Permalink
libcore: Improved string iteration; App initialization
Browse files Browse the repository at this point in the history
String iterators were simplified.

the_Foundation must be initialization before App is constructed.
  • Loading branch information
skyjake committed Sep 1, 2019
1 parent c15cf9f commit 997e888
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 43 deletions.
28 changes: 13 additions & 15 deletions doomsday/libs/core/include/de/data/string.h
Expand Up @@ -112,19 +112,17 @@ using CharPos = StronglyTypedPosition<CharacterOffset>;
/**
* 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);
Expand All @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions doomsday/libs/core/src/core/app.cpp
Expand Up @@ -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");
Expand Down Expand Up @@ -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.
Expand Down
34 changes: 8 additions & 26 deletions doomsday/libs/core/src/data/string.cpp
Expand Up @@ -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())
{}

Expand All @@ -1165,34 +1165,33 @@ 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;
}

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;
}
Expand All @@ -1206,31 +1205,14 @@ 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));
decode(&end);
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)
Expand Down Expand Up @@ -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());
}

//------------------------------------------------------------------------------------------------
Expand Down

0 comments on commit 997e888

Please sign in to comment.