
/*--------------------------------------------------------------------*/
/*--- An sparse array (of words) implementation.                   ---*/
/*---                                          pub_tool_sparsewa.h ---*/
/*--------------------------------------------------------------------*/

/*
   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2008-2011 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 ---*/
/*--------------------------------------------------------------------*/
