Mercurial > projects > ldc
annotate lphobos/internal/arrays.d @ 109:5ab8e92611f9 trunk
[svn r113] Added initial support for associative arrays (AAs).
Fixed some problems with the string runtime support functions.
Fixed initialization of array of structs.
Fixed slice assignment where LHS is slice but RHS is dynamic array.
Fixed problems with result of assignment expressions.
Fixed foreach problems with key type mismatches.
author | lindquist |
---|---|
date | Wed, 21 Nov 2007 04:13:15 +0100 |
parents | 5071469303d4 |
children |
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 |
109
5ab8e92611f9
[svn r113] Added initial support for associative arrays (AAs).
lindquist
parents:
100
diff
changeset
|
81 void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) |
64
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 |
52 | 91 // for array cast |
92 size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) | |
93 { | |
94 if (newelemsz == 1) { | |
95 return len*elemsz; | |
96 } | |
97 else if (len % newelemsz) { | |
98 throw new Exception("Bad array cast"); | |
99 } | |
100 return (len*elemsz)/newelemsz; | |
101 } | |
91 | 102 |
103 // creating args for main | |
104 void _d_main_args(uint n, char** args, ref char[][] res) | |
105 { | |
106 assert(res.length == n); | |
107 foreach(i,v; args[0..n]) | |
108 { | |
109 res[i] = v[0 .. strlen(v)]; | |
110 } | |
111 } |