blob: 91484e0943e2c9ea64ef75660c742e7e3859ba0d [file] [log] [blame]
sewardj7df15152007-02-25 15:04:40 +00001
2/*--------------------------------------------------------------------*/
3/*--- An expandable array implementation. pub_tool_xarray.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
sewardj03f8d3f2012-08-05 15:46:46 +000010 Copyright (C) 2007-2012 OpenWorks LLP
sewardj7df15152007-02-25 15:04:40 +000011 info@open-works.co.uk
12
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
31#ifndef __PUB_TOOL_XARRAY_H
32#define __PUB_TOOL_XARRAY_H
33
34//--------------------------------------------------------------------
35// PURPOSE: Provides a simple but useful structure, which is an array
36// in which elements can be added at the end. The array is expanded
37// as needed by multiplying its size by a constant factor (usually 2).
38// This gives amortised O(1) insertion cost, and, following sorting,
39// the usual O(log N) binary search cost. Arbitrary element sizes
40// are allowed; the comparison function for sort/lookup can be changed
41// at any time, and duplicates (modulo the comparison function) are
42// allowed.
43//--------------------------------------------------------------------
44
45
46/* It's an abstract type. Bwaha. */
sewardj9c606bd2008-09-18 18:12:50 +000047typedef struct _XArray XArray;
sewardj7df15152007-02-25 15:04:40 +000048
florian6bd9dc12012-11-23 16:17:43 +000049typedef Int (*XACmpFn_t)(const void *, const void *);
50
sewardj7df15152007-02-25 15:04:40 +000051/* Create new XArray, using given allocation and free function, and
52 for elements of the specified size. Alloc fn must not fail (that
53 is, if it returns it must have succeeded.) */
florian54fe2022012-10-27 23:07:42 +000054extern XArray* VG_(newXA) ( void*(*alloc_fn)(const HChar*,SizeT),
55 const HChar* cc,
sewardj7df15152007-02-25 15:04:40 +000056 void(*free_fn)(void*),
57 Word elemSzB );
58
59/* Free all memory associated with an XArray. */
60extern void VG_(deleteXA) ( XArray* );
61
62/* Set the comparison function for this XArray. This clears an
63 internal 'array is sorted' flag, which means you must call sortXA
64 before making further queries with lookupXA. */
florian6bd9dc12012-11-23 16:17:43 +000065extern void VG_(setCmpFnXA) ( XArray*, XACmpFn_t);
sewardj7df15152007-02-25 15:04:40 +000066
sewardj0f631482007-02-27 16:40:53 +000067/* Add an element to an XArray. Element is copied into the XArray.
68 Index at which it was added is returned. Note this will be
69 invalidated if the array is later sortXA'd. */
florian6bd9dc12012-11-23 16:17:43 +000070extern Word VG_(addToXA) ( XArray*, const void* elem );
sewardj7df15152007-02-25 15:04:40 +000071
sewardjb8b79ad2008-03-03 01:35:41 +000072/* Add a sequence of bytes to an XArray of bytes. Asserts if nbytes
73 is negative or the array's element size is not 1. Returns the
74 index at which the first byte was added. */
florian6bd9dc12012-11-23 16:17:43 +000075extern Word VG_(addBytesToXA) ( XArray* xao, const void* bytesV, Word nbytes );
sewardjb8b79ad2008-03-03 01:35:41 +000076
sewardj7df15152007-02-25 15:04:40 +000077/* Sort an XArray using its comparison function, if set; else bomb.
78 Probably not a stable sort w.r.t. equal elements module cmpFn. */
79extern void VG_(sortXA) ( XArray* );
80
81/* Lookup (by binary search) 'key' in the array. Set *first to be the
82 index of the first, and *last to be the index of the last matching
83 value found. If any values are found, return True, else return
sewardjffce8152011-06-24 10:09:41 +000084 False, and don't change *first or *last. first and/or last may be
85 NULL. Bomb if the array is not sorted. */
florian6bd9dc12012-11-23 16:17:43 +000086extern Bool VG_(lookupXA) ( XArray*, const void* key,
sewardj7df15152007-02-25 15:04:40 +000087 /*OUT*/Word* first, /*OUT*/Word* last );
88
sewardjdaa5da52009-07-24 08:42:07 +000089/* A version of VG_(lookupXA) in which you can specify your own
90 comparison function. This is unsafe in the sense that if the array
91 is not totally ordered as defined by your comparison function, then
92 this function may loop indefinitely, so it is up to you to ensure
93 that the array is suitably ordered. This is in comparison to
94 VG_(lookupXA), which refuses to do anything (asserts) unless the
95 array has first been sorted using the same comparison function as
96 is being used for the lookup. */
florian6bd9dc12012-11-23 16:17:43 +000097extern Bool VG_(lookupXA_UNSAFE) ( XArray* xao, const void* key,
sewardjdaa5da52009-07-24 08:42:07 +000098 /*OUT*/Word* first, /*OUT*/Word* last,
florian6bd9dc12012-11-23 16:17:43 +000099 XACmpFn_t cmpFn );
sewardjdaa5da52009-07-24 08:42:07 +0000100
sewardj7df15152007-02-25 15:04:40 +0000101/* How elements are there in this XArray now? */
102extern Word VG_(sizeXA) ( XArray* );
103
104/* Index into the XArray. Checks bounds and bombs if the index is
105 invalid. What this returns is the address of the specified element
106 in the array, not (of course) the element itself. Note that the
107 element may get moved by subsequent addToXAs/sortXAs, so you should
108 copy it out immediately and not regard its address as unchanging.
109 Note also that indexXA will of course not return NULL if it
110 succeeds. */
111extern void* VG_(indexXA) ( XArray*, Word );
112
113/* Drop the last n elements of an XArray. Bombs if there are less
sewardjdaa5da52009-07-24 08:42:07 +0000114 than n elements in the array. This is an O(1) operation. */
sewardj7df15152007-02-25 15:04:40 +0000115extern void VG_(dropTailXA) ( XArray*, Word );
116
sewardjdaa5da52009-07-24 08:42:07 +0000117/* Drop the first n elements of an XArray. Bombs if there are less
118 than n elements in the array. This is an O(N) operation, where N
119 is the number of elements remaining in the XArray. */
120extern void VG_(dropHeadXA) ( XArray*, Word );
121
sewardj291849f2012-04-20 23:58:55 +0000122/* Remove the specified element of an XArray, and slide all elements
123 beyond it back one place. This is an O(N) operation, where N is
124 the number of elements after the specified element, in the
125 array. */
126extern void VG_(removeIndexXA)( XArray*, Word );
127
sewardjb8b79ad2008-03-03 01:35:41 +0000128/* Make a new, completely independent copy of the given XArray, using
129 the existing allocation function to allocate the new space.
130 Returns NULL if the allocation function didn't manage to allocate
sewardj9c606bd2008-09-18 18:12:50 +0000131 space (but did return NULL rather than merely abort.) Space for
132 the clone (and all additions to it) is billed to 'cc' unless that
133 is NULL, in which case the parent's cost-center is used. */
florian54fe2022012-10-27 23:07:42 +0000134extern XArray* VG_(cloneXA)( const HChar* cc, XArray* xa );
sewardj7df15152007-02-25 15:04:40 +0000135
sewardj8f8fa172010-05-05 09:23:41 +0000136/* Get the raw array and size so callers can index it really fast.
137 This is dangerous in the sense that there's no range or
138 anything-else checking. It's also dangerous in that if
139 VG_(addToXA) is used, the contents may be re-located without
140 warning, hence making the contents address returned here
141 invalid. */
142extern void VG_(getContentsXA_UNSAFE)( XArray* sr,
143 /*OUT*/void** ctsP,
144 /*OUT*/Word* usedP );
145
sewardj588adef2009-08-15 22:41:51 +0000146/* Convenience function: printf into an XArray of HChar, adding stuff
147 at the end. This is very convenient for concocting arbitrary
148 length printf output in an XArray. Note that the resulting string
bartb3af9cf2011-10-06 19:08:37 +0000149 is NOT zero-terminated. */
sewardj588adef2009-08-15 22:41:51 +0000150extern void VG_(xaprintf)( XArray* dst, const HChar* format, ... )
151 PRINTF_CHECK(2, 3);
152
sewardj7df15152007-02-25 15:04:40 +0000153#endif // __PUB_TOOL_XARRAY_H
154
155/*--------------------------------------------------------------------*/
156/*--- end pub_tool_xarray.h ---*/
157/*--------------------------------------------------------------------*/