source: tests/zombies/wrapper/src/pointer.h @ 3f37f5b

Last change on this file since 3f37f5b was fd54fef, checked in by Michael Brooks <mlbrooks@…>, 4 years ago

Converting the project to use the new syntax for otype, dtype and ttytpe.

Changed prelude (gen), libcfa and test suite to use it. Added a simple deprecation rule of the old syntax to the parser; we might wish to support both syntaxes "officially," like with an extra CLI switch, but this measure should serve as a simple reminder for our team to try the new syntax.

  • Property mode set to 100644
File size: 2.0 KB
RevLine 
[03286aa]1#pragma once
2
[73abe95]3#include <fstream.hfa>
[03286aa]4#include <stddef.h>
[73abe95]5#include <stdlib.hfa>
[13488ca]6
7//==============================================================================
8// type safe malloc / free
9
[fd54fef]10forall(T)
[13488ca]11T* new()
12{
13        T* p = malloc();
14        p{};
15        return p;
16}
17
[fd54fef]18forall(T)
[13488ca]19void delete(T* p)
20{
21        ^p{};
22        free(p);
23}
24
25//==============================================================================
26// ref counter content
[03286aa]27
28struct content_t
29{
30        int value;
31        size_t count;
32};
33
34void ?{}(content_t* this)
35{
[200fcb3]36        sout | "Constructing content";
[03286aa]37        this->count = 0;
38}
39
40void ^?{}(content_t* this)
41{
[200fcb3]42        sout | "Destroying content";
[03286aa]43}
44
[13488ca]45//==============================================================================
46// ref counter wrapper
47
48struct wrapper_t
49{
50        content_t* ptr;
51};
52
[bf1ee05]53void ?{}(wrapper_t* this)
[13488ca]54{
[200fcb3]55        sout | "Constructing empty ref pointer" | nl;
[bf1ee05]56        this->ptr = NULL;
[13488ca]57}
58
[bf1ee05]59void ?{}(wrapper_t* this, wrapper_t rhs)
[13488ca]60{
[200fcb3]61        sout | "Constructing ref pointer from copy";
[bf1ee05]62        this->ptr = rhs.ptr;
[13488ca]63        this->ptr->count++;
[200fcb3]64        sout | "Reference is " | this->ptr->count | nl;
[13488ca]65}
66
67void ^?{}(wrapper_t* this)
68{
[bf1ee05]69        if(this->ptr)
[13488ca]70        {
[200fcb3]71                sout | "Destroying ref pointer";
[13488ca]72                this->ptr->count--;
[200fcb3]73                sout | "Reference is " | this->ptr->count | nl;
[13488ca]74                if(!this->ptr->count) delete(this->ptr);
75        }
76        else
77        {
[200fcb3]78                sout | "Destroying empty ref pointer" | nl;
[13488ca]79        }
80}
81
[21995bc]82wrapper_t ?=?(wrapper_t* this, wrapper_t rhs)
83{
[200fcb3]84        sout | "Setting ref pointer";
[21995bc]85        if(this->ptr)
86        {
87                this->ptr->count--;
[200fcb3]88                sout | "Reference is " | this->ptr->count | nl;
[21995bc]89                if(!this->ptr->count) delete(this->ptr);
90        }
91        this->ptr = rhs.ptr;
92        this->ptr->count++;
[200fcb3]93        sout | "Reference is " | this->ptr->count | nl;
[21995bc]94}
95
[13488ca]96void set(wrapper_t* this, content_t* c)
97{
98        this->ptr = c;
[bf1ee05]99        this->ptr->count++;
[200fcb3]100        sout | "Setting ref pointer";
101        sout | "Reference is " | this->ptr->count | nl;
[21995bc]102}
103
104void clear(wrapper_t* this)
105{
[200fcb3]106        sout | "Clearing ref pointer";
[21995bc]107        this->ptr->count--;
[200fcb3]108        sout | "Reference is " | this->ptr->count | nl;
[21995bc]109        if(!this->ptr->count) delete(this->ptr);
110        this->ptr = NULL;
[13488ca]111}
[bf1ee05]112
[21995bc]113
[bf1ee05]114wrapper_t wrap(int val)
115{
116        wrapper_t w;
117        content_t* c = malloc();
118        c{};
119        c->value = val;
120        set(&w, c);
121        return w;
122}
Note: See TracBrowser for help on using the repository browser.