/** * Implementation of array copy support routines. * * Copyright: Copyright Digital Mars 2004 - 2016. * License: Distributed under the * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). * Authors: Walter Bright, Sean Kelly * Source: $(DRUNTIMESRC rt/_arraycat.d) */ module rt.arraycat; private { import core.stdc.string; debug(PRINTF) import core.stdc.stdio; } extern (C) @trusted nothrow: version (LDC) { void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen, size_t elemsz) { import ldc.intrinsics : llvm_memcpy; if (dstlen != 0) assert(dst, "Error in _d_array_slice_copy"); if (dstlen != 0) assert(src, "Error in _d_array_slice_copy"); if (dstlen != srclen) assert(0, "Error in _d_array_slice_copy"); else if (dst+dstlen*elemsz <= src || src+srclen*elemsz <= dst) { llvm_memcpy!size_t(dst, src, dstlen * elemsz, 0); } else assert(0, "Error in _d_array_slice_copy"); } } else { void[] _d_arraycopy(size_t size, void[] from, void[] to) { if (dstlen != 0) assert(dst,"Error in _d_arraycopy"); if (dstlen != 0) assert(src,"Error in _d_arraycopy"); if (dstlen != srclen) assert(0, "Error in _d_arraycopy"); else if (dst+dstlen*elemsz <= src || src+srclen*elemsz <= dst) { memcpy(to.ptr, from.ptr, to.length * size); } else { assert(0,"Error in _d_arraycopy"); } return to; } }