(root)/
binutils-2.41/
gprofng/
src/
IndexMap2D.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  /*
      22   *	Index Map2D implementation.
      23   *
      24   *    Index Map2D is dynamic two dimensional array
      25   */
      26  
      27  #ifndef _DBE_INDEXMAP2D_H
      28  #define _DBE_INDEXMAP2D_H
      29  
      30  #include <assert.h>
      31  #include <vec.h>
      32  #include <Map2D.h>
      33  
      34  template <typename Key1_t, typename Key2_t, typename Value_t>
      35  class IndexMap2D : public Map2D<Key1_t, Key2_t, Value_t>
      36  {
      37  public:
      38  
      39    IndexMap2D ();
      40    ~IndexMap2D ();
      41  
      42    void put (Key1_t key1, Key2_t key2, Value_t val);
      43    Value_t get (Key1_t key1, Key2_t key2);
      44    Value_t get (Key1_t key1, Key2_t key2,
      45  	       typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel);
      46    Value_t remove (Key1_t key1, Key2_t key2);
      47  
      48  private:
      49  
      50    Vector<Vector<Value_t>*> *map1;
      51  };
      52  
      53  template <typename Key1_t, typename Key2_t, typename Value_t>
      54  IndexMap2D<Key1_t, Key2_t, Value_t>::IndexMap2D ()
      55  {
      56    map1 = new Vector<Vector<Value_t>*>;
      57  }
      58  
      59  template <typename Key1_t, typename Key2_t, typename Value_t>
      60  IndexMap2D<Key1_t, Key2_t, Value_t>::~IndexMap2D ()
      61  {
      62    map1->destroy ();
      63    delete map1;
      64  }
      65  
      66  template <typename Key1_t, typename Key2_t, typename Value_t>
      67  void
      68  IndexMap2D<Key1_t, Key2_t, Value_t>::put (Key1_t key1, Key2_t key2, Value_t val)
      69  {
      70    if (key1 < 0 || key2 < 0)
      71      return;
      72    Vector<Value_t> *map2 = NULL;
      73    if (key1 < map1->size ())
      74      map2 = map1->fetch ((int) key1);
      75    if (map2 == NULL)
      76      {
      77        map2 = new Vector<Value_t>;
      78        map1->store ((int) key1, map2);
      79      }
      80    map2->store ((int) key2, val);
      81  }
      82  
      83  template <typename Key1_t, typename Key2_t, typename Value_t>
      84  Value_t
      85  IndexMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2)
      86  {
      87    if (key1 < 0 || key1 >= map1->size () || key2 < 0)
      88      return (Value_t) 0;
      89    Vector<Value_t> *map2 = map1->fetch ((int) key1);
      90    if (map2 == NULL || key2 >= map2->size ())
      91      return (Value_t) 0;
      92    return map2->fetch ((int) key2);
      93  }
      94  
      95  template <typename Key1_t, typename Key2_t, typename Value_t>
      96  Value_t
      97  IndexMap2D<Key1_t, Key2_t, Value_t>::get (Key1_t key1, Key2_t key2,
      98  			  typename Map2D<Key1_t, Key2_t, Value_t>::Relation rel)
      99  {
     100    if (rel != Map2D<Key1_t, Key2_t, Value_t>::REL_EQEQ)
     101      return (Value_t) 0;
     102    return get (key1, key2);
     103  }
     104  
     105  template <typename Key1_t, typename Key2_t, typename Value_t>
     106  Value_t
     107  IndexMap2D<Key1_t, Key2_t, Value_t>::remove (Key1_t key1, Key2_t key2)
     108  {
     109    if (key1 < 0 || key1 >= map1->size () || key2 < 0)
     110      return (Value_t) 0;
     111    Vector<Value_t> *map2 = map1->fetch ((int) key1);
     112    if (map2 == NULL || key2 >= map2->size ())
     113      return (Value_t) 0;
     114    Value_t res = map2->fetch ((int) key2);
     115    map2->store ((int) key2, (Value_t) 0);
     116    return res;
     117  }
     118  
     119  #endif