Differences From
Artifact [07d2cb4a7e]:
15 15 local p = m.ptr(ty:astype())
16 16 return `p {
17 17 ptr = [&ty:astype()](m.heapa_raw(sizeof(ty) * sz));
18 18 ct = sz;
19 19 }
20 20 end)
21 21
22 -m.ptr = terralib.memoize(function(ty)
23 - local t = terralib.types.newstruct(string.format('ptr<%s>', ty))
22 +local function mkptr(ty, dyn)
23 + local t = terralib.types.newstruct(string.format('%s<%s>', dyn and 'ptr' or 'ref', ty))
24 24 t.entries = {
25 25 {'ptr', &ty};
26 26 {'ct', intptr};
27 27 }
28 28 t.ptr_basetype = ty
29 29 local recurse = false
30 30 if ty:isstruct() then
31 31 if ty.methods.free then recurse = true end
32 32 end
33 33 t.metamethods.__not = macro(function(self)
34 34 return `self.ptr
35 35 end)
36 - t.methods = {
37 - free = terra(self: &t): bool
38 - [recurse and quote
39 - self.ptr:free()
40 - end or {}]
41 - if self.ct > 0 then
42 - m.heapf(self.ptr)
43 - self.ct = 0
44 - return true
36 + if dyn then
37 + t.methods = {
38 + free = terra(self: &t): bool
39 + [recurse and quote
40 + self.ptr:free()
41 + end or {}]
42 + if self.ct > 0 then
43 + m.heapf(self.ptr)
44 + self.ct = 0
45 + return true
46 + end
47 + return false
48 + end;
49 + init = terra(self: &t, newct: intptr): bool
50 + var nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
51 + if nv ~= nil then
52 + self.ptr = nv
53 + self.ct = newct
54 + return true
55 + else return false end
56 + end;
57 + resize = terra(self: &t, newct: intptr): bool
58 + var nv: &ty
59 + if self.ct > 0
60 + then nv = [&ty](m.heapr_raw(self.ptr, sizeof(ty) * newct))
61 + else nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
62 + end
63 + if nv ~= nil then
64 + self.ptr = nv
65 + self.ct = newct
66 + return true
67 + else return false end
68 + end;
69 + }
70 + terra t:ensure(n: intptr)
71 + if self.ptr == nil then
72 + if not self:init(n) then return t {ptr=nil,ct=0} end
45 73 end
46 - return false
47 - end;
48 - init = terra(self: &t, newct: intptr): bool
49 - var nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
50 - if nv ~= nil then
51 - self.ptr = nv
52 - self.ct = newct
53 - return true
54 - else return false end
55 - end;
56 - resize = terra(self: &t, newct: intptr): bool
57 - var nv: &ty
58 - if self.ct > 0
59 - then nv = [&ty](m.heapr_raw(self.ptr, sizeof(ty) * newct))
60 - else nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
74 + if self.ct >= n then return @self end
75 + self:resize(n)
76 + return @self
77 + end
78 + end
79 + terra t:advance(n: intptr)
80 + self.ptr = self.ptr + n
81 + self.ct = self.ct - n
82 + return self.ptr
83 + end
84 + if not ty:isstruct() then
85 + terra t:cmp_raw(other: &ty)
86 + for i=0, self.ct do
87 + if self.ptr[i] ~= other[i] then return false end
61 88 end
62 - if nv ~= nil then
63 - self.ptr = nv
64 - self.ct = newct
65 - return true
66 - else return false end
67 - end;
68 - }
89 + return true
90 + end
91 + terra t:cmp(other: t)
92 + if other.ct ~= self.ct then return false end
93 + return self:cmp_raw(other.ptr)
94 + end
95 + end
69 96 return t
70 -end)
97 +end
98 +
99 +m.ptr = terralib.memoize(function(ty) return mkptr(ty, true) end)
100 +m.ref = terralib.memoize(function(ty) return mkptr(ty, false) end)
71 101
72 102 m.vec = terralib.memoize(function(ty)
73 103 local v = terralib.types.newstruct(string.format('vec<%s>', ty.name))
74 104 v.entries = {
75 105 {field = 'storage', type = m.ptr(ty)};
76 106 {field = 'sz', type = intptr};
77 107 {field = 'run', type = intptr};