From 703e1956988170b90841330bc282d1dab2f26f3c Mon Sep 17 00:00:00 2001 From: Thomas Harning Jr Date: Fri, 14 Dec 2007 23:34:10 -0500 Subject: [PATCH] core: Reorganized output_item_ops struct to help manage optionals. Added inline function accessors. --- core/include/output_item.h | 30 ++++++++++++++++++++------ core/src/output/memory.c | 12 ++++------- core/src/output/output_item.inc | 48 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 core/src/output/output_item.inc diff --git a/core/include/output_item.h b/core/include/output_item.h index a5b3648..6a57a63 100644 --- a/core/include/output_item.h +++ b/core/include/output_item.h @@ -12,26 +12,42 @@ struct output_item_t; typedef struct output_item_t output_item; typedef struct { - void (*added_to)(output_item *this, output_item *target); size_t (*get_size)(output_item *this); - void (*prepare)(output_item *this); /* Handle windows handles? */ /* TODO: Define return values */ int (*send)(output_item* this, int fd, int fdtype); size_t (*remaining)(output_item *this); - void (*on_complete)(output_item *this); - /* Error codes? Strings? */ - void (*on_error)(output_item *this); void (*release)(output_item *this); + /* prepare and on_* -> Optional */ + void (*prepare)(output_item *this); + void (*on_complete)(output_item *this); + void (*on_error)(output_item *this, int status); } output_item_ops; struct output_item_t { output_item_ops *ops; - /* User callbacks */ + /* User callbacks : Optional */ void (*on_complete)(output_item *this); - void (*on_error)(output_item *this); + void (*on_error)(output_item *this, int status); }; +size_t output_get_size(output_item *item); + +void output_prepare(output_item *item); + +int output_send(output_item *item, int fd, int fdtype); + +size_t output_remaining(output_item *item); + +void output_on_complete(output_item *item); + +void output_on_error(output_item *item, int status); + +void output_release(output_item *item); + + +#include "../src/output/output_item.inc" + #endif diff --git a/core/src/output/memory.c b/core/src/output/memory.c index fa6fef9..0a4ee6f 100644 --- a/core/src/output/memory.c +++ b/core/src/output/memory.c @@ -47,14 +47,10 @@ static void memory_release(output_item *this) { } static output_item_ops memory_output_item_ops = { - NULL, /* Added to */ - memory_get_size, - NULL, /* Prepare */ - memory_send, - memory_remaining, - NULL, - NULL, - memory_release + .get_size = memory_get_size, + .send = memory_send, + .remaining = memory_remaining, + .release = memory_release }; /* If an error occurs, and 'owns' is set, the data never changes ownership */ diff --git a/core/src/output/output_item.inc b/core/src/output/output_item.inc new file mode 100644 index 0000000..cc29ea6 --- /dev/null +++ b/core/src/output/output_item.inc @@ -0,0 +1,48 @@ +/* output_item inlined code */ + +#include + +#ifndef INLINE +#define INLINE inline +#endif + +INLINE size_t output_get_size(output_item *item) { + assert(item->ops && item->ops->get_size); + return item->ops->get_size(item); +} + +INLINE void output_prepare(output_item *item) { + assert(item->ops); + if(item->ops->prepare) + item->ops->prepare(item); +} + +INLINE int output_send(output_item *item, int fd, int fdtype) { + assert(item->ops && item->ops->send); + return item->ops->send(item, fd, fdtype); +} + +INLINE size_t output_remaining(output_item *item) { + assert(item->ops && item->ops->remaining); + return item->ops->remaining(item); +} + +INLINE void output_on_complete(output_item *item) { + assert(item->ops); + if(item->on_complete) + item->on_complete(item); + if(item->ops->on_complete) + item->ops->on_complete(item); +} + +INLINE void output_on_error(output_item *item, int status) { + assert(item->ops); + if(item->on_error) + item->on_error(item, status); + if(item->ops->on_error) + item->ops->on_error(item, status); +} +INLINE void output_release(output_item *item) { + assert(item->ops && item->ops->release); + item->ops->release(item); +} -- 2.11.4.GIT