34 #include "geometry.h" |
34 #include "geometry.h" |
35 |
35 |
36 #define FORMAT_OVERLOAD(...) \ |
36 #define FORMAT_OVERLOAD(...) \ |
37 inline FUNCTION make_format_argument (__VA_ARGS__ a) -> String |
37 inline FUNCTION make_format_argument (__VA_ARGS__ a) -> String |
38 |
38 |
39 // |
39 // ------------------------------------------------------------------------------------------------- |
40 // ------------------------------------------------------------------------------------------------- |
40 // |
41 // |
|
42 |
|
43 FORMAT_OVERLOAD (String) { return a; } |
41 FORMAT_OVERLOAD (String) { return a; } |
44 FORMAT_OVERLOAD (char) { return String (a); } |
42 FORMAT_OVERLOAD (char) { return String (a); } |
45 FORMAT_OVERLOAD (int) { return String::from_number (a); } |
43 FORMAT_OVERLOAD (int) { return String::from_number (a); } |
46 FORMAT_OVERLOAD (long int) { return String::from_number (a); } |
44 FORMAT_OVERLOAD (long int) { return String::from_number (a); } |
47 FORMAT_OVERLOAD (double) { return String::from_number (a); } |
45 FORMAT_OVERLOAD (double) { return String::from_number (a); } |
105 result.sprintf ("{(%d, %d), (%dx%d)}", a.x, a.y, a.width, a.height); |
103 result.sprintf ("{(%d, %d), (%dx%d)}", a.x, a.y, a.width, a.height); |
106 return result; |
104 return result; |
107 } |
105 } |
108 |
106 |
109 // ------------------------------------------------------------------------------------------------- |
107 // ------------------------------------------------------------------------------------------------- |
|
108 // |
110 // Formats the given string with the given args. |
109 // Formats the given string with the given args. |
111 // |
110 // |
112 FUNCTION format_args (const String& fmtstr, const Vector<String>& args) -> String; |
111 FUNCTION format_args (const String& fmtstr, const Vector<String>& args) -> String; |
113 |
112 |
114 // ------------------------------------------------------------------------------------------------- |
113 // ------------------------------------------------------------------------------------------------- |
|
114 // |
115 // Expands the given arguments into a vector of strings. |
115 // Expands the given arguments into a vector of strings. |
116 // |
116 // |
117 template<typename T, typename... RestTypes> FUNCTION |
117 template<typename T, typename... RestTypes> FUNCTION |
118 expand_format_arguments (Vector<String>& data, const T& arg, const RestTypes& ... rest) -> void |
118 expand_format_arguments (Vector<String>& data, const T& arg, const RestTypes& ... rest) -> void |
119 { |
119 { |
156 expand_format_arguments (args, raw_args...); |
156 expand_format_arguments (args, raw_args...); |
157 return format_args (fmtstr, args); |
157 return format_args (fmtstr, args); |
158 } |
158 } |
159 |
159 |
160 // ------------------------------------------------------------------------------------------------- |
160 // ------------------------------------------------------------------------------------------------- |
|
161 // |
161 // This is an overload of format() where no arguments are supplied. |
162 // This is an overload of format() where no arguments are supplied. |
162 // It returns the formatter string as-is. |
163 // It returns the formatter string as-is. |
163 // |
164 // |
164 static String format (const String& fmtstr) __attribute__ ((unused)); |
165 static String format (const String& fmtstr) __attribute__ ((unused)); |
165 static String // FUNCTION |
166 static String // FUNCTION |
167 { |
168 { |
168 return fmtstr; |
169 return fmtstr; |
169 } |
170 } |
170 |
171 |
171 // ------------------------------------------------------------------------------------------------- |
172 // ------------------------------------------------------------------------------------------------- |
|
173 // |
172 // Prints the formatting result to the given file handle |
174 // Prints the formatting result to the given file handle |
173 // |
175 // |
174 template<typename... Args> FUNCTION |
176 template<typename... Args> FUNCTION |
175 print_to (FILE* fp, const String& fmtstr, Args const& ...args) -> void |
177 print_to (FILE* fp, const String& fmtstr, Args const& ...args) -> void |
176 { |
178 { |
177 std::fprintf (fp, "%s", format (fmtstr, args...).chars()); |
179 std::fprintf (fp, "%s", format (fmtstr, args...).chars()); |
178 } |
180 } |
179 |
181 |
180 // ------------------------------------------------------------------------------------------------- |
182 // ------------------------------------------------------------------------------------------------- |
|
183 // |
181 // Appends the formatting result to the given filename, if opening it succeeds |
184 // Appends the formatting result to the given filename, if opening it succeeds |
182 // |
185 // |
183 template<typename... argtypes> |
186 template<typename... argtypes> |
184 void print_to (const String& filename, const String& fmtstr, const argtypes&... args) |
187 void print_to (const String& filename, const String& fmtstr, const argtypes&... args) |
185 { |
188 { |
191 fclose (handle); |
194 fclose (handle); |
192 } |
195 } |
193 } |
196 } |
194 |
197 |
195 // ------------------------------------------------------------------------------------------------- |
198 // ------------------------------------------------------------------------------------------------- |
|
199 // |
196 // Prints the formatting result to the console |
200 // Prints the formatting result to the console |
197 // |
201 // |
198 template<typename... argtypes> |
202 template<typename... argtypes> |
199 void print (const String& fmtstr, const argtypes&... args) |
203 void print (const String& fmtstr, const argtypes&... args) |
200 { |
204 { |