Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 90cd39b

Browse files
committed
Add D wrapper.
1 parent ef82bf1 commit 90cd39b

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

src/core/stdcpp/new_.d

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import core.stdcpp.exception : exception;
1616

1717
@nogc:
1818

19+
1920
// TODO: this really should come from __traits(getTargetInfo, "defaultNewAlignment")
2021
enum size_t __STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16;
2122

23+
2224
extern (C++, "std")
2325
{
2426
///
@@ -37,6 +39,93 @@ extern (C++, "std")
3739
}
3840

3941

42+
// D wrapping API to re-introduce the overloads
43+
pragma(inline, true)
44+
{
45+
/// D binding for ::operator new
46+
void[] cpp_new(size_t count)
47+
{
48+
return __cpp_new(count)[0 .. count];
49+
}
50+
51+
/// D binding for ::operator new
52+
void[] cpp_new(size_t count) nothrow @trusted
53+
{
54+
void* mem = __cpp_new_nothrow(count);
55+
return mem ? mem[0 .. count] : null;
56+
}
57+
58+
/// D binding for ::operator delete
59+
void cpp_delete(void* ptr)
60+
{
61+
__cpp_delete(ptr);
62+
}
63+
64+
/// D binding for ::operator delete
65+
void cpp_delete(void* ptr) nothrow
66+
{
67+
__cpp_delete_nothrow(ptr);
68+
}
69+
70+
/// D binding for ::operator delete
71+
void cpp_delete(void[] mem)
72+
{
73+
static if (__cpp_sized_deallocation)
74+
return __cpp_delete_size(mem.ptr, mem.length);
75+
else
76+
return __cpp_delete(mem.ptr);
77+
}
78+
79+
/// D binding for ::operator delete
80+
void cpp_delete(void[] mem) nothrow @trusted
81+
{
82+
// TODO: should we call the sized delete and catch instead `if (__cpp_sized_deallocation)`?
83+
__cpp_delete_nothrow(mem.ptr);
84+
}
85+
86+
static if (__cpp_aligned_new)
87+
{
88+
/// D binding for ::operator new
89+
void[] cpp_new(size_t count, size_t alignment)
90+
{
91+
return __cpp_new_aligned(count, cast(align_val_t)alignment)[0 .. count];
92+
}
93+
94+
/// D binding for ::operator new
95+
void[] cpp_new(size_t count, size_t alignment) nothrow @trusted
96+
{
97+
void* mem = __cpp_new_aligned_nothrow(count, cast(align_val_t)alignment);
98+
return mem ? mem[0 .. count] : null;
99+
}
100+
101+
/// D binding for ::operator delete
102+
void cpp_delete(void* ptr, size_t alignment)
103+
{
104+
__cpp_delete_aligned(ptr, cast(align_val_t)alignment);
105+
}
106+
107+
/// D binding for ::operator delete
108+
void cpp_delete(void* ptr, size_t alignment) nothrow
109+
{
110+
__cpp_delete_align_nothrow(ptr, cast(align_val_t)alignment);
111+
}
112+
113+
/// D binding for ::operator delete
114+
void cpp_delete(void[] mem, size_t alignment)
115+
{
116+
__cpp_delete_size_aligned(mem.ptr, mem.length, cast(align_val_t)alignment);
117+
}
118+
119+
/// D binding for ::operator delete
120+
void cpp_delete(void[] mem, size_t alignment) nothrow @trusted
121+
{
122+
// TODO: should we call the sized delete and catch instead?
123+
__cpp_delete_align_nothrow(mem.ptr, cast(align_val_t)alignment);
124+
}
125+
}
126+
}
127+
128+
40129
// raw C++ functions
41130
extern(C++):
42131

0 commit comments

Comments
 (0)