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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
1 module internal.arrays;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
5 extern(C):
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
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
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
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
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 1
diff changeset
15 // per-element array init routines
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 1
diff changeset
16
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
17 void _d_array_init_i1(bool* a, size_t n, bool v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
18 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
19 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
20 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
21 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
22 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
23 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
24
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
25 void _d_array_init_i8(ubyte* a, size_t n, ubyte v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
26 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
27 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
28 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
29 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
30 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
31 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
32
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
33 void _d_array_init_i16(ushort* a, size_t n, ushort v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
34 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
35 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
36 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
37 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
38 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
39 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
40
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
41 void _d_array_init_i32(uint* a, size_t n, uint v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
42 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
43 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
44 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
45 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
46 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
47 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
48
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
49 void _d_array_init_i64(ulong* a, size_t n, ulong v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
50 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
51 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
52 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
53 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
54 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
55 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
56
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
57 void _d_array_init_float(float* a, size_t n, float v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
58 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
59 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
60 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
61 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
62 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
63 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
64
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
65 void _d_array_init_double(double* a, size_t n, double v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
66 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
67 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
68 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
69 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
70 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
71 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
72
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
73 void _d_array_init_pointer(void** a, size_t n, void* v)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
74 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
75 auto p = a;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
76 auto end = a+n;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
77 while (p !is end)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
78 *p++ = v;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
79 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 1
diff changeset
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
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
91 // for array cast
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
92 size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
93 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
94 if (newelemsz == 1) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
95 return len*elemsz;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
96 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
97 else if (len % newelemsz) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
98 throw new Exception("Bad array cast");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
99 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
100 return (len*elemsz)/newelemsz;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
101 }
91
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
102
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
103 // creating args for main
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
104 void _d_main_args(uint n, char** args, ref char[][] res)
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
105 {
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
106 assert(res.length == n);
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
107 foreach(i,v; args[0..n])
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
108 {
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
109 res[i] = v[0 .. strlen(v)];
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
110 }
3f949c6e2e9d [svn r95] added support for mains like:
lindquist
parents: 64
diff changeset
111 }