/* Include file cached obstack implementation.
   Written by Fred Fish (fnf@cygnus.com)
   Copyright 1995 Free Software Foundation, Inc.

   This file is part of GDB.

   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.  */

#ifndef BCACHE_H
#define BCACHE_H 1

#define BCACHE_HASHLENGTH	12	/* Number of bits in hash value */
#define BCACHE_HASHSIZE	(1 << BCACHE_HASHLENGTH)
#define BCACHE_MAXLENGTH	128

/* Note that the user data is stored in data[].  Since it can be any type,
   it needs to have the same alignment  as the most strict alignment of 
   any type on the host machine.  So do it the same way obstack does. */

struct hashlink
  {
    struct hashlink *next;
    union
      {
	char data[1];
	double dummy;
      }
    d;
  };

/* BCACHE_DATA is used to get the address of the cached data. */

#define BCACHE_DATA(p) ((p)->d.data)

/* BCACHE_DATA_ALIGNMENT is used to get the offset of the start of
   cached data within the hashlink struct.  This value, plus the
   size of the cached data, is the amount of space to allocate for
   a hashlink struct to hold the next pointer and the data. */

#define BCACHE_DATA_ALIGNMENT \
	(((char *) BCACHE_DATA((struct hashlink*) 0) - (char *) 0))

struct bcache
  {
    struct obstack cache;
    struct hashlink **indextable[BCACHE_MAXLENGTH];
    int cache_hits;
    int cache_misses;
    int cache_bytes;
    int cache_savings;
    int bcache_overflows;
  };

extern void *
  bcache PARAMS ((void *bytes, int count, struct bcache * bcachep));

extern void
print_bcache_statistics PARAMS ((struct bcache *, char *));

#endif /* BCACHE_H */
