#include <map>
#include <vector>
#include <string>
#include <functional>

using std::string;
using std::map;

class GameDatabase {
    
    private: 
    std::map < ObjectId, GameObject, std::greater < ObjectId >> dataBase_;


    public:
    GameDatabase() = default;

    void Insert(ObjectId id, std::string name, size_t x, size_t y) {
      GameObject obj;
      obj.name = name;
      obj.id = id;
      obj.x = x;
      obj.y = y;
      dataBase_[id] = obj;
    }

    void Remove(ObjectId id) {
      map<ObjectId, GameObject>::iterator it = dataBase_.find(id);
      if (it != std::end(dataBase_))
        dataBase_.erase(it);
    }

    vector<GameObject> DataByName(string name) const {
      std::vector<GameObject> ret;
      map<ObjectId, GameObject>::iterator i = dataBase_.begin()
      for (; i != dataBase_.end(); ++i)
        if (i->second.name.compare(name) == 0)
          ret.push_back(i->second);

      return ret;
    }

    std::vector<GameObject> DataByPosition(size_t x, size_t y) const {
      std::vector<GameObject> ret;

      for (auto elem : dataBase_)
      if (elem.second.y == y && elem.second.x == x)
        ret.push_back(elem.second);

      return ret;
    }

    std::vector<GameObject> Data() const {
      std::vector<GameObject> ret;

      for (auto it = std::begin(dataBase_);
      i != std::end(dataBase_);
      ++it)
      ret.push_back(*elem);

      return ret;
    }
};