Skip to content

Commit 60c330e

Browse files
authored
Add support for empty constructors for (slim)rc ptrs (#232)
* add-support-for-empty-constructors-for-(slim)RC-ptrs * add mir/interpolate/polynomial to meson
1 parent 0712676 commit 60c330e

File tree

3 files changed

+57
-46
lines changed

3 files changed

+57
-46
lines changed

meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ sources_list = [
2323
'mir/interpolate/constant',
2424
'mir/interpolate/linear',
2525
'mir/interpolate/package',
26+
'mir/interpolate/polynomial',
2627
'mir/interpolate/spline',
2728
'mir/interpolate/utility',
2829
'mir/math/func/expdigamma',

source/mir/rc/ptr.d

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -119,27 +119,6 @@ struct mir_rcptr(T)
119119
mir_rc_increase_counter(context);
120120
}
121121
}
122-
123-
static if (!is(T == interface) && !__traits(isAbstractClass, T))
124-
{
125-
package(mir) this(Args...)(auto ref Args args)
126-
{
127-
() @trusted {
128-
_context = mir_rc_create(mir_get_type_info!T, 1, mir_get_payload_ptr!T);
129-
if (!_context)
130-
{
131-
version(D_Exceptions)
132-
throw allocationError;
133-
else
134-
assert(0, allocationExcMsg);
135-
}
136-
_value = cast(typeof(_value))(_context + 1);
137-
} ();
138-
import core.lifetime: forward;
139-
import mir.conv: emplace;
140-
cast(void) emplace!T(_value, forward!args);
141-
}
142-
}
143122
}
144123

145124
///
@@ -220,15 +199,29 @@ mir_rcptr!(immutable R) castTo(R, T)(return immutable mir_rcptr!T context) @trus
220199
return createRCWithContext(cast(immutable R)context._get_value, move(*cast(mir_rcptr!T*)&context));
221200
}
222201

223-
224202
///
225203
template createRC(T)
204+
if (!is(T == interface) && !__traits(isAbstractClass, T))
226205
{
227206
///
228207
mir_rcptr!T createRC(Args...)(auto ref Args args)
229208
{
209+
typeof(return) ret;
210+
with (ret) () @trusted {
211+
_context = mir_rc_create(mir_get_type_info!T, 1, mir_get_payload_ptr!T);
212+
if (!_context)
213+
{
214+
version(D_Exceptions)
215+
throw allocationError;
216+
else
217+
assert(0, allocationExcMsg);
218+
}
219+
_value = cast(typeof(_value))(_context + 1);
220+
} ();
230221
import core.lifetime: forward;
231-
return mir_rcptr!T(forward!args);
222+
import mir.conv: emplace;
223+
cast(void) emplace!T(ret._value, forward!args);
224+
return ret;
232225
}
233226
}
234227

@@ -244,6 +237,18 @@ unittest
244237
assert(*a == 100);
245238
}
246239

240+
/// Classes with empty constructor
241+
version(mir_test)
242+
@safe pure @nogc nothrow
243+
unittest
244+
{
245+
static class C
246+
{
247+
int index = 34;
248+
}
249+
assert(createRC!C.index == 34);
250+
}
251+
247252
///
248253
version(mir_test)
249254
@safe pure @nogc nothrow
@@ -267,7 +272,6 @@ unittest
267272
assert(a._counter == 2);
268273

269274
auto d = a.castTo!D; //RCPtr!D
270-
import std.stdio;
271275
assert(d._counter == 3);
272276
d.index = 234;
273277
assert(a.index == 234);

source/mir/rc/slim_ptr.d

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -115,40 +115,34 @@ struct mir_slim_rcptr(T)
115115
mir_rc_increase_counter(context);
116116
}
117117
}
118-
119-
static if (!is(T == interface) && !__traits(isAbstractClass, T))
120-
{
121-
package(mir) this(Args...)(auto ref Args args)
122-
{
123-
() @trusted {
124-
auto context = mir_rc_create(mir_get_type_info!T, 1, mir_get_payload_ptr!T);
125-
if (!context)
126-
{
127-
version(D_Exceptions)
128-
throw allocationError;
129-
else
130-
assert(0, allocationExcMsg);
131-
}
132-
_value = cast(typeof(_value))(context + 1);
133-
} ();
134-
import core.lifetime: forward;
135-
import mir.conv: emplace;
136-
cast(void) emplace!T(_value, forward!args);
137-
}
138-
}
139118
}
140119

141120
///
142121
alias SlimRCPtr = mir_slim_rcptr;
143122

144123
///
145124
template createSlimRC(T)
125+
if (!is(T == interface) && !__traits(isAbstractClass, T))
146126
{
147127
///
148128
mir_slim_rcptr!T createSlimRC(Args...)(auto ref Args args)
149129
{
130+
typeof(return) ret;
131+
with (ret) () @trusted {
132+
auto context = mir_rc_create(mir_get_type_info!T, 1, mir_get_payload_ptr!T);
133+
if (!context)
134+
{
135+
version(D_Exceptions)
136+
throw allocationError;
137+
else
138+
assert(0, allocationExcMsg);
139+
}
140+
_value = cast(typeof(_value))(context + 1);
141+
} ();
150142
import core.lifetime: forward;
151-
return mir_slim_rcptr!T(forward!args);
143+
import mir.conv: emplace;
144+
cast(void) emplace!T(ret._value, forward!args);
145+
return ret;
152146
}
153147
}
154148

@@ -210,6 +204,18 @@ unittest
210204
assert(s.e == 3);
211205
}
212206

207+
/// Classes with empty constructor
208+
version(mir_test)
209+
@safe pure @nogc nothrow
210+
unittest
211+
{
212+
static class C
213+
{
214+
int index = 34;
215+
}
216+
assert(createSlimRC!C.index == 34);
217+
}
218+
213219
version(unittest):
214220

215221
package struct _test_unpure_system_dest_s__ {

0 commit comments

Comments
 (0)