ULTIMA8: Revert back to original's use of reverse iterators

This commit is contained in:
Paul Gilbert 2019-12-05 20:54:58 -08:00 committed by Paul Gilbert
parent 06f0ba188f
commit 322a6f0b0f
8 changed files with 142 additions and 45 deletions

View File

@ -224,8 +224,8 @@ KeyMap ConfigFileManager::listKeyValues(istring section,
INIFile *ConfigFileManager::findKeyINI(istring key) {
for (std::vector<INIFile *>::iterator i = inifiles.end();
i != inifiles.begin(); --i) {
for (std::vector<INIFile *>::reverse_iterator i = inifiles.rbegin();
i != inifiles.rend(); ++i) {
if ((*i)->hasKey(key))
return (*i);
}
@ -234,8 +234,8 @@ INIFile *ConfigFileManager::findKeyINI(istring key) {
}
INIFile *ConfigFileManager::findWriteINI(istring key) {
for (std::vector<INIFile *>::iterator i = inifiles.end();
i != inifiles.begin(); --i) {
for (std::vector<INIFile *>::reverse_iterator i = inifiles.rbegin();
i != inifiles.rend(); ++i) {
if (!(*i)->isReadonly() && (*i)->checkRoot(key))
return (*i);
}

View File

@ -23,6 +23,18 @@
namespace Ultima8 {
static const Ultima8GameDescription gameDescriptions[] = {
{
{
"ultima8",
"Gold Edition",
AD_ENTRY1s("dosboxULTIMA8.conf", "ae990ff69c20bd5fc25ed1edb73ef015", 11448),
Common::EN_ANY,
Common::kPlatformDOS,
0,
GUIO1(GUIO_NOMIDI)
},
},
{ AD_TABLE_END_MARKER }
};

View File

@ -123,8 +123,8 @@ bool FileSystem::base_to_uppercase(string &str, int count) {
int todo = count;
// Go backwards.
string::iterator X;
for (X = str.end(); X >= str.begin(); --X) {
string::reverse_iterator X;
for (X = str.rend(); X != str.rbegin(); ++X) {
// Stop at separator.
if (*X == '/' || *X == '\\' || *X == ':')
todo--;
@ -137,7 +137,7 @@ bool FileSystem::base_to_uppercase(string &str, int count) {
*X = static_cast<char>(std::toupper(*X));
#endif
}
if (X >= str.begin())
if (X == str.rend())
todo--; // start of pathname counts as separator too
// false if it didn't reach 'count' parts

View File

@ -170,10 +170,10 @@ uint16 ContainerGump::TraceObjId(int mx, int my) {
bool paintEditorItems = Ultima8Engine::get_instance()->isPaintEditorItems();
std::list<Item *> &contents = c->contents;
std::list<Item *>::iterator iter;
std::list<Item *>::reverse_iterator iter;
// iterate backwards, since we're painting from begin() to end()
for (iter = contents.end(); iter != contents.begin(); --iter) {
for (iter = contents.rbegin(); iter != contents.rend(); ++iter) {
Item *item = *iter;
if (!paintEditorItems && item->getShapeInfo()->is_editor())
continue;

View File

@ -127,12 +127,12 @@ void Gump::Close(bool no_del) {
void Gump::RenderSurfaceChanged() {
// Iterate all children
std::list<Gump *>::iterator it = children.end();
std::list<Gump *>::iterator begin = children.begin();
std::list<Gump *>::reverse_iterator it = children.rbegin();
std::list<Gump *>::reverse_iterator end = children.rend();
while (it != begin) {
while (it != end) {
(*it)->RenderSurfaceChanged();
--it;
++it;
}
}
@ -190,12 +190,12 @@ void Gump::CloseItemDependents() {
bool Gump::GetMouseCursor(int mx, int my, Shape &shape_, int32 &frame) {
ParentToGump(mx, my);
bool ret = false;
// This reverse iterates the children
std::list<Gump *>::iterator it;
for (it = children.end(); it != children.begin(); --it) {
std::list<Gump *>::reverse_iterator it;
for (it = children.rbegin(); it != children.rend(); ++it)
{
Gump *g = *it;
// Not if closing
@ -307,16 +307,16 @@ void Gump::PaintCompositing(RenderSurface *surf, int32 lerp_factor,
surf->SetClippingRect(new_rect);
// Iterate all children
std::list<Gump *>::iterator it = children.end();
std::list<Gump *>::iterator begin = children.begin();
std::list<Gump *>::reverse_iterator it = children.rbegin();
std::list<Gump *>::reverse_iterator end = children.rend();
while (it != begin) {
while (it != end) {
Gump *g = *it;
// Paint if not closing
if (!g->IsClosing())
g->PaintCompositing(surf, lerp_factor, sx, sy);
--it;
++it;
}
// Paint This
@ -338,13 +338,13 @@ Gump *Gump::FindGump(int mx, int my) {
Gump *gump = 0;
// Iterate all children
std::list<Gump *>::iterator it = children.end();
std::list<Gump *>::iterator begin = children.begin();
std::list<Gump *>::reverse_iterator it = children.rbegin();
std::list<Gump *>::reverse_iterator end = children.rend();
while (it != begin && !gump) {
while (it != end && !gump) {
Gump *g = *it;
gump = g->FindGump(gx, gy);
--it;
++it;
}
// it's over a child
@ -411,8 +411,8 @@ bool Gump::PointOnGump(int mx, int my) {
}
// reverse-iterate children
std::list<Gump *>::iterator it;
for (it = children.end(); it != children.begin(); --it) {
std::list<Gump *>::reverse_iterator it;
for (it = children.rbegin(); it != children.rend(); ++it) {
Gump *g = *it;
// It's got the point
@ -498,17 +498,17 @@ uint16 Gump::TraceObjId(int mx, int my) {
uint16 objId_ = 0;
// reverse-iterate children
std::list<Gump *>::iterator it;
for (it = children.end(); it != children.begin(); --it) {
std::list<Gump *>::reverse_iterator it;
for (it = children.rbegin(); it != children.rend(); ++it) {
Gump *g = *it;
// Not if closing
if (g->flags & FLAG_CLOSING) continue;
// It's got the point
if (g->PointOnGump(gx, gy)) objId_ = g->TraceObjId(gx, gy);
if (g->PointOnGump(gx, gy)) objid = g->TraceObjId(gx, gy);
if (objId_ && objId_ != 65535) break;
if (objid && objid != 65535) break;
}
// if (!objId_ || objId_ == 65535)
@ -581,9 +581,9 @@ void Gump::FindNewFocusChild() {
focus_child = 0;
// Now add the gump to use as the new focus
std::list<Gump *>::iterator it = children.end();
std::list<Gump *>::reverse_iterator it = children.rbegin();
if (it != children.begin()) {
if (it != children.rend()) {
(*it)->MakeFocus();
}
}
@ -689,8 +689,8 @@ Gump *Gump::OnMouseDown(int button, int mx, int my) {
Gump *handled = 0;
// Iterate children backwards
std::list<Gump *>::iterator it;
for (it = children.end(); it != children.begin(); --it) {
std::list<Gump *>::reverse_iterator it;
for (it = children.rbegin(); it != children.rend(); ++it) {
Gump *g = *it;
// Not if closing
@ -712,8 +712,8 @@ Gump *Gump::OnMouseMotion(int mx, int my) {
Gump *handled = 0;
// Iterate children backwards
std::list<Gump *>::iterator it;
for (it = children.end(); it != children.begin(); --it) {
std::list<Gump *>::reverse_iterator it;
for (it = children.rbegin(); it != children.rend(); ++it) {
Gump *g = *it;
// Not if closing

View File

@ -87,16 +87,16 @@ void ScalerGump::Paint(RenderSurface *surf, int32 lerp_factor, bool scaled) {
int32 scaley = (height << 16) / sheight1;
// Iterate all children
std::list<Gump *>::iterator it = children.end();
std::list<Gump *>::iterator begin = children.begin();
std::list<Gump *>::reverse_iterator it = children.rbegin();
std::list<Gump *>::reverse_iterator end = children.rend();
while (it != begin) {
while (it != end) {
Gump *g = *it;
// Paint if not closing
if (!g->IsClosing())
g->PaintCompositing(surf, lerp_factor, scalex, scaley);
--it;
++it;
}
}

View File

@ -35,6 +35,29 @@ namespace std {
template<class T>
class vector : public Common::Array<T> {
public:
struct reverse_iterator {
private:
vector<T> *_owner;
int _index;
public:
reverse_iterator(vector<T> *owner, int index) : _owner(owner), _index(index) {}
reverse_iterator() : _owner(nullptr), _index(-1) {}
T operator*() const { return (*_owner)[_index]; }
reverse_iterator &operator++() {
--_index;
return *this;
}
bool operator==(const reverse_iterator &rhs) {
return _owner == rhs._owner && _index == rhs._index;
}
bool operator!=(const reverse_iterator &rhs) {
return !operator==(rhs);
}
};
public:
typedef T reference;
typedef const T const_reference;
@ -64,6 +87,13 @@ public:
SWAP(this->_size, arr._size);
SWAP(this->_storage, arr._storage);
}
reverse_iterator rbegin() {
return reverse_iterator(this, (int)Common::Array<T>::size() - 1);
}
reverse_iterator rend() {
return reverse_iterator(this, -1);
}
};
template<class T>
@ -117,14 +147,39 @@ template<class VAL>
class deque : public Common::List<VAL> {
};
template<class VAL>
class list : public Common::List<VAL> {
template<class T>
class list : public Common::List<T> {
public:
typename Common::List<VAL>::iterator insert(typename Common::List<VAL>::iterator pos,
const VAL &element) {
Common::List<VAL>::insert(pos, element);
struct reverse_iterator {
private:
typename Common::List<T>::iterator _it;
public:
reverse_iterator(typename Common::List<T>::iterator it) : _it(it) {}
reverse_iterator() {}
T operator*() const { return *_it; }
reverse_iterator &operator++() {
--_it;
return *this;
}
bool operator==(const reverse_iterator &rhs) { return _it == rhs._it; }
bool operator!=(const reverse_iterator &rhs) { return _it != rhs._it; }
};
public:
typename Common::List<T>::iterator insert(typename Common::List<T>::iterator pos,
const T &element) {
Common::List<T>::insert(pos, element);
return pos;
}
reverse_iterator rbegin() {
return reverse_iterator(Common::List<T>::reverse_begin());
}
reverse_iterator rend() {
return reverse_iterator(Common::List<T>::end());
}
};
template<class VAL>

View File

@ -32,6 +32,29 @@ class string : public Common::String {
public:
typedef size_t size_type;
static const size_type npos = (size_type) - 1;
struct reverse_iterator {
private:
string *_owner;
int _index;
public:
reverse_iterator(string *owner, int index) : _owner(owner), _index(index) {}
reverse_iterator() : _owner(nullptr), _index(-1) {}
char &operator*() const { return (*_owner)[_index]; }
reverse_iterator &operator++() {
--_index;
return *this;
}
bool operator==(const reverse_iterator &rhs) {
return _owner == rhs._owner && _index == rhs._index;
}
bool operator!=(const reverse_iterator &rhs) {
return !operator==(rhs);
}
};
public:
string() : Common::String() {}
string(const char *str) : Common::String(str) {}
@ -141,6 +164,13 @@ public:
void append(const string &str) {
*this += str;
}
reverse_iterator rbegin() {
return reverse_iterator(this, (int)size() - 1);
}
reverse_iterator rend() {
return reverse_iterator(this, -1);
}
};
extern const char *const endl;