Mercurial > projects > orange
annotate orange/util/CTFE.d @ 1:11a31bd929f9
Removed dependency on private library
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Mon, 31 May 2010 16:06:36 +0200 |
parents | f7b078e85f7f |
children | ea37a9470e3e |
rev | line source |
---|---|
0 | 1 /** |
2 * Copyright: Copyright (c) 2010 Jacob Carlborg. | |
3 * Authors: Jacob Carlborg | |
4 * Version: Initial created: Jan 26, 2010 | |
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) | |
6 */ | |
7 module orange.util.CTFE; | |
8 | |
1
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
9 import orange.util.string; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
10 import orange.util.Traits; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
11 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
12 template format (ARGS...) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
13 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
14 static if (ARGS.length == 0) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
15 const format = ""; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
16 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
17 else |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
18 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
19 static if (is(typeof(ARGS[0]) : string)) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
20 const format = ARGS[0] ~ format!(ARGS[1 .. $]); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
21 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
22 else |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
23 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
24 pragma(msg, typeof(ARGS[0].stringof)); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
25 const format = toString_!(ARGS[0]) ~ format!(ARGS[1 .. $]); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
26 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
27 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
28 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
29 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
30 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
31 private |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
32 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
33 template toString_ (T) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
34 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
35 const toString_ = T.stringof; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
36 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
37 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
38 template toString_ (int i) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
39 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
40 const toString_ = itoa!(i); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
41 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
42 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
43 template toString_ (long l) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
44 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
45 const toString_ = itoa!(l); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
46 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
47 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
48 template toString_ (bool b) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
49 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
50 const toString_ = b ? "true" : "false"; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
51 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
52 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
53 template toString_ (float f) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
54 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
55 const toString_ = ""; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
56 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
57 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
58 template toString_ (alias a) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
59 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
60 const toString_ = a.stringof; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
61 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
62 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
63 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
64 /** |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
65 * Compile-time function to get the index of the give element. |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
66 * |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
67 * Performs a linear scan, returning the index of the first occurrence |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
68 * of the specified element in the array, or U.max if the array does |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
69 * not contain the element. |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
70 * |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
71 * Params: |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
72 * arr = the array to get the index of the element from |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
73 * element = the element to find |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
74 * |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
75 * Returns: the index of the element or size_t.max if the element was not found. |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
76 */ |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
77 size_t indexOf (T) (T[] arr, T element) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
78 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
79 static if (is(T == char) || is(T == wchar) || is(T == dchar)) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
80 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
81 foreach (i, e ; arr) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
82 if (e == element) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
83 return i; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
84 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
85 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
86 else |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
87 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
88 foreach (i, e ; arr) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
89 if (e == element) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
90 return i; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
91 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
92 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
93 return size_t.max; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
94 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
95 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
96 /** |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
97 * Returns true if the given array contains the given element, |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
98 * otherwise false. |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
99 * |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
100 * Params: |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
101 * arr = the array to search in for the element |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
102 * element = the element to search for |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
103 * |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
104 * Returns: true if the array contains the element, otherwise false |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
105 */ |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
106 bool contains (T) (T[] arr, T element) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
107 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
108 return arr.indexOf(element) != size_t.max; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
109 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
110 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
111 /** |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
112 * CTFE, splits the given string on the given pattern |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
113 * |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
114 * Params: |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
115 * str = the string to split |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
116 * splitChar = the character to split on |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
117 * |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
118 * Returns: an array of strings containing the splited string |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
119 */ |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
120 T[][] split (T) (T[] str, T splitChar = ',') |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
121 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
122 T[][] arr; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
123 size_t x; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
124 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
125 foreach (i, c ; str) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
126 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
127 if (splitChar == c) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
128 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
129 if (str[x] == splitChar) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
130 x++; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
131 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
132 arr ~= str[x .. i]; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
133 x = i; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
134 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
135 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
136 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
137 if (str[x] == splitChar) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
138 x++; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
139 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
140 arr ~= str[x .. $]; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
141 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
142 return arr; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
143 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
144 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
145 private: |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
146 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
147 template decimalDigit (int n) // [3] |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
148 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
149 const decimalDigit = "0123456789"[n .. n + 1]; |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
150 } |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
151 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
152 template itoa (long n) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
153 { |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
154 static if (n < 0) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
155 const itoa = "-" ~ itoa!(-n); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
156 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
157 else static if (n < 10) |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
158 const itoa = decimalDigit!(n); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
159 |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
160 else |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
161 const itoa = itoa!(n / 10L) ~ decimalDigit!(n % 10L); |
11a31bd929f9
Removed dependency on private library
Jacob Carlborg <doob@me.com>
parents:
0
diff
changeset
|
162 } |