1*c42dbd0eSchristos /* Copyright (C) 2021 Free Software Foundation, Inc. 2*c42dbd0eSchristos Contributed by Oracle. 3*c42dbd0eSchristos 4*c42dbd0eSchristos This file is part of GNU Binutils. 5*c42dbd0eSchristos 6*c42dbd0eSchristos This program is free software; you can redistribute it and/or modify 7*c42dbd0eSchristos it under the terms of the GNU General Public License as published by 8*c42dbd0eSchristos the Free Software Foundation; either version 3, or (at your option) 9*c42dbd0eSchristos any later version. 10*c42dbd0eSchristos 11*c42dbd0eSchristos This program is distributed in the hope that it will be useful, 12*c42dbd0eSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of 13*c42dbd0eSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*c42dbd0eSchristos GNU General Public License for more details. 15*c42dbd0eSchristos 16*c42dbd0eSchristos You should have received a copy of the GNU General Public License 17*c42dbd0eSchristos along with this program; if not, write to the Free Software 18*c42dbd0eSchristos Foundation, 51 Franklin Street - Fifth Floor, Boston, 19*c42dbd0eSchristos MA 02110-1301, USA. */ 20*c42dbd0eSchristos 21*c42dbd0eSchristos #ifndef _DbeArray_H 22*c42dbd0eSchristos #define _DbeArray_H 23*c42dbd0eSchristos 24*c42dbd0eSchristos template <typename ITEM> class DbeArray 25*c42dbd0eSchristos { 26*c42dbd0eSchristos public: 27*c42dbd0eSchristos DbeArray(long sz)28*c42dbd0eSchristos DbeArray (long sz) 29*c42dbd0eSchristos { 30*c42dbd0eSchristos count = 0; 31*c42dbd0eSchristos limit = sz; 32*c42dbd0eSchristos data = new ITEM[limit]; 33*c42dbd0eSchristos }; 34*c42dbd0eSchristos 35*c42dbd0eSchristos virtual ~DbeArray()36*c42dbd0eSchristos ~DbeArray () 37*c42dbd0eSchristos { 38*c42dbd0eSchristos delete[] data; 39*c42dbd0eSchristos } 40*c42dbd0eSchristos 41*c42dbd0eSchristos int append(const ITEM & item)42*c42dbd0eSchristos append (const ITEM &item) 43*c42dbd0eSchristos { 44*c42dbd0eSchristos int n = allocate (1); 45*c42dbd0eSchristos ITEM *p = get (n); 46*c42dbd0eSchristos *p = item; 47*c42dbd0eSchristos return n; 48*c42dbd0eSchristos }; 49*c42dbd0eSchristos 50*c42dbd0eSchristos ITEM * get(long index)51*c42dbd0eSchristos get (long index) 52*c42dbd0eSchristos { 53*c42dbd0eSchristos return (index < count && index >= 0) ? data + index : (ITEM *) NULL; 54*c42dbd0eSchristos }; 55*c42dbd0eSchristos 56*c42dbd0eSchristos int allocate(int cnt)57*c42dbd0eSchristos allocate (int cnt) 58*c42dbd0eSchristos { 59*c42dbd0eSchristos count += cnt; 60*c42dbd0eSchristos resize (count); 61*c42dbd0eSchristos return count - cnt; 62*c42dbd0eSchristos }; 63*c42dbd0eSchristos 64*c42dbd0eSchristos int size()65*c42dbd0eSchristos size () 66*c42dbd0eSchristos { 67*c42dbd0eSchristos return (int) count; 68*c42dbd0eSchristos }; 69*c42dbd0eSchristos 70*c42dbd0eSchristos void reset()71*c42dbd0eSchristos reset () 72*c42dbd0eSchristos { 73*c42dbd0eSchristos count = 0; 74*c42dbd0eSchristos }; 75*c42dbd0eSchristos 76*c42dbd0eSchristos private: 77*c42dbd0eSchristos 78*c42dbd0eSchristos void resize(long cnt)79*c42dbd0eSchristos resize (long cnt) 80*c42dbd0eSchristos { 81*c42dbd0eSchristos if (limit <= cnt) 82*c42dbd0eSchristos { 83*c42dbd0eSchristos limit *= 2; 84*c42dbd0eSchristos if (limit < cnt) 85*c42dbd0eSchristos limit = cnt + 1; 86*c42dbd0eSchristos ITEM *d = new ITEM[limit]; 87*c42dbd0eSchristos if (count > 0) 88*c42dbd0eSchristos memcpy (d, data, sizeof (ITEM) * count); 89*c42dbd0eSchristos delete[] data; 90*c42dbd0eSchristos data = d; 91*c42dbd0eSchristos } 92*c42dbd0eSchristos }; 93*c42dbd0eSchristos 94*c42dbd0eSchristos ITEM *data; // Pointer to data vector 95*c42dbd0eSchristos long count; // Number of items 96*c42dbd0eSchristos long limit; // Array length 97*c42dbd0eSchristos }; 98*c42dbd0eSchristos 99*c42dbd0eSchristos #endif /* _DbeArray_H */ 100