aboutsummaryrefslogtreecommitdiff
path: root/examples/arc.ct
diff options
context:
space:
mode:
Diffstat (limited to 'examples/arc.ct')
-rw-r--r--examples/arc.ct53
1 files changed, 0 insertions, 53 deletions
diff --git a/examples/arc.ct b/examples/arc.ct
deleted file mode 100644
index 8869b42..0000000
--- a/examples/arc.ct
+++ /dev/null
@@ -1,53 +0,0 @@
-/* could be non-null instead of raw pointer? */
-typedef atomic_rc [t any] {
- count *usize;
- data *t;
-}
-
-/* macros must be 'called' with () */
-pub define arc(t) { struct (atomic_rc[t]) };
-
-pub dereference(a *arc) *#a.data
-{
- return a.t;
-}
-
-pub init(mut a *arc, e #a.data)
-{
- new(a.count, 0);
- a.data = e;
-}
-
-pub init(mut a *arc, b *arc<#a.data>)
-{
- copy(a, b);
-}
-
-pub deinit(mut a *arc)
-{
- if atomic_fetch_add(a.count, -1) == 1 {
- dealloc(a.data);
- dealloc(a.count);
- }
-
- a.count = null;
- a.data = null;
-}
-
-pub copy(mut a *arc, b *arc<#a.data>)
-{
- deinit(a);
- a.count = b.count;
- a.data = b.data;
- atomic_fetch_add(b.count, 1);
-}
-
-pub move(mut a *arc, mut b *arc<#a.data>)
-{
- deinit(a);
- a.count = b.count;
- a.data = b.data;
- /* reference count stays the same */
- b.count = null;
- a.count = null;
-}