Objectively
Ultra-lightweight object oriented framework for GNU C.
Loading...
Searching...
No Matches
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.
 
Class_Vector (void)
 
static void add (Vector *self, const ident element)
 
static Objectcopy (const Object *self)
 
static void dealloc (Object *self)
 
static void enumerate (const Vector *self, VectorEnumerator enumerator, ident data)
 
static void filter (Vector *self, Predicate predicate, ident data)
 
static ident find (const Vector *self, Predicate predicate, ident data)
 
static int hash (const Object *self)
 
static ssize_t indexOf (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 insert (Vector *self, const ident element, size_t index)
 
static bool isEqual (const Object *self, const Object *other)
 
static VectormappedVector (const Vector *self, Functor functor, ident data)
 
static ident reduce (const Vector *self, Reducer reducer, ident accumulator, ident data)
 
static void removeAll (Vector *self)
 
static void removeAt (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 364 of file Vector.c.

364 {
365 return ((Comparator) data)(((const ident) a), ((const ident) b));
366}
static Data * data(void)
Definition Data.c:286
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

◆ _Vector()

Class * _Vector ( void  )

Definition at line 428 of file Vector.c.

428 {
429 static Class *clazz;
430 static Once once;
431
432 do_once(&once, {
433 clazz = _initialize(&(const ClassDef) {
434 .name = "Vector",
435 .superclass = _Object(),
436 .instanceSize = sizeof(Vector),
437 .interfaceOffset = offsetof(Vector, interface),
438 .interfaceSize = sizeof(VectorInterface),
440 });
441 });
442
443 return clazz;
444}
Class * _initialize(const ClassDef *def)
Initializes the given Class.
Definition Class.c:86
Class * _Object(void)
Definition Object.c:136
static void initialize(Class *clazz)
Definition Vector.c:399
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
Vectors.
Definition Vector.h:51

◆ add()

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

Definition at line 116 of file Vector.c.

116 {
117
118 if (self->count == self->capacity) {
119
121
122 if (self->elements) {
123 self->elements = realloc(self->elements, self->capacity * self->size);
124 } else {
125 self->elements = calloc(self->capacity, self->size);
126 }
127
128 assert(self->elements);
129 }
130
131 memcpy(self->elements + self->count * self->size, element, self->size);
132 self->count++;
133}
#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 *that = $(alloc(Vector), initWithSize, this->size);
47
48 free(that->elements);
49 that->elements = malloc(this->capacity * this->size);
50 assert(that->elements);
51 memcpy(that->elements, this->elements, this->count * this->size);
52 that->count = this->count;
53 that->capacity = this->capacity;
54 that->destroy = this->destroy;
55
56 return (Object *) that;
57}
static void destroy(Class *clazz)
Definition Boole.c:102
#define alloc(type)
Allocate and initialize and instance of type.
Definition Class.h:176
static Vector * initWithSize(Vector *self, size_t size)
Definition Vector.c:214
Object is the root Class of The Objectively Class hierarchy.
Definition Object.h:46
Consumer destroy
Optional destructor called when an element is removed.
Definition Vector.h:90

◆ dealloc()

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

Definition at line 62 of file Vector.c.

62 {
63
64 Vector *this = (Vector *) self;
65
66 $(this, removeAll);
67
68 free(this->elements);
69
70 super(Object, self, dealloc);
71}
#define super(type, obj, method,...)
static void removeAll(Vector *self)
Definition Vector.c:276
static void dealloc(Object *self)
Definition Vector.c:62

◆ enumerate()

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

Definition at line 139 of file Vector.c.

139 {
140
141 assert(enumerator);
142
143 for (size_t i = 0; i < self->count; i++) {
144 enumerator(self, self->elements + i * self->size, data);
145 }
146}

◆ filter()

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

Definition at line 152 of file Vector.c.

152 {
153
154 assert(predicate);
155
156 for (size_t i = 0; i < self->count; i++) {
157 if (!predicate(self->elements + i * self->size, data)) {
158 $(self, removeAt, i);
159 }
160 }
161}
static void removeAt(Vector *self, size_t index)
Definition Vector.c:291

◆ find()

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

Definition at line 167 of file Vector.c.

167 {
168
169 assert(predicate);
170
171 for (size_t i = 0; i < self->count; i++) {
172 if (predicate(self->elements + i * self->size, data)) {
173 return self->elements + i * self->size;
174 }
175 }
176
177 return NULL;
178}

◆ hash()

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

Definition at line 76 of file Vector.c.

76 {
77
78 Vector *this = (Vector *) self;
79
80 const Range range = {
81 .location = 0,
82 .length = this->count * this->size
83 };
84
85 return HashForBytes(HASH_SEED, this->elements, range);
86}
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

◆ indexOf()

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

Definition at line 184 of file Vector.c.

184 {
185
186 for (size_t i = 0; i < self->count; i++) {
187 if (memcmp(self->elements + i * self->size, element, self->size) == 0) {
188 return i;
189 }
190 }
191
192 return -1;
193}

◆ initialize()

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

Definition at line 399 of file Vector.c.

399 {
400
401 ((ObjectInterface *) clazz->interface)->copy = copy;
402 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
403 ((ObjectInterface *) clazz->interface)->hash = hash;
404 ((ObjectInterface *) clazz->interface)->isEqual = isEqual;
405
406 ((VectorInterface *) clazz->interface)->add = add;
407 ((VectorInterface *) clazz->interface)->enumerate = enumerate;
408 ((VectorInterface *) clazz->interface)->filter = filter;
409 ((VectorInterface *) clazz->interface)->find = find;
410 ((VectorInterface *) clazz->interface)->indexOf = indexOf;
411 ((VectorInterface *) clazz->interface)->initWithElements = initWithElements;
412 ((VectorInterface *) clazz->interface)->initWithSize = initWithSize;
413 ((VectorInterface *) clazz->interface)->insert = insert;
414 ((VectorInterface *) clazz->interface)->mappedVector = mappedVector;
415 ((VectorInterface *) clazz->interface)->reduce = reduce;
416 ((VectorInterface *) clazz->interface)->removeAll = removeAll;
417 ((VectorInterface *) clazz->interface)->removeAt = removeAt;
418 ((VectorInterface *) clazz->interface)->resize = resize;
419 ((VectorInterface *) clazz->interface)->sort = sort;
420 ((VectorInterface *) clazz->interface)->vectorWithElements = vectorWithElements;
421 ((VectorInterface *) clazz->interface)->vectorWithSize = vectorWithSize;
422}
static ident reduce(const Vector *self, Reducer reducer, ident accumulator, ident data)
Definition Vector.c:261
static ident find(const Vector *self, Predicate predicate, ident data)
Definition Vector.c:167
static void add(Vector *self, const ident element)
Definition Vector.c:116
static bool isEqual(const Object *self, const Object *other)
Definition Vector.c:91
static void resize(Vector *self, size_t capacity)
Definition Vector.c:310
static void filter(Vector *self, Predicate predicate, ident data)
Definition Vector.c:152
static Vector * initWithElements(Vector *self, size_t size, size_t count, ident elements)
Definition Vector.c:199
static ssize_t indexOf(const Vector *self, const ident element)
Definition Vector.c:184
static void enumerate(const Vector *self, VectorEnumerator enumerator, ident data)
Definition Vector.c:139
static Vector * vectorWithElements(size_t size, size_t count, ident elements)
Definition Vector.c:382
static Vector * vectorWithSize(size_t size)
Definition Vector.c:390
static void insert(Vector *self, const ident element, size_t index)
Definition Vector.c:228
static Vector * mappedVector(const Vector *self, Functor functor, ident data)
Definition Vector.c:245
static Object * copy(const Object *self)
Definition Vector.c:42
static void sort(Vector *self, Comparator comparator)
Definition Vector.c:372
static int hash(const Object *self)
Definition Vector.c:76
ident interface
The interface of the Class.
Definition Class.h:105
void dealloc(Object *self)
Frees all resources held by this Object.
Definition Array.c:99
ident reduce(const Vector *self, Reducer reducer, ident accumulator, ident data)
Definition Vector.c:261
Vector * vectorWithSize(size_t size)
Creates a new Vector with the specified element size.
Definition Vector.c:390
void insert(Vector *self, const ident element, size_t index)
Inserts the element at the specified index.
Definition Vector.c:228
Vector * initWithSize(Vector *self, size_t size)
Initializes this Vector with the specified element size.
Definition Vector.c:214

◆ initWithElements()

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

Definition at line 199 of file Vector.c.

199 {
200
201 self = $(self, initWithSize, size);
202 if (self) {
203 self->count = count;
204 self->elements = elements;
205 }
206
207 return self;
208}

◆ initWithSize()

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

Definition at line 214 of file Vector.c.

214 {
215
216 self = (Vector *) super(Object, self, init);
217 if (self) {
218 self->size = size;
219 assert(self->size);
220 }
221 return self;
222}
static Array * init(Array *self)
Definition Array.c:420

◆ insert()

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

Definition at line 228 of file Vector.c.

228 {
229
230 assert(index <= self->count);
231
232 $(self, add, element);
233
234 for (size_t i = self->count - 1; i > index; i--) {
235 memcpy(self->elements + i * self->size, self->elements + (i - 1) * self->size, self->size);
236 }
237
238 memcpy(self->elements + index * self->size, element, self->size);
239}

◆ isEqual()

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

Definition at line 91 of file Vector.c.

91 {
92
93 if (super(Object, self, isEqual, other)) {
94 return true;
95 }
96
97 if (other && $(other, isKindOfClass, _Vector())) {
98
99 const Vector *this = (Vector *) self;
100 const Vector *that = (Vector *) other;
101
102 if (this->count == that->count) {
103 return memcmp(this->elements, that->elements, this->count * this->size) == 0;
104 }
105 }
106
107 return false;
108}
static bool isKindOfClass(const Object *self, const Class *clazz)
Definition Object.c:101
Class * _Vector(void)
Definition Vector.c:428

◆ mappedVector()

static Vector * mappedVector ( const Vector self,
Functor  functor,
ident  data 
)
static

Definition at line 245 of file Vector.c.

245 {
246
247 assert(functor);
248
249 Vector *vector = $(alloc(Vector), initWithSize, self->size);
250 for (size_t i = 0; i < self->count; i++) {
251 ident result = functor(self->elements + i * self->size, data);
252 $(vector, add, result);
253 }
254 return vector;
255}

◆ reduce()

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

Definition at line 261 of file Vector.c.

261 {
262
263 assert(reducer);
264
265 for (size_t i = 0; i < self->count; i++) {
266 accumulator = reducer(self->elements + i * self->size, accumulator, data);
267 }
268
269 return accumulator;
270}

◆ removeAll()

static void removeAll ( Vector self)
static

Definition at line 276 of file Vector.c.

276 {
277
278 if (self->destroy) {
279 for (size_t i = 0; i < self->count; i++) {
280 self->destroy(self->elements + i * self->size);
281 }
282 }
283
284 self->count = 0;
285}

◆ removeAt()

static void removeAt ( Vector self,
size_t  index 
)
static

Definition at line 291 of file Vector.c.

291 {
292
293 assert(index < self->count);
294
295 if (self->destroy) {
296 self->destroy(self->elements + index * self->size);
297 }
298
299 const size_t size = (self->count - index - 1) * self->size;
300
301 memmove(self->elements + index * self->size, self->elements + (index + 1) * self->size, size);
302
303 self->count--;
304}

◆ resize()

static void resize ( Vector self,
size_t  capacity 
)
static

Definition at line 310 of file Vector.c.

310 {
311
312 if (self->destroy) {
313 for (size_t i = capacity; i < self->count; i++) {
314 self->destroy(self->elements + i * self->size);
315 }
316 }
317
318 self->elements = realloc(self->elements, capacity * self->size);
319 assert(self->elements);
320
321 self->capacity = capacity;
322 self->count = min(self->count, self->capacity);
323}
#define min(a, b)
Definition Types.h:159

◆ sort()

static void sort ( Vector self,
Comparator  comparator 
)
static

Definition at line 372 of file Vector.c.

372 {
373 qsort_r(self->elements, self->count, self->size, _sort, comparator);
374}
static int _sort(const void *a, const void *b, void *data)
qsort_r comparator.
Definition Vector.c:364

◆ vectorWithElements()

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

Definition at line 382 of file Vector.c.

382 {
383 return $(alloc(Vector), initWithElements, size, count, elements);
384}

◆ vectorWithSize()

static Vector * vectorWithSize ( size_t  size)
static

Definition at line 390 of file Vector.c.

390 {
391 return $(alloc(Vector), initWithSize, size);
392}