| /** | |
| * Implementation of array cast 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 src/rt/_arraycast.d) | |
| */ | |
| module rt.arraycast; | |
| /****************************************** | |
| * Runtime helper to convert dynamic array of one | |
| * type to dynamic array of another. | |
| * Adjusts the length of the array. | |
| * Throws an error if new length is not aligned. | |
| */ | |
| extern (C) | |
| @trusted nothrow | |
| void[] _d_arraycast(size_t tsize, size_t fsize, void[] a) | |
| { | |
| auto length = a.length; | |
| auto nbytes = length * fsize; | |
| if (nbytes % tsize != 0) | |
| { | |
| throw new Error("array cast misalignment"); | |
| } | |
| length = nbytes / tsize; | |
| *cast(size_t *)&a = length; // jam new length | |
| return a; | |
| } | |
| unittest | |
| { | |
| byte[int.sizeof * 3] b; | |
| int[] i; | |
| short[] s; | |
| i = cast(int[])b; | |
| assert(i.length == 3); | |
| s = cast(short[])b; | |
| assert(s.length == 6); | |
| s = cast(short[])i; | |
| assert(s.length == 6); | |
| } | |