@@ -16,9 +16,11 @@ import core.stdcpp.exception : exception;
1616
1717@nogc :
1818
19+
1920// TODO: this really should come from __traits(getTargetInfo, "defaultNewAlignment")
2021enum size_t __STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16 ;
2122
23+
2224extern (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
41130extern (C++ ):
42131
0 commit comments