@@ -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")
1920enum size_t __STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16 ;
2021
22+
2123extern (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
32121extern (C++ ):
33122
0 commit comments