Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
promise.qc File Reference
#include "promise.qh"
Include dependency graph for promise.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Enumerations

enum  { PROMISE_PENDING , PROMISE_RESOLVED , PROMISE_REJECTED }

Functions

void _Promise_done (Promise this, Promise(Promise ret, entity result, entity userdata) onResolve, Promise(Promise ret, entity err, entity userdata) onReject, Promise ret, entity userdata)
void _Promise_finalize (Promise this)
void _Promise_handle (Promise this, PromiseHandler h)
Promise _Promise_onReject_default (Promise ret, entity err, entity userdata)
Promise _Promise_onResolve_default (Promise ret, entity result, entity userdata)
Promise _Promise_then (Promise this, Promise ret, Promise(Promise ret, entity result, entity userdata) onResolve, Promise(Promise ret, entity result, entity userdata) onReject, entity userdata)
 classfield (Promise) .int _promise_state
 classfield (PromiseHandler) .Promise _promise_handler_ret
 entityclass (PromiseHandler)
Promise Promise_catch_ (Promise this, Promise ret, Promise(Promise ret, entity result, entity userdata) onReject, entity userdata)
Promise Promise_new_ (Promise this)
void Promise_reject (Promise this)
 notify all Promise_catch subscribers that this promise has rejected
void Promise_resolve (Promise this)
 notify all Promise_then subscribers that this promise has resolved
Promise Promise_then_ (Promise this, Promise ret, Promise(Promise ret, entity result, entity userdata) onResolve, entity userdata)
entity REF (entity this)
void ref_init (entity this, int init, void(entity this) finalize)
entity unref (Promise this)
 void (entity this) _ref_finalize

Variables

entity entity userdata _promise_handler_reject
entity entity userdata _promise_handler_resolve
int _ref_count
entity err
entity result

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
PROMISE_PENDING 
PROMISE_RESOLVED 
PROMISE_REJECTED 

Definition at line 30 of file promise.qc.

30 {
34};
@ PROMISE_RESOLVED
Definition promise.qc:32
@ PROMISE_PENDING
Definition promise.qc:31
@ PROMISE_REJECTED
Definition promise.qc:33

Function Documentation

◆ _Promise_done()

void _Promise_done ( Promise this,
Promise(Promise ret, entity result, entity userdata) onResolve,
Promise(Promise ret, entity err, entity userdata) onReject,
Promise ret,
entity userdata )

Definition at line 132 of file promise.qc.

139{
140 PromiseHandler h = new_pure(PromiseHandler);
141 h._promise_handler_ret = ret;
142 h._promise_handler_data = userdata;
143 h._promise_handler_resolve = onResolve;
144 h._promise_handler_reject = onReject;
145 _Promise_handle(this, h);
146}
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:67
void _Promise_handle(Promise this, PromiseHandler h)
Definition promise.qc:106

References _Promise_handle(), entity(), err, new_pure, and result.

Referenced by _Promise_then().

◆ _Promise_finalize()

void _Promise_finalize ( Promise this)

Definition at line 46 of file promise.qc.

47{
48 delete(this);
49}

Referenced by Promise_new_().

◆ _Promise_handle()

void _Promise_handle ( Promise this,
PromiseHandler h )

Definition at line 106 of file promise.qc.

107{
108 switch (this._promise_state) {
109 case PROMISE_PENDING:
110 if (!this._promise_handlers) {
111 this._promise_handlers = IL_NEW();
112 }
113 IL_PUSH(this._promise_handlers, h);
114 break;
115 case PROMISE_RESOLVED: {
116 Promise ret = h._promise_handler_ret;
117 Promise p = h._promise_handler_resolve(ret, this._promise_result, h._promise_handler_data);
118 if (p != ret) _Promise_then(p, ret, func_null, func_null, NULL); // bind p -> ret
119 delete(h);
120 break;
121 }
122 case PROMISE_REJECTED: {
123 Promise ret = h._promise_handler_ret;
124 Promise p = h._promise_handler_reject(ret, this._promise_result, h._promise_handler_data);
125 if (p != ret) _Promise_then(p, ret, func_null, func_null, NULL); // bind p -> ret
126 delete(h);
127 break;
128 }
129 }
130}
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define IL_NEW()
var void func_null()
#define NULL
Definition post.qh:14
Promise _Promise_then(Promise this, Promise ret, Promise(Promise ret, entity result, entity userdata) onResolve, Promise(Promise ret, entity result, entity userdata) onReject, entity userdata)
Definition promise.qc:162

