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

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 ecd4923 was 9236060, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Merge branch 'master' into references

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