⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ocache.h

📁 android-w.song.android.widget
💻 H
字号:
/* ocache.h -- a minimal object caching implementation. *//* Copyright (C) 2002 Free Software Foundation, Inc.   This file is part of GNU Bash, the Bourne Again SHell.   Bash 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 3 of the License, or   (at your option) any later version.   Bash 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 Bash.  If not, see <http://www.gnu.org/licenses/>.*/#if !defined (_OCACHE_H_)#define	_OCACHE_H_ 1#ifndef PTR_T#if defined (__STDC__)#  define PTR_T void *#else#  define PTR_T char *#endif#endif /* PTR_T */#define OC_MEMSET(memp, xch, nbytes)					\do {									\  if ((nbytes) <= 32) {							\    register char * mzp = (char *)(memp);				\    unsigned long mctmp = (nbytes);					\    register long mcn;							\    if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp &= 7; }	\    switch (mctmp) {							\      case 0: for(;;) { *mzp++ = xch;					\      case 7:	   *mzp++ = xch;					\      case 6:	   *mzp++ = xch;					\      case 5:	   *mzp++ = xch;					\      case 4:	   *mzp++ = xch;					\      case 3:	   *mzp++ = xch;					\      case 2:	   *mzp++ = xch;					\      case 1:	   *mzp++ = xch; if(mcn <= 0) break; mcn--; }		\    }									\  } else								\    memset ((memp), (xch), (nbytes));					\} while(0)typedef struct objcache {	PTR_T	data;	int	cs;		/* cache size, number of objects */	int	nc;		/* number of cache entries */} sh_obj_cache_t;/* Create an object cache C of N pointers to OTYPE. */#define ocache_create(c, otype, n) \	do { \		(c).data = xmalloc((n) * sizeof (otype *)); \		(c).cs = (n); \		(c).nc = 0; \	} while (0)/* Destroy an object cache C. */#define ocache_destroy(c) \	do { \		if ((c).data) \			xfree ((c).data); \		(c).data = 0; \		(c).cs = (c).nc = 0; \	} while (0)/* Free all cached items, which are pointers to OTYPE, in object cache C. */#define ocache_flush(c, otype) \	do { \		while ((c).nc > 0) \			xfree (((otype **)((c).data))[--(c).nc]); \	} while (0)/* * Allocate a new item of type pointer to OTYPE, using data from object * cache C if any cached items exist, otherwise calling xmalloc.  Return * the object in R. */#define ocache_alloc(c, otype, r) \	do { \		if ((c).nc > 0) { \			(r) = (otype *)((otype **)((c).data))[--(c).nc]; \		} else \			(r) = (otype *)xmalloc (sizeof (otype)); \	} while (0)/* * Free an item R of type pointer to OTYPE, adding to object cache C if * there is room and calling xfree if the cache is full.  If R is added * to the object cache, the contents are scrambled. */#define ocache_free(c, otype, r) \	do { \		if ((c).nc < (c).cs) { \			OC_MEMSET ((r), 0xdf, sizeof(otype)); \			((otype **)((c).data))[(c).nc++] = (r); \		} else \			xfree (r); \	} while (0)/* * One may declare and use an object cache as (for instance): * *	sh_obj_cache_t wdcache = {0, 0, 0}; *	sh_obj_cache_t wlcache = {0, 0, 0}; * *	ocache_create(wdcache, WORD_DESC, 30); *	ocache_create(wlcache, WORD_LIST, 30); * *	WORD_DESC *wd; *	ocache_alloc (wdcache, WORD_DESC, wd); * *	WORD_LIST *wl; *	ocache_alloc (wlcache, WORD_LIST, wl); * *	ocache_free(wdcache, WORD_DESC, wd); *	ocache_free(wlcache, WORD_LIST, wl); * * The use is almost arbitrary. */#endif /* _OCACHE_H  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -