Objectively 1.0.0
Ultra-lightweight object oriented framework for GNU C.
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
Macros | Functions
Vector.c File Reference
#include "Config.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "Hash.h"
#include "Vector.h"

Go to the source code of this file.

Macros

#define _Class   _Vector
 
#define VECTOR_CHUNK_SIZE   64
 

Functions

static int _sort (const void *a, const void *b, void *data)
 qsort_r comparator. More...
 
Class_Vector (void)
 
static void addElement (Vector *self, const ident element)
 
static Objectcopy (const Object *self)
 
static void dealloc (Object *self)
 
static void enumerateElements (const Vector *self, VectorEnumerator enumerator, ident data)
 
static void filterElements (Vector *self, Predicate predicate, ident data)
 
static ident findElement (const Vector *self, Predicate predicate, ident data)
 
static int hash (const Object *self)
 
static ssize_t indexOfElement (const Vector *self, const ident element)
 
static void initialize (Class *clazz)
 
static VectorinitWithElements (Vector *self, size_t size, size_t count, ident elements)
 
static VectorinitWithSize (Vector *self, size_t size)
 
static void insertElementAtIndex (Vector *self, const ident element, size_t index)
 
static _Bool isEqual (const Object *self, const Object *other)
 
static ident reduce (const Vector *self, Reducer reducer, ident accumulator, ident data)
 
static void removeAllElements (Vector *self)
 
static void removeElementAtIndex (Vector *self, size_t index)
 
static void resize (Vector *self, size_t capacity)
 
static void sort (Vector *self, Comparator comparator)
 
static VectorvectorWithElements (size_t size, size_t count, ident elements)
 
static VectorvectorWithSize (size_t size)
 

Macro Definition Documentation

◆ _Class

#define _Class   _Vector

Definition at line 33 of file Vector.c.

◆ VECTOR_CHUNK_SIZE

#define VECTOR_CHUNK_SIZE   64

Definition at line 35 of file Vector.c.

Function Documentation

◆ _sort()

static int _sort ( const void *  a,
const void *  b,
void *  data 
)
static

qsort_r comparator.

Definition at line 324 of file Vector.c.

324 {
325 return ((Comparator) data)(((const ident) a), ((const ident) b));
326}
void * ident
The identity type, similar to Objective-C id.
Definition: Types.h:49
Order(* Comparator)(const ident obj1, const ident obj2)
The Comparator function type for ordering Objects.
Definition: Types.h:82
MutableData * data(void)
Returns a new MutableData.
Definition: MutableData.c:75

◆ _Vector()

Class * _Vector ( void  )

Definition at line 387 of file Vector.c.

387 {
388 static Class *clazz;
389 static Once once;
390
391 do_once(&once, {
392 clazz = _initialize(&(const ClassDef) {
393 .name = "Vector",
394 .superclass = _Object(),
395 .instanceSize = sizeof(Vector),
396 .interfaceOffset = offsetof(Vector, interface),
397 .interfaceSize = sizeof(VectorInterface),
399 });
400 });
401
402 return clazz;
403}
Class * _initialize(const ClassDef *def)
Initializes the given Class.
Definition: Class.c:91
static void initialize(Class *clazz)
Definition: Vector.c:359
long Once
The Once type.
Definition: Once.h:37
#define do_once(once, block)
Executes the given block at most one time.
Definition: Once.h:43
ClassDefs are passed to _initialize via an archetype to initialize a Class.
Definition: Class.h:41
The runtime representation of a Class.
Definition: Class.h:95
Class * _Object(void)
The Object archetype.
Definition: Object.c:136
Vectors.
Definition: Vector.h:51

◆ addElement()

static void addElement ( Vector self,
const ident  element 
)
static

Definition at line 109 of file Vector.c.

109 {
110
111 if (self->count == self->capacity) {
112
114
115 if (self->elements) {
116 self->elements = realloc(self->elements, self->capacity * self->size);
117 } else {
118 self->elements = calloc(self->capacity, self->size);
119 }
120
121 assert(self->elements);
122 }
123
124 memcpy(self->elements + self->count * self->size, element, self->size);
125 self->count++;
126}
#define VECTOR_CHUNK_SIZE
Definition: Vector.c:35
size_t count
The count of elements.
Definition: Vector.h:72
size_t capacity
The capacity.
Definition: Vector.h:67
ident elements
The elements.
Definition: Vector.h:82
size_t size
The size of each element.
Definition: Vector.h:77

◆ copy()

static Object * copy ( const Object self)
static
See also
Object::copy(const Object *)

Definition at line 42 of file Vector.c.

42 {
43
44 const Vector *this = (Vector *) self;
45
46 Vector *copy = (Vector *) $(self, copy);
47
48 copy->elements = malloc(this->capacity * this->size);
49 memcpy(copy->elements, this->elements, this->count * this->size);
50
51 return (Object *) copy;
52}
Object is the root Class of The Objectively Class hierarchy.
Definition: Object.h:46
Object * copy(const Object *self)
Creates a shallow copy of this Object.
Definition: Array.c:40

◆ dealloc()

static void dealloc ( Object self)
static
See also
Object::dealloc(Object *)

Definition at line 57 of file Vector.c.

57 {
58
59 Vector *this = (Vector *) self;
60
61 free(this->elements);
62
63 super(Object, self, dealloc);
64}
#define super(type, obj, method,...)
void dealloc(Object *self)
Frees all resources held by this Object.
Definition: Array.c:50

◆ enumerateElements()

static void enumerateElements ( const Vector self,
VectorEnumerator  enumerator,
ident  data 
)
static

Definition at line 132 of file Vector.c.

132 {
133
134 assert(enumerator);
135
136 for (size_t i = 0; i < self->count; i++) {
137 enumerator(self, self->elements + i * self->size, data);
138 }
139}

◆ filterElements()

static void filterElements ( Vector self,
Predicate  predicate,
ident  data 
)
static

Definition at line 145 of file Vector.c.

145 {
146
147 assert(predicate);
148
149 for (size_t i = 0; i < self->count; i++) {
150 if (!predicate(self->elements + i * self->size, data)) {
151 $(self, removeElementAtIndex, i);
152 }
153 }
154}
void removeElementAtIndex(Vector *self, size_t index)
Removes the element at the specified index.
Definition: Vector.c:261

◆ findElement()

static ident findElement ( const Vector self,
Predicate  predicate,
ident  data 
)
static

Definition at line 160 of file Vector.c.

160 {
161
162 assert(predicate);
163
164 for (size_t i = 0; i < self->count; i++) {
165 if (predicate(self->elements + i * self->size, data)) {
166 return self->elements + i * self->size;
167 }
168 }
169
170 return NULL;
171}

◆ hash()

static int hash ( const Object self)
static
See also
Object::hash(const Object *)

Definition at line 69 of file Vector.c.

69 {
70
71 Vector *this = (Vector *) self;
72
73 const Range range = {
74 .location = 0,
75 .length = this->count * this->size
76 };
77
78 return HashForBytes(HASH_SEED, this->elements, range);
79}
int HashForBytes(int hash, const uint8_t *bytes, const Range range)
Accumulates the hash value of bytes into hash.
Definition: Hash.c:28
#define HASH_SEED
The hash seed value.
Definition: Hash.h:37
A location and length into contiguous collections.
Definition: Types.h:54
ssize_t location
The location.
Definition: Types.h:59

◆ indexOfElement()

static ssize_t indexOfElement ( const Vector self,
const ident  element 
)
static

Definition at line 177 of file Vector.c.

177 {
178
179 for (size_t i = 0; i < self->count; i++) {
180 if (memcmp(self->elements + i * self->size, element, self->size) == 0) {
181 return i;
182 }
183 }
184
185 return -1;
186}

◆ initialize()

static void initialize ( Class clazz)
static
See also
Class::initialize(Class *)

Definition at line 359 of file Vector.c.

359 {
360
361 ((ObjectInterface *) clazz->interface)->copy = copy;
362 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
363 ((ObjectInterface *) clazz->interface)->hash = hash;
364 ((ObjectInterface *) clazz->interface)->isEqual = isEqual;
365
366 ((VectorInterface *) clazz->interface)->addElement = addElement;
367 ((VectorInterface *) clazz->interface)->enumerateElements = enumerateElements;
368 ((VectorInterface *) clazz->interface)->filterElements = filterElements;
369 ((VectorInterface *) clazz->interface)->findElement = findElement;
370 ((VectorInterface *) clazz->interface)->indexOfElement = indexOfElement;
371 ((VectorInterface *) clazz->interface)->initWithElements = initWithElements;
372 ((VectorInterface *) clazz->interface)->initWithSize = initWithSize;
373 ((VectorInterface *) clazz->interface)->insertElementAtIndex = insertElementAtIndex;
374 ((VectorInterface *) clazz->interface)->reduce = reduce;
375 ((VectorInterface *) clazz->interface)->removeAllElements = removeAllElements;
376 ((VectorInterface *) clazz->interface)->removeElementAtIndex = removeElementAtIndex;
377 ((VectorInterface *) clazz->interface)->resize = resize;
378 ((VectorInterface *) clazz->interface)->sort = sort;
379 ((VectorInterface *) clazz->interface)->vectorWithSize = vectorWithSize;
380 ((VectorInterface *) clazz->interface)->vectorWithElements = vectorWithElements;
381}
ident reduce(const Array *self, Reducer reducer, ident accumulator, ident data)
Definition: Array.c:405
ident interface
The interface of the Class.
Definition: Class.h:105
void sort(MutableArray *self, Comparator comparator)
Sorts this MutableArray in place using comparator.
Definition: MutableArray.c:314
_Bool isEqual(const Object *self, const Object *other)
Tests equality of the other Object.
Definition: Array.c:96
int hash(const Object *self)
Definition: Array.c:80
ident findElement(const Vector *self, Predicate predicate, ident data)
Definition: Vector.c:160
void addElement(Vector *self, const ident element)
Adds the specified element to this Vector.
Definition: Vector.c:109
void resize(Vector *self, size_t capacity)
Resizes this Vector to the specified capacity.
Definition: Vector.c:276
Vector * vectorWithSize(size_t size)
Creates a new Vector with the specified element size.
Definition: Vector.c:342
Vector * vectorWithElements(size_t size, size_t count, ident elements)
Creates a new Vector with the specified elements.
Definition: Vector.c:350
Vector * initWithElements(Vector *self, size_t size, size_t count, ident elements)
Initializes this Vector with the specified elements.
Definition: Vector.c:192
Vector * initWithSize(Vector *self, size_t size)
Initializes this Vector with the specified element size.
Definition: Vector.c:207
void removeAllElements(Vector *self)
Removes all elements from this Vector without modifying its capacity.
Definition: Vector.c:253
void insertElementAtIndex(Vector *self, const ident element, size_t index)
Inserts the element at the specified index.
Definition: Vector.c:221
ssize_t indexOfElement(const Vector *self, const ident element)
Definition: Vector.c:177
void filterElements(Vector *self, Predicate predicate, ident data)
Definition: Vector.c:145
void enumerateElements(const Vector *self, VectorEnumerator enumerator, ident data)
Enumerates the elements of this Vector with the given function.
Definition: Vector.c:132

◆ initWithElements()

static Vector * initWithElements ( Vector self,
size_t  size,
size_t  count,
ident  elements 
)
static

Definition at line 192 of file Vector.c.

192 {
193
194 self = $(self, initWithSize, size);
195 if (self) {
196 self->count = count;
197 self->elements = elements;
198 }
199
200 return self;
201}

