source: libcfa/src/containers/result.cfa @ d5c5586

ADTast-experimental
Last change on this file since d5c5586 was accc9df9, checked in by Thierry Delisle <tdelisle@…>, 3 years ago

Visibility containers lib

  • Property mode set to 100644
File size: 2.5 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// result.c -- Contains the expected value or an error 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 : Sun Feb 17 11:24:04 2019
13// Update Count     : 3
14//
15
16#include <containers/result.hfa>
17#include <assert.h>
18
19#pragma GCC visibility push(default)
20
21forall(T, E)
22void ?{}(result(T, E) & this) {
23        this.has_value = false;
24        (this.error){};
25}
26
27forall(T, E)
28void ?{}(result(T, E) & this, one_t, T value) {
29        this.has_value = true;
30        (this.value){value};
31}
32
33forall(T, E)
34void ?{}(result(T, E) & this, zero_t, E error) {
35        this.has_value = false;
36        (this.error){error};
37}
38
39forall(T, E)
40void ?{}(result(T, E) & this, result(T, E) other) {
41        this.has_value = other.has_value;
42        if (other.has_value) {
43                (this.value){other.value};
44        } else {
45                (this.error){other.error};
46        }
47}
48
49forall(T, E)
50result(T, E) ?=?(result(T, E) & this, result(T, E) that) {
51        if (this.has_value && that.has_value) {
52                this.value = that.value;
53        } else if (this.has_value) {
54                ^(this.value){};
55                this.has_value = false;
56                (this.error){that.error};
57        } else if (that.has_value) {
58                ^(this.error){};
59                this.has_value = true;
60                (this.value){that.value};
61        } else {
62                this.error = that.error;
63        }
64}
65
66forall(T, E)
67void ^?{}(result(T, E) & this) {
68        if (this.has_value) {
69                ^(this.value){};
70        } else {
71                ^(this.error){};
72        }
73}
74
75forall(T, E)
76bool ?!=?(result(T, E) this, zero_t) {
77        return this.has_value;
78}
79
80forall(T, E)
81result(T, E) result_value(T value) {
82        return (result(T, E)){1, value};
83}
84
85forall(T, E)
86result(T, E) result_error(E error) {
87        return (result(T, E)){0, error};
88}
89
90forall(T, E)
91bool has_value(result(T, E) * this) {
92        return this->has_value;
93}
94
95forall(T, E)
96T get(result(T, E) * this) {
97        assertf(this->has_value, "attempt to get from result without value");
98        return this->value;
99}
100
101forall(T, E)
102E get_error(result(T, E) * this) {
103        assertf(!this->has_value, "attempt to get from result without error");
104        return this->error;
105}
106
107forall(T, E)
108void set(result(T, E) * this, T value) {
109        if (this->has_value) {
110                this->value = value;
111        } else {
112                ^(this->error){};
113                this->has_value = true;
114                (this->value){value};
115        }
116}
117
118forall(T, E)
119void set_error(result(T, E) * this, E error) {
120        if (this->has_value) {
121                ^(this->value){};
122                this->has_value = false;
123                (this->error){error};
124        } else {
125                this->error = error;
126        }
127}
Note: See TracBrowser for help on using the repository browser.