Objectively 1.0.0
Ultra-lightweight object oriented framework for GNU C.
Properties | Methods | Protected Attributes
Vector Struct Reference

#include <Vector.h>

Overview

Vectors.

Definition at line 51 of file Vector.h.

Inheritance diagram for Vector:
Object

Properties

size_t capacity
 The capacity. More...
 
size_t count
 The count of elements. More...
 
ident elements
 The elements. More...
 
Object object
 The superclass. More...
 
size_t size
 The size of each element. More...
 
- Properties inherited from Object
Classclazz
 Every instance of Object begins with a pointer to its Class. More...
 

Methods

Class_Vector (void)
 The Vector archetype. More...
 
void addElement (Vector *self, const ident element)
 Adds the specified element to this Vector. More...
 
void enumerateElements (const Vector *self, VectorEnumerator enumerator, ident data)
 Enumerates the elements of this Vector with the given function. More...
 
void enumerateObjects (const Vector *self, VectorEnumerator enumerator, ident data)
 
void filterElements (const Vector *self, Predicate predicate, ident data)
 Filters the elements of this Vector with the given Predicate. More...
 
void filterElements (Vector *self, Predicate predicate, ident data)
 
ident findElement (const Vector *self, Predicate predicate, ident data)
 
ssize_t indexOfElement (const Vector *self, const ident element)
 
VectorinitWithElements (Vector *self, size_t size, size_t count, ident elements)
 Initializes this Vector with the specified elements. More...
 
VectorinitWithSize (Vector *self, size_t size)
 Initializes this Vector with the specified element size. More...
 
void insertElementAtIndex (Vector *self, const ident element, size_t index)
 Inserts the element at the specified index. More...
 
ident reduce (const Vector *self, Reducer reducer, ident accumulator, ident data)
 
void removeAllElements (Vector *self)
 Removes all elements from this Vector without modifying its capacity. More...
 
void removeElementAtIndex (Vector *self, size_t index)
 Removes the element at the specified index. More...
 
void resize (Vector *self, size_t capacity)
 Resizes this Vector to the specified capacity. More...
 
void sort (Vector *self, Comparator comparator)
 Sorts this Vector in place using comparator. More...
 
VectorvectorWithElements (size_t size, size_t count, ident elements)
 Creates a new Vector with the specified elements. More...
 
VectorvectorWithSize (size_t size)
 Creates a new Vector with the specified element size. More...
 
- Methods inherited from Object
Class_Object (void)
 The Object archetype. More...
 
Objectcopy (const Object *self)
 Creates a shallow copy of this Object. More...
 
void dealloc (Object *self)
 Frees all resources held by this Object. More...
 
Stringdescription (const Object *self)
 
int hash (const Object *self)
 
Objectinit (Object *self)
 Initializes this Object. More...
 
_Bool isEqual (const Object *self, const Object *other)
 Tests equality of the other Object. More...
 
_Bool isKindOfClass (const Object *self, const Class *clazz)
 Tests for Class hierarchy membership. More...
 

Protected Attributes

VectorInterface * interface
 The interface. More...
 
- Protected Attributes inherited from Object
ObjectInterface * interface
 The interface. More...
 

Property Details

◆ capacity

size_t Vector::capacity

The capacity.

Definition at line 67 of file Vector.h.

◆ count

size_t Vector::count

The count of elements.

Definition at line 72 of file Vector.h.

◆ elements

ident Vector::elements

The elements.

Definition at line 82 of file Vector.h.

◆ interface

VectorInterface* Vector::interface
protected

The interface.

Definition at line 62 of file Vector.h.

◆ object

Object Vector::object

The superclass.

Definition at line 56 of file Vector.h.

◆ size

size_t Vector::size

The size of each element.

Definition at line 77 of file Vector.h.

Method Details

◆ _Vector()

Class * _Vector ( void  )

The Vector archetype.

Returns
The Vector Class.

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 * clazz
Every instance of Object begins with a pointer to its Class.
Definition: Object.h:51
Class * _Object(void)
The Object archetype.
Definition: Object.c:136
Vectors.
Definition: Vector.h:51
VectorInterface * interface
The interface.
Definition: Vector.h:62