◆ initWithSize()

static Vector * initWithSize ( Vector self,
size_t  size 
)
static

Definition at line 207 of file Vector.c.

207 {
208
209 self = (Vector *) super(Object, self, init);
210 if (self) {
211 self->size = size;
212 assert(self->size);
213 }
214 return self;
215}
Condition * init(Condition *self)
Initializes this Condition.
Definition: Condition.c:67

◆ insertElementAtIndex()

static void insertElementAtIndex ( Vector self,
const ident  element,
size_t  index 
)
static

Definition at line 221 of file Vector.c.

221 {
222
223 assert(index <= self->count);
224
225 $(self, addElement, element);
226
227 for (size_t i = self->count - 1; i > index; i--) {
228 memcpy(self->elements + i * self->size, self->elements + (i - 1) * self->size, self->size);
229 }
230
231 memcpy(self->elements + index * self->size, element, self->size);
232}

◆ isEqual()

static _Bool isEqual ( const Object self,
const Object other 
)
static
See also
Object::isEqual(const Object *, const Object *)

Definition at line 84 of file Vector.c.

84 {
85
86 if (super(Object, self, isEqual, other)) {
87 return true;
88 }
89
90 if (other && $(other, isKindOfClass, _Vector())) {
91
92 const Vector *this = (Vector *) self;
93 const Vector *that = (Vector *) other;
94
95 if (this->count == that->count) {
96 return memcmp(this->elements, that->elements, this->count * this->size) == 0;
97 }
98 }
99
100 return false;
101}
_Bool isKindOfClass(const Object *self, const Class *clazz)
Tests for Class hierarchy membership.
Definition: Object.c:101
Class * _Vector(void)
The Vector archetype.
Definition: Vector.c:387

◆ reduce()

static ident reduce ( const Vector self,
Reducer  reducer,
ident  accumulator,
ident  data 
)
static

Definition at line 238 of file Vector.c.

238 {
239
240 assert(reducer);
241
242 for (size_t i = 0; i < self->count; i++) {
243 accumulator = reducer(self->elements + i * self->size, accumulator, data);
244 }
245
246 return accumulator;
247}

◆ removeAllElements()

static void removeAllElements ( Vector self)
static

Definition at line 253 of file Vector.c.

253 {
254 self->count = 0;
255}

◆ removeElementAtIndex()

static void removeElementAtIndex ( Vector self,
size_t  index 
)
static

Definition at line 261 of file Vector.c.

261 {
262
263 assert(index < self->count);
264
265 const size_t size = (self->count - index) * self->size;
266
267 memcpy(self->elements + index * self->size, self->elements + (index + 1) * self->size, size);
268
269 self->count--;
270}

◆ resize()

static void resize ( Vector self,
size_t  capacity 
)
static

Definition at line 276 of file Vector.c.

276 {
277
278 self->elements = realloc(self->elements, capacity * self->size);
279 assert(self->elements);
280
281 self->capacity = capacity;
282 self->count = min(self->count, self->capacity);
283}
#define min(a, b)
Definition: Types.h:159

◆ sort()

static void sort ( Vector self,
Comparator  comparator 
)
static

Definition at line 332 of file Vector.c.

332 {
333 qsort_r(self->elements, self->count, self->size, _sort, comparator);
334}
static int _sort(const void *a, const void *b, void *data)
qsort_r comparator.
Definition: Vector.c:324

◆ vectorWithElements()

static Vector * vectorWithElements ( size_t  size,
size_t  count,
ident  elements 
)
static

Definition at line 350 of file Vector.c.

350 {
351 return $(alloc(Vector), initWithElements, size, count, elements);
352}
#define alloc(type)
Allocate and initialize and instance of type.
Definition: Class.h:159

◆ vectorWithSize()

static Vector * vectorWithSize ( size_t  size)
static

Definition at line 342 of file Vector.c.

342 {
343 return $(alloc(Vector), initWithSize, size);
344}