source: libcfa/src/memory.cfa @ b7b3e41

Last change on this file since b7b3e41 was 789f279, checked in by Thierry Delisle <tdelisle@…>, 2 years ago

More standard lib visibility

  • Property mode set to 100644
File size: 4.0 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// memory.cfa -- Memory Management Tools for CFA
8//
9// Author           : Andrew Beach
10// Created On       : Tue Jun  2 16:48:00 2020
11// Last Modified By : Andrew Beach
12// Last Modified On : Mon Feb  1 16:10:00 2021
13// Update Count     : 1
14//
15
16#include "memory.hfa"
17#include "stdlib.hfa"
18
19#pragma GCC visibility push(default)
20
21// Internal data object.
22forall(T & | sized(T), Args... | { void ?{}(T &, Args); })
23void ?{}(counter_data(T) & this, Args args) {
24        (this.counter){1};
25        (this.object){args};
26}
27
28forall(T & | sized(T) | { void ^?{}(T &); })
29void ^?{}(counter_data(T) & this) {
30        assert(0 == this.counter);
31        ^(this.object){};
32}
33
34// This is one of many pointers keeping this alive.
35forall(T & | sized(T))
36void ?{}(counter_ptr(T) & this) {
37        this.data = 0p;
38}
39
40forall(T & | sized(T))
41void ?{}(counter_ptr(T) & this, zero_t) {
42        this.data = 0p;
43}
44
45forall(T & | sized(T) | { void ^?{}(T &); })
46static void internal_decrement(counter_ptr(T) & this) {
47        if (this.data && 0 == --this.data->counter) {
48                delete(this.data);
49        }
50}
51
52forall(T & | sized(T))
53static void internal_copy(counter_ptr(T) & this, counter_ptr(T) & that) {
54        this.data = that.data;
55        if (this.data) {
56                ++this.data->counter;
57        }
58}
59
60forall(T & | sized(T))
61void ?{}(counter_ptr(T) & this, counter_ptr(T) that) {
62        // `that` is a copy but it should have neither a constructor
63        // nor destructor run on it so it shouldn't need adjustment.
64        internal_copy(this, that);
65}
66
67forall(T & | sized(T), Args... | { void ?{}(T&, Args); })
68void ?{}(counter_ptr(T) & this, Args args) {
69        this.data = malloc();
70        this.data->counter = 1;
71        (this.data->object){args};
72}
73
74forall(T & | sized(T) | { void ^?{}(T &); })
75void ^?{}(counter_ptr(T) & this) {
76        internal_decrement(this);
77}
78
79forall(T & | sized(T))
80T & *?(counter_ptr(T) & this) {
81        return *((this.data) ? &this.data->object : 0p);
82}
83
84forall(T & | sized(T) | { void ^?{}(T &); })
85void ?=?(counter_ptr(T) & this, counter_ptr(T) that) {
86        if (this.data != that.data) {
87                internal_decrement(this);
88                internal_copy(this, that);
89        }
90}
91
92forall(T & | sized(T) | { void ^?{}(T &); })
93void ?=?(counter_ptr(T) & this, zero_t) {
94        internal_decrement(this);
95        this.data = 0p;
96}
97
98forall(T & | sized(T))
99int ?==?(counter_ptr(T) const & this, counter_ptr(T) const & that) {
100        return this.data == that.data;
101}
102
103forall(T & | sized(T))
104int ?!=?(counter_ptr(T) const & this, counter_ptr(T) const & that) {
105        return !?==?(this, that);
106}
107
108forall(T & | sized(T))
109int ?==?(counter_ptr(T) const & this, zero_t) {
110        return this.data == 0;
111}
112
113forall(T & | sized(T))
114int ?!=?(counter_ptr(T) const & this, zero_t) {
115        return !?==?(this, (zero_t)0);
116}
117
118// This is the only pointer that keeps this alive.
119forall(T &)
120void ?{}(unique_ptr(T) & this) {
121        this.data = 0p;
122}
123
124forall(T &)
125void ?{}(unique_ptr(T) & this, zero_t) {
126        this.data = 0p;
127}
128
129forall(T & | sized(T), Args... | { void ?{}(T &, Args); })
130void ?{}(unique_ptr(T) & this, Args args) {
131        this.data = malloc();
132        (*this.data){args};
133}
134
135forall(T & | { void ^?{}(T &); })
136void ^?{}(unique_ptr(T) & this) {
137        delete(this.data);
138}
139
140forall(T &)
141T & *?(unique_ptr(T) & this) {
142        return *this.data;
143}
144
145forall(T & | { void ^?{}(T &); })
146void ?=?(unique_ptr(T) & this, zero_t) {
147        delete(this.data);
148        this.data = 0p;
149}
150
151forall(T & | { void ^?{}(T &); })
152void move(unique_ptr(T) & this, unique_ptr(T) & that) {
153        delete(this.data);
154        this.data = that.data;
155        that.data = 0p;
156}
157
158forall(T &)
159T * release(unique_ptr(T) & this) {
160        T * data = this.data;
161        this.data = 0p;
162        return data;
163}
164
165forall(T &)
166int ?==?(unique_ptr(T) const & this, unique_ptr(T) const & that) {
167        return this.data == that.data;
168}
169
170forall(T &)
171int ?!=?(unique_ptr(T) const & this, unique_ptr(T) const & that) {
172        return !?==?(this, that);
173}
174
175forall(T &)
176int ?==?(unique_ptr(T) const & this, zero_t) {
177        return this.data == 0;
178}
179
180forall(T &)
181int ?!=?(unique_ptr(T) const & this, zero_t) {
182        return !?==?(this, (zero_t)0);
183}
Note: See TracBrowser for help on using the repository browser.