◆ addElement()

void addElement ( Vector self,
const ident  element 
)

Adds the specified element to this Vector.

Parameters
selfThe Vector.
elementThe element to add.

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

◆ enumerateElements()

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

Enumerates the elements of this Vector with the given function.

Parameters
selfThe Vector.
enumeratorThe enumerator function.
dataUser data.

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}
static MutableData * data(void)
Definition: MutableData.c:75

◆ enumerateObjects()

void enumerateObjects ( const Vector self,
VectorEnumerator  enumerator,
ident  data 
)

◆ filterElements() [1/2]

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

Filters the elements of this Vector with the given Predicate.

Parameters
selfThe Vector.
predicateThe Predicate.
dataUser data.

◆ filterElements() [2/2]

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

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()

ident findElement ( const Vector self,
Predicate  predicate,
ident  data 
)
Parameters
selfThe Vector.
predicateThe Predicate.
dataUser data.
Returns
The first element of this Vector to pass the given Predicate.

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}

◆ indexOfElement()

ssize_t indexOfElement ( const Vector self,
const ident  element 
)
Parameters
selfThe Vector.
elementThe element.
Returns
The index of the given element, or -1 if not found.

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}

◆ initWithElements()

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

Initializes this Vector with the specified elements.

Parameters
selfThe Vector.
sizeThe element size.
countThe count of elements.
elementsThe elements, which will be freed when this Vector is released.
Returns
The initialized Vector, or NULL on error.

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}
Vector * initWithSize(Vector *self, size_t size)
Initializes this Vector with the specified element size.
Definition: Vector.c:207

◆ initWithSize()

Vector * initWithSize ( Vector self,
size_t  size 
)

Initializes this Vector with the specified element size.

Parameters
selfThe Vector.
sizeThe element size.
Returns
The initialized Vector, or NULL on error.

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}
#define super(type, obj, method,...)
Object is the root Class of The Objectively Class hierarchy.
Definition: Object.h:46
Object * init(Object *self)
Initializes this Object.
Definition: Object.c:83

◆ insertElementAtIndex()

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

Inserts the element at the specified index.

Parameters
selfThe Vector.
elementThe element to insert.
indexThe index at which to insert.

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}
void addElement(Vector *self, const ident element)
Adds the specified element to this Vector.
Definition: Vector.c:109

◆ reduce()

ident reduce ( const Vector self,
Reducer  reducer,
ident  accumulator,
ident  data 
)
Parameters
selfThe Vector.
reducerThe Reducer.
accumulatorThe initial accumulator value.
dataUser data.
Returns
The reduction result.

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()

void removeAllElements ( Vector self)

Removes all elements from this Vector without modifying its capacity.

Parameters
selfThe Vector

Definition at line 253 of file Vector.c.

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

◆ removeElementAtIndex()

void removeElementAtIndex ( Vector self,
size_t  index 
)

Removes the element at the specified index.

Parameters
selfThe Vector.
indexThe index of the element to remove.

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()

void resize ( Vector self,
size_t  capacity 
)

Resizes this Vector to the specified capacity.

Parameters
selfThe Vector.
capacityThe desired capacity.

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()

void sort ( Vector self,
Comparator  comparator 
)

Sorts this Vector in place using comparator.

Parameters
selfThe Vector.
comparatorA Comparator.

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()

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

Creates a new Vector with the specified elements.

Parameters
sizeThe element size.
countThe count of elements.
elementsTHe elements, which will be freed when this Vector is released.
Returns
The new Vector.

Definition at line 350 of file Vector.c.

350 {
352}
#define alloc(type)
Allocate and initialize and instance of type.
Definition: Class.h:159
Vector * initWithElements(Vector *self, size_t size, size_t count, ident elements)
Initializes this Vector with the specified elements.
Definition: Vector.c:192

◆ vectorWithSize()

Vector * vectorWithSize ( size_t  size)

Creates a new Vector with the specified element size.

Parameters
sizeThe element size.
Returns
The new Vector.

Definition at line 342 of file Vector.c.

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

The documentation for this struct was generated from the following files: