@@ -15,9 +15,11 @@ import core.stdcpp.xutility : __cpp_sized_deallocation, __cpp_aligned_new;
15
15
16
16
@nogc :
17
17
18
+
18
19
// TODO: this really should come from __traits(getTargetInfo, "defaultNewAlignment")
19
20
enum size_t __STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16 ;
20
21
22
+
21
23
extern (C++ , " std" )
22
24
{
23
25
// /
@@ -28,6 +30,93 @@ extern (C++, "std")
28
30
}
29
31
30
32
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
+
31
120
// raw C++ functions
32
121
extern (C++ ):
33
122
0 commit comments