Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Interfaces
- ____________________________________________________________________*/
- #include <stddef.h>
- struct object_prv_vtable {
- int (*fp_destroy) (void* const);
- };
- struct device_prv_vtable {
- int (*fp_read) (void* const, void*, size_t);
- int (*fp_write) (void* const, void const*, size_t);
- };
- struct device_vtable {
- struct object_prv_vtable const object;
- struct device_prv_vtable const device;
- };
- struct device {
- struct device_vtable const* vtable;
- };
- #define object_destroy(mp_self) ( \
- (mp_self)->vtable->object.fp_destroy((mp_self)) \
- )
- #define device_read(mp_self, mp_buf, mp_size) ( \
- (mp_self)->vtable->device.fp_read((mp_self), (mp_buf), (mp_size)) \
- )
- #define device_write(mp_self, mp_buf, mp_size) ( \
- (mp_self)->vtable->device.fp_write((mp_self), (mp_buf), (mp_size)) \
- )
- /* Sample Header (usb_drive.h)
- ____________________________________________________________________*/
- #if ! defined(USB_HEADER_H)
- #define USB_HEADER_H
- extern int usb_drive_create(struct device** const);
- #endif
- /* Sample Impl (usb_drive.c)
- ____________________________________________________________________*/
- /* #include "usb_drive.c" */
- #include <stdio.h>
- #include <stdlib.h>
- struct usb_drive {
- struct device device;
- /* whatever */
- };
- static int usb_drive_object_destroy(void* const);
- static int usb_drive_device_read(void* const, void*, size_t);
- static int usb_drive_device_write(void* const, void const*, size_t);
- static struct device_vtable const g_table = {
- { /* object */
- usb_drive_object_destroy
- },
- { /* device */
- usb_drive_device_read,
- usb_drive_device_write
- }
- };
- int usb_drive_create(
- struct device** const pself
- ) {
- struct usb_drive* const self = malloc(sizeof(*self));
- if (self) {
- self->device.vtable = &g_table;
- *pself = &self->device;
- return 0;
- }
- return -1;
- }
- int usb_drive_object_destroy(
- void* const self_
- ) {
- struct usb_drive* const self = self_;
- printf("usb_drive_object_destroy(%p)\n", (void*)self);
- free(self_);
- return 0;
- }
- int usb_drive_device_read(
- void* const self_,
- void* buf,
- size_t size
- ) {
- struct usb_drive* const self = self_;
- printf("usb_drive_device_read(%p, %p, %lu)\n",
- (void*)self, buf, (unsigned long)size);
- return 0;
- }
- int usb_drive_device_write(
- void* const self_,
- void const* buf,
- size_t size
- ) {
- struct usb_drive* const self = self_;
- printf("usb_drive_device_write(%p, %p, %lu)\n",
- (void*)self, buf, (unsigned long)size);
- return 0;
- }
- /* Sample Application
- ____________________________________________________________________*/
- void read_write(
- struct device* const self
- ) {
- char buf[100];
- device_read(self, buf, 50);
- device_write(self, buf, 5);
- }
- int main(void) {
- struct device* a_device;
- if (! usb_drive_create(&a_device)) {
- read_write(a_device);
- object_destroy(a_device);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment