|  | /* Copyright (C) 2021-2025 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 _DbeArray_H | 
|  | #define _DbeArray_H | 
|  |  | 
|  | template <typename ITEM> class DbeArray | 
|  | { | 
|  | public: | 
|  |  | 
|  | DbeArray (long sz) | 
|  | { | 
|  | count = 0; | 
|  | limit = sz; | 
|  | data = new ITEM[limit]; | 
|  | }; | 
|  |  | 
|  | virtual | 
|  | ~DbeArray () | 
|  | { | 
|  | delete[] data; | 
|  | } | 
|  |  | 
|  | int | 
|  | append (const ITEM &item) | 
|  | { | 
|  | int n = allocate (1); | 
|  | ITEM *p = get (n); | 
|  | *p = item; | 
|  | return n; | 
|  | }; | 
|  |  | 
|  | ITEM * | 
|  | get (long index) | 
|  | { | 
|  | return (index < count && index >= 0) ? data + index : (ITEM *) NULL; | 
|  | }; | 
|  |  | 
|  | int | 
|  | allocate (int cnt) | 
|  | { | 
|  | count += cnt; | 
|  | resize (count); | 
|  | return count - cnt; | 
|  | }; | 
|  |  | 
|  | int | 
|  | size () | 
|  | { | 
|  | return (int) count; | 
|  | }; | 
|  |  | 
|  | void | 
|  | reset () | 
|  | { | 
|  | count = 0; | 
|  | }; | 
|  |  | 
|  | private: | 
|  |  | 
|  | void | 
|  | resize (long cnt) | 
|  | { | 
|  | if (limit <= cnt) | 
|  | { | 
|  | limit *= 2; | 
|  | if (limit < cnt) | 
|  | limit = cnt + 1; | 
|  | ITEM *d = new ITEM[limit]; | 
|  | if (count > 0) | 
|  | memcpy (d, data, sizeof (ITEM) * count); | 
|  | delete[] data; | 
|  | data = d; | 
|  | } | 
|  | }; | 
|  |  | 
|  | ITEM *data;   // Pointer to data vector | 
|  | long count;   // Number of items | 
|  | long limit;   // Array length | 
|  | }; | 
|  |  | 
|  | #endif /* _DbeArray_H */ |