source: libcfa/src/containers/vector.hfa@ 726b748

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 726b748 was c1ee231, checked in by Peter A. Buhr <pabuhr@…>, 5 years ago

remove extern "C" from include files protected in CFA stdhdr directory

  • Property mode set to 100644
File size: 4.6 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// vector --
8//
9// Author : Thierry Delisle
10// Created On : Tue Jul 5 18:00:07 2016
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Wed Jun 17 11:02:46 2020
13// Update Count : 4
14//
15
16#pragma once
17
18#include <stdbool.h>
19
20//------------------------------------------------------------------------------
21//Allocator
22forall(otype T)
23struct heap_allocator
24{
25 T* storage;
26 size_t capacity;
27};
28
29forall(otype T)
30void ?{}(heap_allocator(T)& this);
31
32forall(otype T)
33void ?{}(heap_allocator(T)& this, heap_allocator(T) rhs);
34
35forall(otype T)
36heap_allocator(T) ?=?(heap_allocator(T)& this, heap_allocator(T) rhs);
37
38forall(otype T)
39void ^?{}(heap_allocator(T)& this);
40
41forall(otype T)
42void realloc_storage(heap_allocator(T)* this, size_t size);
43
44forall(otype T)
45static inline T* data(heap_allocator(T)* this)
46{
47 return this->storage;
48}
49
50//------------------------------------------------------------------------------
51//Declaration
52trait allocator_c(otype T, otype allocator_t)
53{
54 void realloc_storage(allocator_t*, size_t);
55 T* data(allocator_t*);
56};
57
58forall(otype T, otype allocator_t = heap_allocator(T) | allocator_c(T, allocator_t))
59struct vector;
60
61//------------------------------------------------------------------------------
62//Initialization
63forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
64void ?{}(vector(T, allocator_t)& this);
65
66forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
67void ?{}(vector(T, allocator_t)& this, vector(T, allocator_t) rhs);
68
69forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
70vector(T, allocator_t) ?=?(vector(T, allocator_t)& this, vector(T, allocator_t) rhs);
71
72forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
73void ^?{}(vector(T, allocator_t)& this);
74
75forall(otype T, otype allocator_t = heap_allocator(T) | allocator_c(T, allocator_t))
76struct vector
77{
78 allocator_t storage;
79 size_t size;
80};
81
82//------------------------------------------------------------------------------
83//Capacity
84forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
85static inline bool empty(vector(T, allocator_t)* this)
86{
87 return this->size == 0;
88}
89
90forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
91static inline size_t size(vector(T, allocator_t)* this)
92{
93 return this->size;
94}
95
96forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
97static inline void reserve(vector(T, allocator_t)* this, size_t size)
98{
99 realloc_storage(&this->storage, this->size+1);
100}
101
102//------------------------------------------------------------------------------
103//Element access
104forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
105static inline T at(vector(T, allocator_t)* this, size_t index)
106{
107 return data(&this->storage)[index];
108}
109
110forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
111static inline T ?[?](vector(T, allocator_t)* this, size_t index)
112{
113 return data(&this->storage)[index];
114}
115
116forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
117static inline T front(vector(T, allocator_t)* this)
118{
119 return data(&this->storage)[0];
120}
121
122forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
123static inline T back(vector(T, allocator_t)* this)
124{
125 return data(&this->storage)[this->size - 1];
126}
127
128//------------------------------------------------------------------------------
129//Modifiers
130forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
131void push_back(vector(T, allocator_t)* this, T value);
132
133forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
134void pop_back(vector(T, allocator_t)* this);
135
136forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
137void clear(vector(T, allocator_t)* this);
138
139//------------------------------------------------------------------------------
140//Iterators
141forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
142static inline T* begin(vector(T, allocator_t)* this)
143{
144 return data(&this->storage);
145}
146
147// forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
148// static inline const T* cbegin(const vector(T, allocator_t)* this)
149// {
150// return data(&this->storage);
151// }
152
153forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
154static inline T* end(vector(T, allocator_t)* this)
155{
156 return data(&this->storage) + this->size;
157}
158
159// forall(otype T, otype allocator_t | allocator_c(T, allocator_t))
160// static inline const T* cend(const vector(T, allocator_t)* this)
161// {
162// return data(&this->storage) + this->size;
163// }
164
165// Local Variables: //
166// mode: c //
167// tab-width: 4 //
168// End: //
Note: See TracBrowser for help on using the repository browser.