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

Commit 36d742d

Browse files
committed
Add D wrapper.
1 parent bf7e5bb commit 36d742d

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
@@ -15,9 +15,11 @@ import core.stdcpp.xutility : __cpp_sized_deallocation, __cpp_aligned_new;
1515

1616
@nogc:
1717

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

22+
2123
extern (C++, "std")
2224
{
2325
///
@@ -28,6 +30,93 @@ extern (C++, "std")
2830
}
2931

3032

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

0 commit comments

Comments
 (0)