References _Promise_then(), func_null(), IL_NEW, IL_PUSH(), NULL, PROMISE_PENDING, PROMISE_REJECTED, and PROMISE_RESOLVED.

Referenced by _Promise_done(), Promise_reject(), and Promise_resolve().

◆ _Promise_onReject_default()

Promise _Promise_onReject_default ( Promise ret,
entity err,
entity userdata )

Definition at line 155 of file promise.qc.

156{
157 ret._promise_result = err;
158 Promise_reject(ret);
159 return ret;
160}
entity err
Definition promise.qc:44
void Promise_reject(Promise this)
notify all Promise_catch subscribers that this promise has rejected
Definition promise.qc:79

References entity(), err, and Promise_reject().

Referenced by _Promise_then().

◆ _Promise_onResolve_default()

Promise _Promise_onResolve_default ( Promise ret,
entity result,
entity userdata )

Definition at line 148 of file promise.qc.

149{
150 ret._promise_result = result;
151 Promise_resolve(ret);
152 return ret;
153}
entity result
Definition promise.qc:43
void Promise_resolve(Promise this)
notify all Promise_then subscribers that this promise has resolved
Definition promise.qc:60

References entity(), Promise_resolve(), and result.

Referenced by _Promise_then().

◆ _Promise_then()

Promise _Promise_then ( Promise this,
Promise ret,
Promise(Promise ret, entity result, entity userdata) onResolve,
Promise(Promise ret, entity result, entity userdata) onReject,
entity userdata )

Definition at line 162 of file promise.qc.

169{
171 this,
172 (onResolve ? onResolve : _Promise_onResolve_default),
173 (onReject ? onReject : _Promise_onReject_default),
174 ret,
175 userdata
176 );
177 return ret;
178}
Promise _Promise_onResolve_default(Promise ret, entity result, entity userdata)
Definition promise.qc:148
Promise _Promise_onReject_default(Promise ret, entity err, entity userdata)
Definition promise.qc:155
void _Promise_done(Promise this, Promise(Promise ret, entity result, entity userdata) onResolve, Promise(Promise ret, entity err, entity userdata) onReject, Promise ret, entity userdata)
Definition promise.qc:132

References _Promise_done(), _Promise_onReject_default(), _Promise_onResolve_default(), entity(), and result.

Referenced by _Promise_handle(), Promise_catch_(), and Promise_then_().

◆ classfield() [1/2]

classfield ( Promise )

◆ classfield() [2/2]

classfield ( PromiseHandler )

◆ entityclass()

entityclass ( PromiseHandler )

◆ Promise_catch_()

Promise Promise_catch_ ( Promise this,
Promise ret,
Promise(Promise ret, entity result, entity userdata) onReject,
entity userdata )

Definition at line 191 of file promise.qc.

197{
198 unref(ret); // ret is a temporary
199 return _Promise_then(this, ret, func_null, onReject, userdata);
200}
entity unref(Promise this)
Definition promise.qc:19

References _Promise_then(), entity(), func_null(), result, and unref().

◆ Promise_new_()

Promise Promise_new_ ( Promise this)

Definition at line 51 of file promise.qc.

52{
54 this._promise_result = this; // promises default to being their own result to save on entities
55 return this;
56}
void ref_init(entity this, int init, void(entity this) finalize)
Definition promise.qc:6
void _Promise_finalize(Promise this)
Definition promise.qc:46

References _Promise_finalize(), and ref_init().

◆ Promise_reject()

void Promise_reject ( Promise this)

notify all Promise_catch subscribers that this promise has rejected

Definition at line 79 of file promise.qc.

