(root)/
binutils-2.41/
gprofng/
src/
DefaultMap2D.h
       1  /* Copyright (C) 2021-2023 Free Software Foundation, Inc.
       2     Contributed by Oracle.
       3  
       4     This file is part of GNU Binutils.
       5  
       6     This program is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3, or (at your option)
       9     any later version.
      10  
      11     This program is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with this program; if not, write to the Free Software
      18     Foundation, 51 Franklin Street - Fifth Floor, Boston,
      19     MA 02110-1301, USA.  */
      20  
      21  #ifndef _DBE_DEFAULTMAP2D_H
      22  #define _DBE_DEFAULTMAP2D_H
      23  
      24  #include <assert.h>
      25  #include <vec.h>
      26  #include <DefaultMap.h>
      27  #include <IntervalMap.h>
      28  #include <Map2D.h>
      29  
      30  /*
      31   *	Default Map2D implementation.
      32   *
      33   *    Default Map2D is a cartesian product of two default Maps.
      34   */
      35  
      36  template <typename Key1_t, typename Key2_t, typename Value_t>
      37  class DefaultMap2D : public Map2D<Key1_t, Key2_t, Value_t>
      38  {
      39  public:
      40    DefaultMap2D ();
      41    DefaultMap2D (typename Map2D<Key1_t, Key2_t, Value_t>::MapType _type);
      42    ~DefaultMap2D ();
      43    void put (Key1_t key1, Key2_t key2, Value_t val);
      44    Value_t get (Key1_t key1, Key2_t key2);
      45    Value_t get (Key1_t key1, Key2_t key2,
      46  	       typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel);
      47    Value_t remove (Key1_t, Key2_t);
      48  
      49  private:
      50    typename Map2D<Key1_t, Key2_t, Value_t>::MapType type;
      51    Map<Key1_t, Map<Key2_t, Value_t>*> *map1;
      52    Vector<Map<Key2_t, Value_t>*> *map2list;
      53  };
      54  
      55  template <typename Key1_t, typename Key2_t, typename Value_t>
      56  DefaultMap2D<Key1_t, Key2_t, Value_t>::DefaultMap2D ()
      57  {
      58    type = Map2D<Key1_t, Key2_t, Value_t>::Default;
      59    map1 = new DefaultMap<Key1_t, Map<Key2_t, Value_t>*>;
      60    map2list = new Vector<Map<Key2_t, Value_t>*>;
      61  }
      62  
      63  template <typename Key1_t, typename Key2_t, typename Value_t>
      64  DefaultMap2D<Key1_t, Key2_t, Value_t>::DefaultMap2D (
      65  			 typename Map2D<Key1_t, Key2_t, Value_t>::MapType _type)
      66  {
      67    type = _type;
      68    map1 = new DefaultMap<Key1_t, Map<Key2_t, Value_t>*>;
      69    map2list = new Vector<Map<Key2_t, Value_t>*>;
      70  }
      71  
      72  template <typename Key1_t, typename Key2_t, typename Value_t>
      73  DefaultMap2D<Key1_t, Key2_t, Value_t>::~DefaultMap2D ()
      74  {
      75    map2list->destroy ();
      76    delete map2list;
      77    delete map1;
      78  }
      79  
      80  template <typename Key1_t, typename Key2_t, typename Value_t>
      81  void
      82  DefaultMap2D<Key1_t, Key2_t, Value_t>::put (Key1_t key1, Key2_t key2, Value_t val)
      83  {
      84    Map<Key2_t, Value_t> *map2 = map1->get (key1);
      85    if (map2 == NULL)
      86      {
      87        if (type == Map2D<Key1_t, Key2_t, Value_t>::Interval)
      88  	map2 = new IntervalMap<Key2_t, Value_t>;
      89        else
      90  	map2 = new DefaultMap<Key2_t, Value_t>;
      91        map2list->append (map2);
      92        map1->put (key1, map2);
      93      }
      94    map2->put (key2, val);
      95  }
      96  
      97  template <typename Key1_t, typename Key2_t, typename Value_t>
      98  Value_t
      99  DefaultMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2)
     100  {
     101    Map<Key2_t, Value_t> *map2 = map1->get (key1);
     102    if (map2 == NULL)
     103      return (Value_t) 0;
     104    return map2->get (key2);
     105  }
     106  
     107  template <typename Key1_t, typename Key2_t, typename Value_t>
     108  Value_t
     109  DefaultMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2,
     110  			  typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel)
     111  {
     112    Map<Key2_t, Value_t> *map2 = map1->get (key1);
     113    if (map2 == NULL)
     114      return (Value_t) 0;
     115    typename Map<Key2_t, Value_t>::Relation rel2;
     116    switch (rel)
     117      {
     118      case Map2D<Key1_t, Key2_t, Value_t>::REL_EQLT:
     119        rel2 = map2->REL_LT;
     120        break;
     121      case Map2D<Key1_t, Key2_t, Value_t>::REL_EQLE:
     122        rel2 = map2->REL_LE;
     123        break;
     124      case Map2D<Key1_t, Key2_t, Value_t>::REL_EQGE:
     125        rel2 = map2->REL_GE;
     126        break;
     127      case Map2D<Key1_t, Key2_t, Value_t>::REL_EQGT:
     128        rel2 = map2->REL_GT;
     129        break;
     130      default:
     131        rel2 = map2->REL_EQ;
     132        break;
     133      }
     134    return map2->get (key2, rel2);
     135  }
     136  
     137  template <typename Key1_t, typename Key2_t, typename Value_t>
     138  Value_t
     139  DefaultMap2D<Key1_t, Key2_t, Value_t>::remove (Key1_t, Key2_t)
     140  {
     141    // Not implemented
     142    if (1)
     143      assert (0);
     144    return (Value_t) 0;
     145  }
     146  
     147  #endif