/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
/********************************************
DISCLAIMER:
This is a wrapper code to mimic the relevant std:: class
Please use it ONLY when porting an existing code e.g. from the original sources
For all new development please use classes from Common::
*********************************************/
#ifndef COMMON_STD_MAP_H
#define COMMON_STD_MAP_H
#include "common/hashmap.h"
#include "common/std/utility.h"
namespace Std {
template >
class map {
struct KeyValue {
Key _key;
Val _value;
};
private:
Common::Array _items;
CompFunc _comp;
public:
using iterator = typename Common::Array::iterator;
using const_iterator = typename Common::Array::const_iterator;
/**
* Clears the map
*/
void clear() {
_items.clear();
}
/**
* Gets the iterator start
*/
iterator begin() {
return _items.begin();
}
/**
* Get the iterator end
*/
iterator end() {
return _items.end();
}
/**
* Get the const iterator start
*/
const_iterator begin() const {
return _items.begin();
}
/**
* Get the const iterator end
*/
const_iterator end() const {
return _items.end();
}
/**
* Returns an iterator for the first element of the map that is
* not less than the given key
*/
const_iterator lower_bound(const Key &theKey) const {
const_iterator first = this->begin();
const_iterator it;
int count_ = _items.size(), step;
while (count_ > 0) {
it = first;
step = count_ / 2;
it += step;
if (_comp(it->_key, theKey)) {
first = ++it;
count_ -= step + 1;
} else {
count_ = step;
}
}
return first;
}
iterator lower_bound(const Key &theKey) {
iterator first = this->begin();
iterator it;
int count_ = _items.size(), step;
while (count_ > 0) {
it = first;
step = count_ / 2;
it += step;
if (_comp(it->_key, theKey)) {
first = ++it;
count_ -= step + 1;
} else {
count_ = step;
}
}
return first;
}
/**
* Find the entry with the given key
*/
iterator find(const Key &theKey) {
iterator it = this->lower_bound(theKey);
if (it != this->end() && it->_key == theKey)
return it;
return this->end();
}
const_iterator find(const Key &theKey) const {
const_iterator it = this->lower_bound(theKey);
if (it != this->end() && it->_key == theKey)
return it;
return this->end();
}
/**
* Square brackets operator accesses items by key, creating if necessary
*/
Val &operator[](const Key &theKey) {
iterator it = this->lower_bound(theKey);
if (it == this->end() || it->_key != theKey) {
size_t idx = it - this->begin();
_items.insert_at(idx, KeyValue());
_items[idx]._key = theKey;
return _items[idx]._value;
} else {
return _items[it - this->begin()]._value;
}
}
/**
* Erases an entry in the map
*/
iterator erase(iterator it) {
iterator next = it;
++next;
_items.remove_at(it - begin());
return next;
}
iterator erase(const Key &theKey) {
return erase(find(theKey));
}
/**
* Returns the size of the map
*/
size_t size() const {
return _items.size();
}
/**
* Returns the number of elements with a matching key
*/
size_t count(const Key &theKey) {
int count_ = 0;
for (iterator it = this->begin(); it != this->end(); ++it) {
if (it->_key == theKey)
++count_;
}
return count_;
}
};
template,
class EqualFunc = Common::EqualTo >
class unordered_map : public Common::HashMap {
public:
pair insert(pair elem) {
// unordered_map doesn't replace already existing keys
if (this->contains(elem.first))
return pair(elem.first, this->operator[](elem.first));
// Add item to map
this->operator[](elem.first) = elem.second;
return elem;
}
void reserve(size_t size) {
// No implementation
}
};
} // namespace Std
#endif