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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1 /**
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
2 * Copyright: Copyright (c) 2010 Jacob Carlborg.
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
3 * Authors: Jacob Carlborg
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
4 * Version: Initial created: Jan 26, 2010
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
6 */
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
7 module orange.util.CTFE;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
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 }