bag.c

来自「Object-Oriented Programming With ANSI-C这」· C语言 代码 · 共 84 行

C
84
字号
#include <assert.h>#include <stdio.h>#include <stdlib.h>#include "new.h"#include "Set.h"#include "Object.h"struct Set { unsigned count; };struct Object { unsigned count; struct Set * in; };static const size_t _Set = sizeof(struct Set);static const size_t _Object = sizeof(struct Object);const void * Set = & _Set;const void * Object = & _Object;void * new (const void * type, ...){	const size_t size = * (const size_t *) type;	void * p = calloc(1, size);	assert(p);	return p;}void delete (void * item){	free(item);}void * add (void * _set, const void * _element){	struct Set * set = _set;	struct Object * element = (void *) _element;	assert(set);	assert(element);	if (! element -> in)		element -> in = set;	else		assert(element -> in == set);	++ element -> count, ++ set -> count;	return element;}void * find (const void * _set, const void * _element){	const struct Object * element = _element;	assert(_set);	assert(element);	return element -> in == _set ? (void *) element : 0;}int contains (const void * _set, const void * _element){	return find(_set, _element) != 0;}void * drop (void * _set, const void * _element){	struct Set * set = _set;	struct Object * element = find(set, _element);	if (element)	{	if (-- element -> count == 0)			element -> in = 0;		-- set -> count;	}	return element;}unsigned count (const void * _set){	const struct Set * set = _set;	assert(set);	return set -> count;}int differ (const void * a, const void * b){	return a != b;}

⌨️ 快捷键说明

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