Blame src/gdcache.h

Packit Service df60bb
#ifdef __cplusplus
Packit Service df60bb
extern "C" {
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
	/*
Packit Service df60bb
	 * gdcache.h
Packit Service df60bb
	 *
Packit Service df60bb
	 * Caches of pointers to user structs in which the least-recently-used
Packit Service df60bb
	 * element is replaced in the event of a cache miss after the cache has
Packit Service df60bb
	 * reached a given size.
Packit Service df60bb
	 *
Packit Service df60bb
	 * John Ellson  (ellson@graphviz.org)  Oct 31, 1997
Packit Service df60bb
	 *
Packit Service df60bb
	 * Test this with:
Packit Service df60bb
	 *		 gcc -o gdcache -g -Wall -DTEST gdcache.c
Packit Service df60bb
	 *
Packit Service df60bb
	 * The cache is implemented by a singly-linked list of elements
Packit Service df60bb
	 * each containing a pointer to a user struct that is being managed by
Packit Service df60bb
	 * the cache.
Packit Service df60bb
	 *
Packit Service df60bb
	 * The head structure has a pointer to the most-recently-used
Packit Service df60bb
	 * element, and elements are moved to this position in the list each
Packit Service df60bb
	 * time they are used.  The head also contains pointers to three
Packit Service df60bb
	 * user defined functions:
Packit Service df60bb
	 *		- a function to test if a cached userdata matches some keydata
Packit Service df60bb
	 *		- a function to provide a new userdata struct to the cache
Packit Service df60bb
	 *          if there has been a cache miss.
Packit Service df60bb
	 *		- a function to release a userdata struct when it is
Packit Service df60bb
	 *          no longer being managed by the cache
Packit Service df60bb
	 *
Packit Service df60bb
	 * In the event of a cache miss the cache is allowed to grow up to
Packit Service df60bb
	 * a specified maximum size.  After the maximum size is reached then
Packit Service df60bb
	 * the least-recently-used element is discarded to make room for the
Packit Service df60bb
	 * new.  The most-recently-returned value is always left at the
Packit Service df60bb
	 * beginning of the list after retrieval.
Packit Service df60bb
	 *
Packit Service df60bb
	 * In the current implementation the cache is traversed by a linear
Packit Service df60bb
	 * search from most-recent to least-recent.  This linear search
Packit Service df60bb
	 * probably limits the usefulness of this implementation to cache
Packit Service df60bb
	 * sizes of a few tens of elements.
Packit Service df60bb
	 */
Packit Service df60bb
Packit Service df60bb
	/*********************************************************/
Packit Service df60bb
	/* header                                                */
Packit Service df60bb
	/*********************************************************/
Packit Service df60bb
Packit Service df60bb
#include <stdlib.h>
Packit Service df60bb
#ifndef NULL
Packit Service df60bb
#	define NULL (void *)0
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
	/* user defined function templates */
Packit Service df60bb
	typedef int (*gdCacheTestFn_t)(void *userdata, void *keydata);
Packit Service df60bb
	typedef void *(*gdCacheFetchFn_t)(char **error, void *keydata);
Packit Service df60bb
	typedef void (*gdCacheReleaseFn_t)(void *userdata);
Packit Service df60bb
Packit Service df60bb
	/* element structure */
Packit Service df60bb
	typedef struct gdCache_element_s gdCache_element_t;
Packit Service df60bb
	struct gdCache_element_s {
Packit Service df60bb
		gdCache_element_t *next;
Packit Service df60bb
		void *userdata;
Packit Service df60bb
	};
Packit Service df60bb
Packit Service df60bb
	/* head structure */
Packit Service df60bb
	typedef struct gdCache_head_s gdCache_head_t;
Packit Service df60bb
	struct gdCache_head_s {
Packit Service df60bb
		gdCache_element_t *mru;
Packit Service df60bb
		int size;
Packit Service df60bb
		char *error;
Packit Service df60bb
		gdCacheTestFn_t gdCacheTest;
Packit Service df60bb
		gdCacheFetchFn_t gdCacheFetch;
Packit Service df60bb
		gdCacheReleaseFn_t gdCacheRelease;
Packit Service df60bb
	};
Packit Service df60bb
Packit Service df60bb
	/* function templates */
Packit Service df60bb
	gdCache_head_t *gdCacheCreate(int size,
Packit Service df60bb
	                              gdCacheTestFn_t gdCacheTest,
Packit Service df60bb
	                              gdCacheFetchFn_t gdCacheFetch,
Packit Service df60bb
	                              gdCacheReleaseFn_t gdCacheRelease
Packit Service df60bb
	                             );
Packit Service df60bb
Packit Service df60bb
	void gdCacheDelete(gdCache_head_t *head);
Packit Service df60bb
Packit Service df60bb
	void *gdCacheGet(gdCache_head_t *head, void *keydata);
Packit Service df60bb
Packit Service df60bb
#ifdef __cplusplus
Packit Service df60bb
}
Packit Service df60bb
#endif