/* Copyright (C) 2021-2023 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. 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, 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, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _DBE_DEFAULTMAP2D_H #define _DBE_DEFAULTMAP2D_H #include #include #include #include #include /* * Default Map2D implementation. * * Default Map2D is a cartesian product of two default Maps. */ template class DefaultMap2D : public Map2D { public: DefaultMap2D (); DefaultMap2D (typename Map2D::MapType _type); ~DefaultMap2D (); void put (Key1_t key1, Key2_t key2, Value_t val); Value_t get (Key1_t key1, Key2_t key2); Value_t get (Key1_t key1, Key2_t key2, typename Map2D::Relation rel); Value_t remove (Key1_t, Key2_t); private: typename Map2D::MapType type; Map*> *map1; Vector*> *map2list; }; template DefaultMap2D::DefaultMap2D () { type = Map2D::Default; map1 = new DefaultMap*>; map2list = new Vector*>; } template DefaultMap2D::DefaultMap2D ( typename Map2D::MapType _type) { type = _type; map1 = new DefaultMap*>; map2list = new Vector*>; } template DefaultMap2D::~DefaultMap2D () { map2list->destroy (); delete map2list; delete map1; } template void DefaultMap2D::put (Key1_t key1, Key2_t key2, Value_t val) { Map *map2 = map1->get (key1); if (map2 == NULL) { if (type == Map2D::Interval) map2 = new IntervalMap; else map2 = new DefaultMap; map2list->append (map2); map1->put (key1, map2); } map2->put (key2, val); } template Value_t DefaultMap2D::get (Key1_t key1, Key2_t key2) { Map *map2 = map1->get (key1); if (map2 == NULL) return (Value_t) 0; return map2->get (key2); } template Value_t DefaultMap2D::get (Key1_t key1, Key2_t key2, typename Map2D::Relation rel) { Map *map2 = map1->get (key1); if (map2 == NULL) return (Value_t) 0; typename Map::Relation rel2; switch (rel) { case Map2D::REL_EQLT: rel2 = map2->REL_LT; break; case Map2D::REL_EQLE: rel2 = map2->REL_LE; break; case Map2D::REL_EQGE: rel2 = map2->REL_GE; break; case Map2D::REL_EQGT: rel2 = map2->REL_GT; break; default: rel2 = map2->REL_EQ; break; } return map2->get (key2, rel2); } template Value_t DefaultMap2D::remove (Key1_t, Key2_t) { // Not implemented if (1) assert (0); return (Value_t) 0; } #endif