]> git.llucax.com Git - software/druntime.git/blob - src/compiler/dmd/arraycast.d
* Moved sys into core.sys
[software/druntime.git] / src / compiler / dmd / arraycast.d
1 /*
2  *  Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com
3  *  Written by Walter Bright
4  *
5  *  This software is provided 'as-is', without any express or implied
6  *  warranty. In no event will the authors be held liable for any damages
7  *  arising from the use of this software.
8  *
9  *  Permission is granted to anyone to use this software for any purpose,
10  *  including commercial applications, and to alter it and redistribute it
11  *  freely, in both source and binary form, subject to the following
12  *  restrictions:
13  *
14  *  o  The origin of this software must not be misrepresented; you must not
15  *     claim that you wrote the original software. If you use this software
16  *     in a product, an acknowledgment in the product documentation would be
17  *     appreciated but is not required.
18  *  o  Altered source versions must be plainly marked as such, and must not
19  *     be misrepresented as being the original software.
20  *  o  This notice may not be removed or altered from any source
21  *     distribution.
22  */
23
24 /*
25  *  Modified by Sean Kelly for use with the D Runtime Project
26  */
27
28 module rt.arraycast;
29
30 /******************************************
31  * Runtime helper to convert dynamic array of one
32  * type to dynamic array of another.
33  * Adjusts the length of the array.
34  * Throws exception if new length is not aligned.
35  */
36
37 extern (C)
38
39 void[] _d_arraycast(size_t tsize, size_t fsize, void[] a)
40 {
41     auto length = a.length;
42
43     auto nbytes = length * fsize;
44     if (nbytes % tsize != 0)
45     {
46     throw new Exception("array cast misalignment");
47     }
48     length = nbytes / tsize;
49     *cast(size_t *)&a = length; // jam new length
50     return a;
51 }
52
53 unittest
54 {
55     byte[int.sizeof * 3] b;
56     int[] i;
57     short[] s;
58
59     i = cast(int[])b;
60     assert(i.length == 3);
61
62     s = cast(short[])b;
63     assert(s.length == 6);
64
65     s = cast(short[])i;
66     assert(s.length == 6);
67 }
68
69 /******************************************
70  * Runtime helper to convert dynamic array of bits
71  * dynamic array of another.
72  * Adjusts the length of the array.
73  * Throws exception if new length is not aligned.
74  */
75
76 version (none)
77 {
78 extern (C)
79
80 void[] _d_arraycast_frombit(uint tsize, void[] a)
81 {
82     uint length = a.length;
83
84     if (length & 7)
85     {
86     throw new Exception("bit[] array cast misalignment");
87     }
88     length /= 8 * tsize;
89     *cast(size_t *)&a = length; // jam new length
90     return a;
91 }
92
93 unittest
94 {
95     version (D_Bits)
96     {
97     bit[int.sizeof * 3 * 8] b;
98     int[] i;
99     short[] s;
100
101     i = cast(int[])b;
102     assert(i.length == 3);
103
104     s = cast(short[])b;
105     assert(s.length == 6);
106     }
107 }
108
109 }