@@ -16,9 +16,11 @@ import core.stdcpp.exception : exception;
16
16
17
17
@nogc :
18
18
19
+
19
20
// TODO: this really should come from __traits(getTargetInfo, "defaultNewAlignment")
20
21
enum size_t __STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16 ;
21
22
23
+
22
24
extern (C++ , " std" )
23
25
{
24
26
// /
@@ -37,6 +39,93 @@ extern (C++, "std")
37
39
}
38
40
39
41
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
+
40
129
// raw C++ functions
41
130
extern (C++ ):
42
131
0 commit comments