• OOP in C...

    From Chris M. Thomasson@[email protected] to comp.lang.c on Sun Oct 25 13:58:36 2026
    From Newsgroup: comp.lang.c

    Fwiw, google groups seems to be working again! Found an older OOP thing
    I made:

    https://pastebin.com/raw/f52a443b1
    (no ads, no shit...)


    /* 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;
    }

    --- Synchronet 3.22a-Linux NewsLink 1.2