Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/libsteve/cobbler
A collection of marcos and coding styles to make a dynamic-dispatch object-system in C, as a kind of primitive Objective-C clone.
https://github.com/libsteve/cobbler
Last synced: 15 days ago
JSON representation
A collection of marcos and coding styles to make a dynamic-dispatch object-system in C, as a kind of primitive Objective-C clone.
- Host: GitHub
- URL: https://github.com/libsteve/cobbler
- Owner: libsteve
- Created: 2013-08-31T01:56:54.000Z (over 11 years ago)
- Default Branch: master
- Last Pushed: 2018-03-14T07:00:21.000Z (almost 7 years ago)
- Last Synced: 2024-11-06T07:29:07.315Z (2 months ago)
- Language: C
- Homepage:
- Size: 71.3 KB
- Stars: 4
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Cobbler: A Primitive C Object System
=======Cobbler is an attempt to add objects to the C language in order to better understand the implementations of dynamic object systems such as that of Smalltalk and Objective-C.
Objects, known as `primitives`, are created using C Macros to define their properties and behavior.
Memory management is handled through reference counting, using the `own` and `disown` functions. With `autodiswon`, primitives can be assigned to a thread-specific pool of objects to automatically release at the end of some scope.## Basic Usage
To define a new primitive object, use the `primitive_define()` macro function.
Pass in the name of the primitive, the super primitive, a structure to represent the data, and any virtual methods used. Virtual methods are added using the `using_virtual()` macro function after the structure is defined.primitive_define(my_primitive, primitive, {
int a_number;
char a_char;
},
virtual(my_primitive, create),
virtual(my_primitive, destroy));You can forward-declare the primitive using the `primitive_declare()` macro.
This can be useful when using the `method()` macro for declaring virtual methods for the primitive before you define the primitive itself.primitive_declare(my_primitive)
my_primitive *method(my_primitive, create, int a_number, char a_char);
void method(my_primitive, destroy);
int method(my_primitive, getNumber);primitive_define(my_primitive, primitive, {
int a_number;
char a_char;
},
virtual(my_primitive, create),
virtual(my_primitive, destroy),
virtual(my_primitive, getNumber));The `method()` macro can be used for defining non-virtual methods too.
int method(my_primitive, non_virtual_method);
Virtual methods are called using the `virtual_call()` macro function, whereas non-virtual methods can either be called directly or through the `static_call()` macro function.
The `virtual_call()` macro must be supplied with the return type, followed by the virtual method name, the primitive instance, and then finally any function arguments for the method.
The `static_call()` macro must be supplied with the primitive name, followed by the method name, the primitive instance, and then finally any function arguments for the method.
my_primitive *p = create(my_primitive, 10, 'a');
int result = virtual_call(int, getNumber, p);
int other = static_call(my_primitive, non_virtual_method, p);