80{
81 if (!this) {
82 LOG_SEVERE("Attempted to reject a null promise");
83 return;
84 }
85 if (this._promise_state != PROMISE_PENDING) {
86 LOG_SEVEREF("Rejected non-pending promise %i", this);
87 return;
88 }
89 this._promise_state = PROMISE_REJECTED;
90 if (this._promise_handlers) {
91 IL_EACH(this._promise_handlers, true, _Promise_handle(this, it));
92 IL_DELETE(this._promise_handlers);
93 }
94 unref(this);
95 return;
96}
#define IL_EACH(this, cond, body)
#define IL_DELETE(this)
Delete the list.
#define LOG_SEVEREF(...)
Definition log.qh:58
#define LOG_SEVERE(...)
Definition log.qh:57

References _Promise_handle(), IL_DELETE, IL_EACH, LOG_SEVERE, LOG_SEVEREF, PROMISE_PENDING, PROMISE_REJECTED, and unref().

Referenced by _Promise_onReject_default().

◆ Promise_resolve()

void Promise_resolve ( Promise this)

notify all Promise_then subscribers that this promise has resolved

Definition at line 60 of file promise.qc.

61{
62 if (!this) {
63 LOG_SEVERE("Attempted to resolve a null promise");
64 return;
65 }
66 if (this._promise_state != PROMISE_PENDING) {
67 LOG_SEVEREF("Resolved non-pending promise %i", this);
68 return;
69 }
70 this._promise_state = PROMISE_RESOLVED;
71 if (this._promise_handlers) {
72 IL_EACH(this._promise_handlers, true, _Promise_handle(this, it));
73 IL_DELETE(this._promise_handlers);
74 }
75 unref(this);
76 return;
77}

References _Promise_handle(), IL_DELETE, IL_EACH, LOG_SEVERE, LOG_SEVEREF, PROMISE_PENDING, PROMISE_RESOLVED, and unref().

Referenced by _Promise_onResolve_default().

◆ Promise_then_()

Promise Promise_then_ ( Promise this,
Promise ret,
Promise(Promise ret, entity result, entity userdata) onResolve,
entity userdata )

Definition at line 180 of file promise.qc.

186{
187 unref(ret); // ret is a temporary
188 return _Promise_then(this, ret, onResolve, func_null, userdata);
189}

References _Promise_then(), entity(), func_null(), result, and unref().

◆ REF()

entity REF ( entity this)

Definition at line 13 of file promise.qc.

14{
15 this._ref_count += 1;
16 return this;
17}
int _ref_count
Definition promise.qc:3

References _ref_count, and entity().

◆ ref_init()

void ref_init ( entity this,
int init,
void(entity this) finalize )

Definition at line 6 of file promise.qc.

7{
8 this._ref_count = init;
9 this._ref_finalize = finalize;
10}

References _ref_count, and entity().

Referenced by Promise_new_().

◆ unref()

entity unref ( Promise this)

Definition at line 19 of file promise.qc.

20{
21 this._ref_count -= 1;
22 if (!this._ref_count) {
23 LOG_DEBUGF("Finalize entity %i (from %s)", this, this.sourceLoc);
24 this._ref_finalize(this);
25 return NULL;
26 }
27 return this;
28}
#define LOG_DEBUGF(...)
Definition log.qh:81
string sourceLoc
Location entity was spawned from in source.
Definition oo.qh:27

References _ref_count, entity(), LOG_DEBUGF, NULL, and sourceLoc.

Referenced by Promise_catch_(), Promise_reject(), Promise_resolve(), and Promise_then_().

◆ void()

void ( entity this)

References entity().

Variable Documentation

◆ _promise_handler_reject

entity entity userdata _promise_handler_reject

Definition at line 44 of file promise.qc.

◆ _promise_handler_resolve

entity entity userdata _promise_handler_resolve

Definition at line 43 of file promise.qc.

◆ _ref_count

int _ref_count

Definition at line 3 of file promise.qc.

Referenced by REF(), ref_init(), and unref().

◆ err

◆ result