diff --git a/src/dmd/cppmangle.d b/src/dmd/cppmangle.d index 12b445166156..e033f25e0377 100644 --- a/src/dmd/cppmangle.d +++ b/src/dmd/cppmangle.d @@ -877,6 +877,20 @@ public: } } + override void visit(TypeDArray t) + { + //if (substitute(t)) + //return; + + // from: template_args + buf.writestring("8__dslice"); + buf.writeByte('I'); + Type t2 = t.next; + assert(t2); + headOfType(t2); + buf.writeByte('E'); + } + override void visit(TypeSArray t) { if (t.isImmutable() || t.isShared()) diff --git a/src/dmd/interop.d b/src/dmd/interop.d new file mode 100644 index 000000000000..75a1216a836c --- /dev/null +++ b/src/dmd/interop.d @@ -0,0 +1,31 @@ +/+ +Example usage: +extern (C++) Dstring funLib(Dstring input) +{ + import std.string : toUpper; + import std.conv : to; + return input.toNative.toUpper.to!Dstring; +} ++/ + +extern (C++) struct Darray(T) +{ + size_t length; + T* ptr; + + extern (D) this(T[] a) + { + this.length = a.length; + this.ptr = a.ptr; + } + + extern (D) T[] toNative() + { + // TODO: could even use a raw cast since ABI is same + return ptr[0 .. length]; + } +} + +alias Dstring = Darray!char; +alias Dcstring = Darray!(const(char)); +