Home | History | Annotate | Line # | Download | only in src
      1 /* Copyright (C) 2021-2026 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  *	Dbe Cache Map implementation.
     23  *
     24  *    Simple Cache Map makes the following assumptions:
     25  *    - Cache Map is used for very fast but not guaranteed mapping;
     26  *    - No Relations can be used;
     27  *    - all objects used as keys or values has to be managed
     28  *      outside CacheMap (f.e. deletion);
     29  */
     30 
     31 #ifndef _DbeCacheMap_h
     32 #define _DbeCacheMap_h
     33 
     34 #include <Map.h>
     35 
     36 template <typename Key_t, class ITEM>
     37 class DbeCacheMap : public Map<Key_t, ITEM *>
     38 {
     39 public:
     40 
     41   DbeCacheMap (int _size = DefaultSize)
     42   { // _size should be 2 ** N
     43     size = _size;
     44     table = new DbeCache_T[size];
     45     memset (table, 0, size * sizeof (DbeCache_T));
     46   };
     47 
     48   ~DbeCacheMap ()
     49   {
     50     delete[] table;
     51   };
     52 
     53   void
     54   put (Key_t key, ITEM *val)
     55   {
     56     int ind = get_hash (key);
     57     table[ind].key = key;
     58     table[ind].value = val;
     59   };
     60 
     61   ITEM *
     62   get (Key_t key)
     63   {
     64     int ind = get_hash (key);
     65     if (table[ind].key == key)
     66       return table[ind].value;
     67     return (ITEM *) NULL;
     68   };
     69 
     70   ITEM *
     71   remove (Key_t key)
     72   {
     73     int ind = get_hash (key);
     74     ITEM *v = table[ind].value;
     75     table[ind].value = (ITEM *) NULL;
     76     return v;
     77   };
     78 
     79   ITEM *
     80   get (Key_t /* key */, typename Map<Key_t, ITEM *>::Relation /* rel */)
     81   {
     82     return (ITEM *) NULL;
     83   };
     84 
     85 private:
     86 
     87   enum
     88   {
     89     DefaultSize     = (1 << 13)
     90   };
     91 
     92   typedef struct DbeCache_S
     93   {
     94     Key_t key;
     95     ITEM *value;
     96   } DbeCache_T;
     97   DbeCache_T *table;
     98   int size;
     99 
    100   int
    101   get_hash (Key_t key)
    102   {
    103     unsigned long long h = (unsigned long long) key;
    104     h ^= (h >> 20) ^ (h >> 12);
    105     return (h ^ (h >> 7) ^ (h >> 4)) & (size - 1);
    106   }
    107 };
    108 
    109 #endif
    110