/*--------------------------------------------------------------------*/ /*--- An sparse array (of words) implementation. ---*/ /*--- pub_tool_sparsewa.h ---*/ /*--------------------------------------------------------------------*/ /* This file is part of Valgrind, a dynamic binary instrumentation framework. Copyright (C) 2008-2009 OpenWorks Ltd info@open-works.co.uk 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 2 of the License, 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, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. The GNU General Public License is contained in the file COPYING. */ #ifndef __PUB_TOOL_SPARSEWA_H #define __PUB_TOOL_SPARSEWA_H //-------------------------------------------------------------------- // PURPOSE: (see coregrind/pub_core_sparsewa.h for details) //-------------------------------------------------------------------- ///////////////////////////////////////////////////////// // // // SparseWA: Interface // // // ///////////////////////////////////////////////////////// // This interface is a very cut-down version of WordFM. // If you understand how to use WordFM then it should be // trivial to use SparseWA. typedef struct _SparseWA SparseWA; /* opaque */ // Create a new one, using the specified allocator/deallocator SparseWA* VG_(newSWA) ( void*(*alloc_nofail)(HChar* cc, SizeT), HChar* cc, void(*dealloc)(void*) ); // Delete one, and free all associated storage void VG_(deleteSWA) ( SparseWA* swa ); // Add the binding key -> val to this swa. Any existing binding is // overwritten. Returned Bool is True iff a previous binding existed. Bool VG_(addToSWA) ( SparseWA* swa, UWord key, UWord val ); // Delete key from swa, returning associated key and val if found. // Note: returning associated key is stupid (it can only be the // key you just specified). This behaviour is retained to make it // easier to migrate from WordFM. Returned Bool is True iff // the key was actually bound in the mapping. Bool VG_(delFromSWA) ( SparseWA* swa, /*OUT*/UWord* oldK, /*OUT*/UWord* oldV, UWord key ); // Indexes swa at 'key' (or, if you like, looks up 'key' in the // mapping), and returns the associated value, if any, in *valP. For // compatibility with WordFM, 'key' is also returned in *keyP. Returned // Bool is True iff a binding for 'key' actually existed. Bool VG_(lookupSWA) ( SparseWA* swa, /*OUT*/UWord* keyP, /*OUT*/UWord* valP, UWord key ); // Set up 'swa' for iteration. void VG_(initIterSWA) ( SparseWA* swa ); // Get the next key/val pair. Behaviour undefined (highly likely // to segfault) if 'swa' has been modified since initIterSWA was // called. Returned Bool is False iff there are no more pairs // that can be extracted. Bool VG_(nextIterSWA)( SparseWA* swa, /*OUT*/UWord* keyP, /*OUT*/UWord* valP ); // How many elements are there in 'swa'? NOTE: dangerous in the // sense that this is not an O(1) operation but rather O(N), // since it involves walking the whole tree. UWord VG_(sizeSWA) ( SparseWA* swa ); #endif // __PUB_TOOL_SPARSEWA_H /*--------------------------------------------------------------------*/ /*--- end pub_tool_sparsewa.h ---*/ /*--------------------------------------------------------------------*/