annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 * Implementation of array cast support routines.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * Copyright: Copyright Digital Mars 2004 - 2016.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * License: Distributed under the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 * Authors: Walter Bright, Sean Kelly
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 * Source: $(DRUNTIMESRC src/rt/_arraycast.d)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 module rt.arraycast;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 /******************************************
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 * Runtime helper to convert dynamic array of one
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 * type to dynamic array of another.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 * Adjusts the length of the array.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 * Throws an error if new length is not aligned.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 extern (C)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 @trusted nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 void[] _d_arraycast(size_t tsize, size_t fsize, void[] a)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 auto length = a.length;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 auto nbytes = length * fsize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 if (nbytes % tsize != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 throw new Error("array cast misalignment");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 length = nbytes / tsize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 *cast(size_t *)&a = length; // jam new length
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 byte[int.sizeof * 3] b;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 int[] i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 short[] s;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 i = cast(int[])b;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 assert(i.length == 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 s = cast(short[])b;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 assert(s.length == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 s = cast(short[])i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 assert(s.length == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52