annotate ddata/ddata.d @ 4:c5a9d253bfd4

moving to correct folder
author Saaa
date Wed, 07 Oct 2009 14:25:27 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
1 module ddata.ddata;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
2
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
3 //debug
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
4 //import std.stdio;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
5 import std.string;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
6
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
7 import std2.conv : to;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
8 import std2.traits : isNumeric;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
9
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
10 class DDataException : Exception
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
11 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
12 this(char[] msg)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
13 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
14 super(msg);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
15 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
16 this( uint loc, char c, char[] msg)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
17 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
18 super( format( `parsing failed at string[`, loc-1, `] = '`,c,`'` ,msg));
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
19 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
20 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
21
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
22
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
23 private enum TOKEN{ BOF, SQUARE_L, SQUARE_R, COMMA, ECOMMA, VALUE, EOF}
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
24
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
25 private template Depth(T: T[]) { const Depth = 1 + Depth!(T); }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
26 private template Depth(T) { const Depth = 0; }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
27
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
28 private template BaseType(T: T[]) { alias BaseType!(T) BaseType; }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
29 private template BaseType(T) { alias T BaseType; }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
30
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
31 private template indexAssign(T: T[])
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
32 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
33 void indexAssign(ref T array, BaseType!(T) value, int[] indices)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
34 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
35 static if( is( typeof(array[0]) == typeof(value)))
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
36 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
37 array[indices[0]] = value;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
38 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
39 else
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
40 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
41 indexAssign!(T)( array[indices[0]], value, indices[1..$]);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
42 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
43 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
44 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
45
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
46 private string ctToString(int i)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
47 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
48 if (!i) return "0";
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
49 string res;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
50 while (i) {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
51 res = "0123456789"[i%10] ~ res;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
52 i /= 10;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
53 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
54 return res;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
55 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
56
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
57 private string indexString(int len)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
58 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
59 string res;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
60 for (int i = 0; i < len; ++i)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
61 res ~= "[index["~ctToString(i)~"]] ";
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
62 return res;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
63 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
64
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
65 private string casesString(int depth, TOKEN type)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
66 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
67 string res;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
68 res ~= `switch( depth ){`;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
69
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
70 for (int i = 0; i < depth; ++i)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
71 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
72 switch(type)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
73 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
74 case TOKEN.COMMA:
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
75 res ~=`case `~ctToString(i)~`:`~
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
76 `if(temp`~ indexString(i) ~`.length<=index[`~ctToString(i)~`] )temp`~ indexString(i) ~`.length=temp`~ indexString(i) ~`.length*2;`~
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
77 `break;`;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
78 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
79
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
80 case TOKEN.SQUARE_L:
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
81 res ~=`case `~ctToString(i)~`:`~
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
82 `temp`~ indexString(i) ~`.length=4;`~
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
83 `break;`;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
84 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
85
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
86 case TOKEN.SQUARE_R:
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
87 res ~=`case `~ctToString(i)~`:`~
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
88 `temp`~ indexString(i) ~`.length=index[`~ctToString(i)~`];`~
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
89 `break;`;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
90 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
91
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
92 default:
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
93 assert(false);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
94 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
95 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
96 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
97
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
98 res ~= `default:assert(false);break;}`;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
99 return res;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
100 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
101
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
102
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
103 bool toBool(char[] s)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
104 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
105 if(s == `true`)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
106 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
107 return true;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
108 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
109 else if(s == `false`)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
110 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
111 return false;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
112 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
113 else
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
114 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
115 throw new Exception(`Cannot convert "`~s~`" to bool`);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
116 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
117 return false;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
118 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
119
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
120 public T toArray(T:D[],D)(char[] string)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
121 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
122 int[ Depth!(T) ] index = 0;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
123
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
124 T temp;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
125 char c;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
126
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
127 int depth = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
128
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
129 int sLoc1 = -1, sLoc2 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
130 int loc = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
131
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
132 TOKEN last = TOKEN.BOF;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
133
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
134 while(true)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
135 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
136 loc++;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
137 //debug
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
138 //writefln(loc);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
139 if( loc >= string.length )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
140 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
141 if( last != TOKEN.SQUARE_R) throw new DDataException( `unexpected end`);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
142 if( depth != -1 ) throw new DDataException( `array depth not zero after parsing `);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
143 //throw new DDataException(`EOF before end of parsing`);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
144 return temp;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
145 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
146
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
147 c = string[loc];
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
148 //debug
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
149 //writefln(c);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
150 switch(c)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
151 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
152 case ' ', '\t', '\v', '\r', '\n', '\f':
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
153 if( last == TOKEN.ECOMMA || last == TOKEN.SQUARE_L)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
154 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
155 if(sLoc2 < 0)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
156 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
157 sLoc1 = loc + 1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
158 }else{
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
159 sLoc2 = loc;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
160 last = TOKEN.VALUE;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
161 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
162 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
163 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
164
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
165 case ',':
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
166 index[depth] ++;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
167
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
168 // resize array if necessary
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
169 mixin ( casesString(Depth!(T), TOKEN.COMMA ) );
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
170
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
171 if( last == TOKEN.VALUE && depth == Depth!(T)-1 )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
172 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
173 index[depth] --;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
174 static if( is(BaseType!(T) == bool) )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
175 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
176 indexAssign!(T[])( temp, toBool( string[ sLoc1..sLoc2] ), index);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
177 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
178 else static if( isNumeric!( BaseType!(T) ) )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
179 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
180 indexAssign!(T[])( temp, to!( BaseType!(T) )( string[ sLoc1..sLoc2] ), index);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
181 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
182 else
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
183 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
184 assert(false);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
185 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
186 index[depth] ++;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
187 sLoc1 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
188 sLoc2 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
189 last = TOKEN.ECOMMA;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
190 }else if( last == TOKEN.SQUARE_R ){
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
191 last = TOKEN.COMMA;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
192 }else{
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
193 throw new DDataException( loc, c, `: Value, ']' or ',' expected.`);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
194 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
195 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
196
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
197 case '[':
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
198 if( last != TOKEN.COMMA && last != TOKEN.BOF && last != TOKEN.SQUARE_L ) throw new DDataException( loc, c, `: Beginning, '[' or ',' expected.`);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
199
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
200 depth++;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
201 if(depth > index.length) throw new DDataException( loc, c, `: Array too deep = `~toString(depth));
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
202 mixin ( casesString(Depth!(T), TOKEN.SQUARE_L ) );
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
203 index[depth] = 0;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
204 last = TOKEN.SQUARE_L;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
205 sLoc1 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
206 sLoc2 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
207 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
208
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
209 case ']':
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
210 if( last == TOKEN.VALUE && depth == Depth!(T)-1 && sLoc2 != -1)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
211 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
212 static if( is(BaseType!(T) == bool) )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
213 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
214 indexAssign!(T[])( temp, toBool( string[ sLoc1..sLoc2]), index);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
215 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
216 else static if( isNumeric!( BaseType!(T) ) )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
217 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
218 indexAssign!(T[])( temp, to!( BaseType!(T) )(string[ sLoc1..sLoc2]), index);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
219 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
220 else
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
221 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
222 assert(false);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
223 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
224 sLoc1 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
225 sLoc2 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
226 index[depth] ++;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
227 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
228 else if( last == TOKEN.SQUARE_L )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
229 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
230 sLoc1 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
231 sLoc2 = -1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
232 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
233 else if( last == TOKEN.SQUARE_R)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
234 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
235 index[depth] ++;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
236 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
237 else
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
238 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
239 throw new DDataException( loc, c, `: Value, '[' or ']' expected.`);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
240 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
241
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
242 // set array length to index[depth]
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
243 mixin ( casesString(Depth!(T), TOKEN.SQUARE_R) );
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
244
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
245 index[depth] = 0;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
246 depth--;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
247 last = TOKEN.SQUARE_R;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
248 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
249
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
250 default:
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
251 if( last == TOKEN.ECOMMA || last == TOKEN.SQUARE_L || last == TOKEN.VALUE)
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
252 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
253 if( sLoc1 < 0 )
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
254 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
255 sLoc1 = loc;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
256 sLoc2 = loc +1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
257 } else {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
258 sLoc2 = loc +1;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
259 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
260 last = TOKEN.VALUE;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
261 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
262 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
263 throw new DDataException( loc, c, `: Out of place char found `);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
264 break;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
265 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
266 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
267 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
268
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
269 unittest
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
270 {
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
271 writefln("DData UnitTest...");
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
272
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
273 int[][][] ia = [ [[1,2],[3,4],[5]] , [[6],[],[7,8,9]] , [[]] ];
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
274
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
275 char[] s = to!(char[])(ia);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
276 int[][][] ia2;
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
277
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
278 ia2 = toArray!(typeof(ia2))(s);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
279 assert( ia == ia2);
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
280
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
281 writefln("Done!");
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
282 }
c5a9d253bfd4 moving to correct folder
Saaa
parents:
diff changeset
283