source: src/examples/gc_no_raii/src/vector.h @ 8c8b614

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since 8c8b614 was df4aea7, checked in by Thierry Delisle <tdelisle@…>, 8 years ago

all implemented files compile

  • Property mode set to 100644
File size: 3.8 KB
Line 
1#pragma once
2
3#include <assert.h>
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdlib.h>
7
8#define DESTROY(x)
9
10//------------------------------------------------------------------------------
11//Declaration
12trait allocator_c(otype T, otype allocator_t)
13{
14        void ctor(allocator_t* const);
15        void dtor(allocator_t* const);
16        void realloc(allocator_t* const, size_t);
17        T* data(allocator_t* const);
18};
19
20forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
21struct vector
22{
23        allocator_t storage;
24        size_t size;
25};
26
27//------------------------------------------------------------------------------
28//Initialization
29forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
30void ctor(vector(T, allocator_t) *const this);
31
32forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
33void dtor(vector(T, allocator_t) *const this);
34
35//------------------------------------------------------------------------------
36//Capacity
37forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
38inline bool empty(vector(T, allocator_t) *const this)
39{
40        return this->size == 0;
41}
42
43forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
44inline bool size(vector(T, allocator_t) *const this)
45{
46        return this->size;
47}
48
49forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
50inline void reserve(vector(T, allocator_t) *const this, size_t size)
51{
52        realloc(&this->storage, this->size+1);
53}
54
55//------------------------------------------------------------------------------
56//Element access
57forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
58inline T at(vector(T, allocator_t) *const this, size_t index)
59{
60        // assert(index < this->size);
61        return data(&this->storage)[index];
62}
63
64forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
65inline T ?[?](vector(T, allocator_t) *const this, size_t index)
66{
67        return data(&this->storage)[index];
68}
69
70forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
71inline T front(vector(T, allocator_t) *const this)
72{
73        return data(&this->storage)[0];
74}
75
76forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
77inline T back(vector(T, allocator_t) *const this)
78{
79        return data(&this->storage)[this->size - 1];
80}
81
82//------------------------------------------------------------------------------
83//Modifiers
84forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
85void push_back(vector(T, allocator_t) *const this, T value);
86
87forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
88void pop_back(vector(T, allocator_t) *const this);
89
90forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
91void clear(vector(T, allocator_t) *const this);
92
93//------------------------------------------------------------------------------
94//Iterators
95forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
96inline T* begin(vector(T, allocator_t) *const this)
97{
98        return data(&this->storage);
99}
100
101forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
102inline const T* cbegin(const vector(T, allocator_t) *const this)
103{
104        return data(&this->storage);
105}
106
107forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
108inline T* end(vector(T, allocator_t) *const this)
109{
110        return data(&this->storage) + this->size;
111}
112
113forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
114inline const T* cend(const vector(T, allocator_t) *const this)
115{
116        return data(&this->storage) + this->size;
117}
118
119//------------------------------------------------------------------------------
120//Allocator
121forall(otype T)
122struct heap_allocator
123{
124        T* storage;
125        size_t capacity;
126};
127
128forall(otype T)
129void ctor(heap_allocator(T) *const this);
130
131forall(otype T)
132void dtor(heap_allocator(T) *const this);
133
134forall(otype T)
135void realloc(heap_allocator(T) *const this, size_t size);
136
137forall(otype T)
138inline T* data(heap_allocator(T) *const this)
139{
140        return this->storage;
141}
Note: See TracBrowser for help on using the repository browser.