Mercurial > projects > ldc
annotate lphobos/internal/arrays.d @ 94:61615fa85940 trunk
[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
Added support for array .sort and .reverse properties.
Fixed some bugs with pointer arithmetic.
Disabled some DMD AST optimizations that was messing things up, destroying valuable information.
Added a KDevelop project file, this is what I use for coding LLVMDC now :)
Other minor stuff.
author | lindquist |
---|---|
date | Mon, 12 Nov 2007 06:32:46 +0100 |
parents | 3f949c6e2e9d |
children | 5071469303d4 |
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); |
91 | 8 size_t strlen(char*); |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
9 |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
10 version(LLVM64) |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
11 alias llvm_memcpy_i64 llvm_memcpy; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
12 else |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
13 alias llvm_memcpy_i32 llvm_memcpy; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
14 |
40 | 15 // per-element array init routines |
16 | |
1 | 17 void _d_array_init_i1(bool* a, size_t n, bool v) |
18 { | |
19 auto p = a; | |
20 auto end = a+n; | |
21 while (p !is end) | |
22 *p++ = v; | |
23 } | |
24 | |
25 void _d_array_init_i8(ubyte* a, size_t n, ubyte v) | |
26 { | |
27 auto p = a; | |
28 auto end = a+n; | |
29 while (p !is end) | |
30 *p++ = v; | |
31 } | |
32 | |
33 void _d_array_init_i16(ushort* a, size_t n, ushort v) | |
34 { | |
35 auto p = a; | |
36 auto end = a+n; | |
37 while (p !is end) | |
38 *p++ = v; | |
39 } | |
40 | |
41 void _d_array_init_i32(uint* a, size_t n, uint v) | |
42 { | |
43 auto p = a; | |
44 auto end = a+n; | |
45 while (p !is end) | |
46 *p++ = v; | |
47 } | |
48 | |
49 void _d_array_init_i64(ulong* a, size_t n, ulong v) | |
50 { | |
51 auto p = a; | |
52 auto end = a+n; | |
53 while (p !is end) | |
54 *p++ = v; | |
55 } | |
56 | |
57 void _d_array_init_float(float* a, size_t n, float v) | |
58 { | |
59 auto p = a; | |
60 auto end = a+n; | |
61 while (p !is end) | |
62 *p++ = v; | |
63 } | |
64 | |
65 void _d_array_init_double(double* a, size_t n, double v) | |
66 { | |
67 auto p = a; | |
68 auto end = a+n; | |
69 while (p !is end) | |
70 *p++ = v; | |
71 } | |
72 | |
73 void _d_array_init_pointer(void** a, size_t n, void* v) | |
74 { | |
75 auto p = a; | |
76 auto end = a+n; | |
77 while (p !is end) | |
78 *p++ = v; | |
79 } | |
40 | 80 |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
81 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
|
82 { |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
83 auto p = a; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
84 auto end = a + na*nv; |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
85 while (p !is end) { |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
86 llvm_memcpy(p,v,nv,0); |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
87 p += nv; |
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 } |
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
52
diff
changeset
|
90 |
40 | 91 // array comparison routines |
92 | |
93 bool _d_static_array_eq(void* lhs, void* rhs, size_t bytesize) | |
94 { | |
95 if (lhs is rhs) | |
96 return true; | |
97 return memcmp(lhs,rhs,bytesize) == 0; | |
98 } | |
99 | |
100 bool _d_static_array_neq(void* lhs, void* rhs, size_t bytesize) | |
101 { | |
102 if (lhs is rhs) | |
103 return false; | |
104 return memcmp(lhs,rhs,bytesize) != 0; | |
105 } | |
106 | |
52 | 107 bool _d_dyn_array_eq(void[] lhs, void[] rhs) |
108 { | |
109 if (lhs.length != rhs.length) | |
110 return false; | |
111 else if (lhs is rhs) | |
112 return true; | |
113 return memcmp(lhs.ptr,rhs.ptr,lhs.length) == 0; | |
114 } | |
115 | |
116 bool _d_dyn_array_neq(void[] lhs, void[] rhs) | |
117 { | |
118 if (lhs.length != rhs.length) | |
119 return true; | |
120 else if (lhs is rhs) | |
121 return false; | |
122 return memcmp(lhs.ptr,rhs.ptr,lhs.length) != 0; | |
123 } | |
124 | |
125 // for array cast | |
126 size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) | |
127 { | |
128 if (newelemsz == 1) { | |
129 return len*elemsz; | |
130 } | |
131 else if (len % newelemsz) { | |
132 throw new Exception("Bad array cast"); | |
133 } | |
134 return (len*elemsz)/newelemsz; | |
135 } | |
91 | 136 |
137 // creating args for main | |
138 void _d_main_args(uint n, char** args, ref char[][] res) | |
139 { | |
140 assert(res.length == n); | |
141 foreach(i,v; args[0..n]) | |
142 { | |
143 res[i] = v[0 .. strlen(v)]; | |
144 } | |
145 } |