source: src/libcfa/containers/maybe.c @ f1a4ccb

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since f1a4ccb was 91c389a, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

change usages of assert to assert.h

  • Property mode set to 100644
File size: 1.9 KB
RevLine 
[79308c8e]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// maybe.c -- May contain a value.
8//
9// Author           : Andrew Beach
[58daf53]10// Created On       : Wed May 24 15:40:00 2017
[91c389a]11// Last Modified By : Peter A. Buhr
12// Last Modified On : Thu Jul 20 15:23:50 2017
13// Update Count     : 2
[79308c8e]14//
15
16#include <containers/maybe>
[91c389a]17#include <assert.h>
[79308c8e]18
19
20forall(otype T)
21void ?{}(maybe(T) * this) {
22        this->has_value = false;
23}
24
25forall(otype T)
26void ?{}(maybe(T) * this, T value) {
27        this->has_value = true;
[58daf53]28        (&this->value){value};
[79308c8e]29}
30
31forall(otype T)
32void ?{}(maybe(T) * this, maybe(T) other) {
33        this->has_value = other.has_value;
34        if (other.has_value) {
[58daf53]35                (&this->value){other.value};
36        }
37}
38
39forall(otype T)
40maybe(T) ?=?(maybe(T) * this, maybe(T) that) {
41        if (this->has_value & that.has_value) {
42                this->value = that.value;
43        } else if (this->has_value) {
44                ^(&this->value){};
45                this->has_value = false;
46        } else if (that.has_value) {
47                this->has_value = true;
48                (&this->value){that.value};
[79308c8e]49        }
50}
51
52forall(otype T)
53void ^?{}(maybe(T) * this) {
54        if (this->has_value) {
[64fc0ba]55                ^(&this->value){};
[79308c8e]56        }
57}
58
59forall(otype T)
[64fc0ba]60bool ?!=?(maybe(T) this, zero_t) {
[58daf53]61        return this.has_value;
[79308c8e]62}
63
64forall(otype T)
65maybe(T) maybe_value(T value) {
[64fc0ba]66        return (maybe(T)){value};
[79308c8e]67}
68
69forall(otype T)
70maybe(T) maybe_none() {
[64fc0ba]71        return (maybe(T)){};
[79308c8e]72}
73
74forall(otype T)
[64fc0ba]75bool has_value(maybe(T) * this) {
[79308c8e]76        return this->has_value;
77}
78
79forall(otype T)
80T get(maybe(T) * this) {
81        assertf(this->has_value, "attempt to get from maybe without value");
82        return this->value;
83}
[58daf53]84
85forall(otype T)
86void set(maybe(T) * this, T value) {
87        if (this->has_value) {
88                this->value = value;
89        } else {
90                this->has_value = true;
91                (&this->value){value};
92        }
93}
94
95forall(otype T)
96void set_none(maybe(T) * this) {
97        if (this->has_value) {
98                this->has_value = false;
99                ^(&this->value){};
100        }
101}
Note: See TracBrowser for help on using the repository browser.