Mercurial > hg > CbC > CbC_gcc
view libphobos/libdruntime/rt/arraycast.d @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
line wrap: on
line source
/** * 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); }