- 论坛徽章:
- 0
|
main.c
- #include <stdio.h>
- #include "Object.h"
- #include "new.h"
- #include "Set.h"
- int main ()
- {
- void * s = new(Set);
- void * a = add(s, new(Object));
- void * b = add(s, new(Object));
- void * c = new(Object);
- if (contains(s, a) && contains(s, b))
- puts("ok");
- if (contains(s, c))
- puts("contains?");
- if (differ(a, add(s, a)))
- puts("differ?");
- if (contains(s, drop(s, a)))
- puts("drop?");
- delete(drop(s, b));
- delete(drop(s, c));
- return 0;
- }
复制代码
new.h
- void * new (const void * type, ...);
- void delete (void * item);
复制代码
Object.h
- void * new (const void * type, ...);
- void delete (void * item);
复制代码
Set.c
- #include <assert.h>
- void * new (const void * type, ...)
- {
- const unsigned size = * (const unsigned *) 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;
- }
- int differ (const void * a, const void * b)
- {
- return a != b;
- }
- unsigned count (const void * _set)
- {
- const struct Set * set = _set;
- assert(set);
- return set -> count;
- }
- Set.h
- [code]
- #ifndef SET_H
- #define SET_H
- struct Set
- {
- unsigned count;
- };
- struct Object
- {
- unsigned count;
- struct Set * in;
- };
- static const unsigned _Set = sizeof(struct Set);
- static const unsigned _Object = sizeof(struct Object);
- const void * Set = &_Set;
- const void * Object = &_Object;
- void * add (void * set, const void * element);
- void * find (const void * set, const void * element);
- void * drop (void * set, const void * element);
- int contains (const void * set, const void * element);
- #endif
复制代码
[/code] |
|