Mercurial > projects > ldc
annotate lphobos/internal/arrays.d @ 64:b688ad419f8c trunk
[svn r68] Added support for multi-dimensional static arrays.
Several bugfixes to array support.
author | lindquist |
---|---|
date | Thu, 25 Oct 2007 12:09:13 +0200 |
parents | 0c77619e803b |
children | 3f949c6e2e9d |
rev | line source |
---|---|
1 | 1 module internal.arrays; |
2 | |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
3 private import llvm.intrinsic; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
4 |
1 | 5 extern(C): |
6 | |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
7 int memcmp(void*,void*,size_t); |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
8 |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
9 version(LLVM64) |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
10 alias llvm_memcpy_i64 llvm_memcpy; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
11 else |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
12 alias llvm_memcpy_i32 llvm_memcpy; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
13 |
40 | 14 // per-element array init routines |
15 | |
1 | 16 void _d_array_init_i1(bool* a, size_t n, bool v) |
17 { | |
18 auto p = a; | |
19 auto end = a+n; | |
20 while (p !is end) | |
21 *p++ = v; | |
22 } | |
23 | |
24 void _d_array_init_i8(ubyte* a, size_t n, ubyte v) | |
25 { | |
26 auto p = a; | |
27 auto end = a+n; | |
28 while (p !is end) | |
29 *p++ = v; | |
30 } | |
31 | |
32 void _d_array_init_i16(ushort* a, size_t n, ushort v) | |
33 { | |
34 auto p = a; | |
35 auto end = a+n; | |
36 while (p !is end) | |
37 *p++ = v; | |
38 } | |
39 | |
40 void _d_array_init_i32(uint* a, size_t n, uint v) | |
41 { | |
42 auto p = a; | |
43 auto end = a+n; | |
44 while (p !is end) | |
45 *p++ = v; | |
46 } | |
47 | |
48 void _d_array_init_i64(ulong* a, size_t n, ulong v) | |
49 { | |
50 auto p = a; | |
51 auto end = a+n; | |
52 while (p !is end) | |
53 *p++ = v; | |
54 } | |
55 | |
56 void _d_array_init_float(float* a, size_t n, float v) | |
57 { | |
58 auto p = a; | |
59 auto end = a+n; | |
60 while (p !is end) | |
61 *p++ = v; | |
62 } | |
63 | |
64 void _d_array_init_double(double* a, size_t n, double v) | |
65 { | |
66 auto p = a; | |
67 auto end = a+n; | |
68 while (p !is end) | |
69 *p++ = v; | |
70 } | |
71 | |
72 void _d_array_init_pointer(void** a, size_t n, void* v) | |
73 { | |
74 auto p = a; | |
75 auto end = a+n; | |
76 while (p !is end) | |
77 *p++ = v; | |
78 } | |
40 | 79 |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
80 void _d_array_init(void* a, size_t na, void* v, size_t nv) |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
81 { |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
82 auto p = a; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
83 auto end = a + na*nv; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
84 while (p !is end) { |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
85 llvm_memcpy(p,v,nv,0); |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
86 p += nv; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
87 } |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
88 } |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
89 |
40 | 90 // array comparison routines |
91 | |
92 bool _d_static_array_eq(void* lhs, void* rhs, size_t bytesize) | |
93 { | |
94 if (lhs is rhs) | |
95 return true; | |
96 return memcmp(lhs,rhs,bytesize) == 0; | |
97 } | |
98 | |
99 bool _d_static_array_neq(void* lhs, void* rhs, size_t bytesize) | |
100 { | |
101 if (lhs is rhs) | |
102 return false; | |
103 return memcmp(lhs,rhs,bytesize) != 0; | |
104 } | |
105 | |
52 | 106 bool _d_dyn_array_eq(void[] lhs, void[] rhs) |
107 { | |
108 if (lhs.length != rhs.length) | |
109 return false; | |
110 else if (lhs is rhs) | |
111 return true; | |
112 return memcmp(lhs.ptr,rhs.ptr,lhs.length) == 0; | |
113 } | |
114 | |
115 bool _d_dyn_array_neq(void[] lhs, void[] rhs) | |
116 { | |
117 if (lhs.length != rhs.length) | |
118 return true; | |
119 else if (lhs is rhs) | |
120 return false; | |
121 return memcmp(lhs.ptr,rhs.ptr,lhs.length) != 0; | |
122 } | |
123 | |
124 // for array cast | |
125 size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) | |
126 { | |
127 if (newelemsz == 1) { | |
128 return len*elemsz; | |
129 } | |
130 else if (len % newelemsz) { | |
131 throw new Exception("Bad array cast"); | |
132 } | |
133 return (len*elemsz)/newelemsz; | |
134 } |