Creating a Generic Circular Buffer

c, circular-buffer

Solution

As you've found out, you can't automatically tell the size of an unknown piece of data. You'll need either a fixed element type (`void*` would be a good generic choice), or have the user pass in the size of each element:

CircularBuffer *cbInit(uint16 size, int elementSize)
{
    ...
    buffer->elementSize = elementSize;
    buffer->elements    = calloc(size, elementSize);  
}

Problem

Given the desire to abstract the structure of a circular buffer from its content, and starting from the following code segments (courtesy of this wikipedia entry): ``` typedef struct { int value; } ElemType; typedef struct { int size; /* total number of elements */ int start; /* index of oldest element */ int count; /* index at which to write new element */ ElemType *elements; /* vector of elements */ } CircularBuffer; void cbInit(CircularBuffer *cb, int size) { cb->size = size; cb->start = 0; cb->count = 0; cb->elements = (ElemType *)calloc(cb->size, sizeof(ElemType)); } ``` How does one abstract the element type so that it is specified when an instance of the CircularBuffer is defined? My attempt thus far is as follows: ``` CircularBuffer *cbInit(uint16 size, void *element) { CircularBuffer *buffer; buffer = malloc(sizeof(*buffer)); if (buffer != NULL) { buffer->size = size; buffer->start = 0; buffer->count = 0; buffer->elements = (void *)calloc(size, sizeof(???)); if (buffer->elements == NULL) { free(buffer); buffer = NULL; } } return buffer; } ``` But I cannot figure out how to determine the size of an unknown type, which may be an int, a struct, or anything in between. Is what I am attempting to do even possible?

Original source