comparison armadillo-3.900.4/include/armadillo_bits/format_wrap.hpp @ 49:1ec0e2823891

Switch to using subrepo copies of qm-dsp, nnls-chroma, vamp-plugin-sdk; update Armadillo version; assume build without external BLAS/LAPACK
author Chris Cannam
date Thu, 13 Jun 2013 10:25:24 +0100
parents
children
comparison
equal deleted inserted replaced
48:69251e11a913 49:1ec0e2823891
1 // Copyright (C) 2008-2010 NICTA (www.nicta.com.au)
2 // Copyright (C) 2008-2010 Conrad Sanderson
3 //
4 // This Source Code Form is subject to the terms of the Mozilla Public
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
8
9 //! \addtogroup format_wrap
10 //! @{
11
12
13 //! \namespace arma_boost namespace for functions and classes which partially emulate Boost functionality
14 namespace arma_boost
15 {
16
17 #if defined(ARMA_USE_BOOST_FORMAT)
18
19 using boost::format;
20 using boost::basic_format;
21 using boost::str;
22
23 #else
24
25 #if defined(ARMA_HAVE_STD_SNPRINTF)
26
27 #define arma_snprintf std::snprintf
28
29 #else
30
31 // better-than-nothing emulation of C99 snprintf(),
32 // with correct return value and null-terminated output string.
33 // note that _snprintf() provided by MS is not a good substitute for snprintf()
34
35 inline
36 int
37 arma_snprintf(char* out, size_t size, const char* fmt, ...)
38 {
39 size_t i;
40
41 for(i=0; i<size; ++i)
42 {
43 out[i] = fmt[i];
44 if(fmt[i] == char(0))
45 break;
46 }
47
48 if(size > 0)
49 out[size-1] = char(0);
50
51 return int(i);
52 }
53
54 #endif
55
56 class format
57 {
58 public:
59
60 format(const char* in_fmt)
61 : A(in_fmt)
62 {
63 }
64
65 format(const std::string& in_fmt)
66 : A(in_fmt)
67 {
68 }
69
70
71 const std::string A;
72
73 private:
74 format();
75 };
76
77
78
79 template<typename T1, typename T2>
80 class basic_format
81 {
82 public:
83
84 basic_format(const T1& in_A, const T2& in_B)
85 : A(in_A)
86 , B(in_B)
87 {
88 }
89
90 const T1& A;
91 const T2& B;
92
93 private:
94 basic_format();
95 };
96
97
98
99 template<typename T2>
100 inline
101 basic_format< format, T2 >
102 operator% (const format& X, const T2& arg)
103 {
104 return basic_format< format, T2 >(X, arg);
105 }
106
107
108
109 template<typename T1, typename T2, typename T3>
110 inline
111 basic_format< basic_format<T1,T2>, T3 >
112 operator% (const basic_format<T1,T2>& X, const T3& arg)
113 {
114 return basic_format< basic_format<T1,T2>, T3 >(X, arg);
115 }
116
117
118
119 template<typename T2>
120 inline
121 std::string
122 str(const basic_format< format, T2>& X)
123 {
124 char local_buffer[1024];
125 char* buffer = local_buffer;
126
127 int buffer_size = 1024;
128 int required_size = buffer_size;
129
130 bool using_local_buffer = true;
131
132 std::string out;
133
134 do
135 {
136 if(using_local_buffer == false)
137 {
138 buffer = new char[buffer_size];
139 }
140
141 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.c_str(), X.B);
142
143 if(required_size < buffer_size)
144 {
145 if(required_size > 0)
146 {
147 out = buffer;
148 }
149 }
150 else
151 {
152 buffer_size *= 2;
153 }
154
155 if(using_local_buffer == true)
156 {
157 using_local_buffer = false;
158 }
159 else
160 {
161 delete[] buffer;
162 }
163
164 } while( (required_size >= buffer_size) );
165
166 return out;
167 }
168
169
170
171 template<typename T2, typename T3>
172 inline
173 std::string
174 str(const basic_format< basic_format< format, T2>, T3>& X)
175 {
176 char local_buffer[1024];
177 char* buffer = local_buffer;
178
179 int buffer_size = 1024;
180 int required_size = buffer_size;
181
182 bool using_local_buffer = true;
183
184 std::string out;
185
186 do
187 {
188 if(using_local_buffer == false)
189 {
190 buffer = new char[buffer_size];
191 }
192
193 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.c_str(), X.A.B, X.B);
194
195 if(required_size < buffer_size)
196 {
197 if(required_size > 0)
198 {
199 out = buffer;
200 }
201 }
202 else
203 {
204 buffer_size *= 2;
205 }
206
207 if(using_local_buffer == true)
208 {
209 using_local_buffer = false;
210 }
211 else
212 {
213 delete[] buffer;
214 }
215
216 } while( (required_size >= buffer_size) );
217
218 return out;
219 }
220
221
222
223 template<typename T2, typename T3, typename T4>
224 inline
225 std::string
226 str(const basic_format< basic_format< basic_format< format, T2>, T3>, T4>& X)
227 {
228 char local_buffer[1024];
229 char* buffer = local_buffer;
230
231 int buffer_size = 1024;
232 int required_size = buffer_size;
233
234 bool using_local_buffer = true;
235
236 std::string out;
237
238 do
239 {
240 if(using_local_buffer == false)
241 {
242 buffer = new char[buffer_size];
243 }
244
245 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.c_str(), X.A.A.B, X.A.B, X.B);
246
247 if(required_size < buffer_size)
248 {
249 if(required_size > 0)
250 {
251 out = buffer;
252 }
253 }
254 else
255 {
256 buffer_size *= 2;
257 }
258
259 if(using_local_buffer == true)
260 {
261 using_local_buffer = false;
262 }
263 else
264 {
265 delete[] buffer;
266 }
267
268 } while( (required_size >= buffer_size) );
269
270 return out;
271 }
272
273
274
275 template<typename T2, typename T3, typename T4, typename T5>
276 inline
277 std::string
278 str(const basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>& X)
279 {
280 char local_buffer[1024];
281 char* buffer = local_buffer;
282
283 int buffer_size = 1024;
284 int required_size = buffer_size;
285
286 bool using_local_buffer = true;
287
288 std::string out;
289
290 do
291 {
292 if(using_local_buffer == false)
293 {
294 buffer = new char[buffer_size];
295 }
296
297 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.c_str(), X.A.A.A.B, X.A.A.B, X.A.B, X.B);
298
299 if(required_size < buffer_size)
300 {
301 if(required_size > 0)
302 {
303 out = buffer;
304 }
305 }
306 else
307 {
308 buffer_size *= 2;
309 }
310
311 if(using_local_buffer == true)
312 {
313 using_local_buffer = false;
314 }
315 else
316 {
317 delete[] buffer;
318 }
319
320 } while( (required_size >= buffer_size) );
321
322 return out;
323 }
324
325
326
327 template<typename T2, typename T3, typename T4, typename T5, typename T6>
328 inline
329 std::string
330 str(const basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>& X)
331 {
332 char local_buffer[1024];
333 char* buffer = local_buffer;
334
335 int buffer_size = 1024;
336 int required_size = buffer_size;
337
338 bool using_local_buffer = true;
339
340 std::string out;
341
342 do
343 {
344 if(using_local_buffer == false)
345 {
346 buffer = new char[buffer_size];
347 }
348
349 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.c_str(), X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B);
350
351 if(required_size < buffer_size)
352 {
353 if(required_size > 0)
354 {
355 out = buffer;
356 }
357 }
358 else
359 {
360 buffer_size *= 2;
361 }
362
363 if(using_local_buffer == true)
364 {
365 using_local_buffer = false;
366 }
367 else
368 {
369 delete[] buffer;
370 }
371
372 } while( (required_size >= buffer_size) );
373
374 return out;
375 }
376
377
378
379 template<typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
380 inline
381 std::string
382 str(const basic_format< basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>, T7>& X)
383 {
384 char local_buffer[1024];
385 char* buffer = local_buffer;
386
387 int buffer_size = 1024;
388 int required_size = buffer_size;
389
390 bool using_local_buffer = true;
391
392 std::string out;
393
394 do
395 {
396 if(using_local_buffer == false)
397 {
398 buffer = new char[buffer_size];
399 }
400
401 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.A.c_str(), X.A.A.A.A.A.B, X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B);
402
403 if(required_size < buffer_size)
404 {
405 if(required_size > 0)
406 {
407 out = buffer;
408 }
409 }
410 else
411 {
412 buffer_size *= 2;
413 }
414
415 if(using_local_buffer == true)
416 {
417 using_local_buffer = false;
418 }
419 else
420 {
421 delete[] buffer;
422 }
423
424 } while( (required_size >= buffer_size) );
425
426 return out;
427 }
428
429
430
431 template<typename T1>
432 struct format_metaprog
433 {
434 static const uword depth = 0;
435
436 inline
437 static
438 const std::string&
439 get_fmt(const T1& X)
440 {
441 return X.A;
442 }
443 };
444
445
446
447 //template<>
448 template<typename T1, typename T2>
449 struct format_metaprog< basic_format<T1,T2> >
450 {
451 static const uword depth = 1 + format_metaprog<T1>::depth;
452
453 inline
454 static
455 const std::string&
456 get_fmt(const T1& X)
457 {
458 return format_metaprog<T1>::get_fmt(X.A);
459 }
460
461 };
462
463
464
465 template<typename T1, typename T2>
466 inline
467 std::string
468 str(const basic_format<T1,T2>& X)
469 {
470 return format_metaprog< basic_format<T1,T2> >::get_fmt(X.A);
471 }
472
473
474
475 template<typename T1, typename T2>
476 inline
477 std::ostream&
478 operator<< (std::ostream& o, const basic_format<T1,T2>& X)
479 {
480 o << str(X);
481 return o;
482 }
483
484
485 #endif
486
487
488 template<typename T> struct string_only { };
489 template<> struct string_only<std::string> { typedef std::string result; };
490
491 template<typename T> struct char_only { };
492 template<> struct char_only<char > { typedef char result; };
493
494 template<typename T>
495 struct basic_format_only { };
496
497 #if defined(ARMA_USE_BOOST_FORMAT)
498 template<typename T>
499 struct basic_format_only< basic_format<T> > { typedef basic_format<T> result; };
500 #else
501 template<typename T1, typename T2>
502 struct basic_format_only< basic_format<T1, T2> > { typedef basic_format<T1,T2> result; };
503 #endif
504
505
506
507 template<typename T1>
508 inline
509 static
510 const T1&
511 str_wrapper(const T1& x, const typename string_only<T1>::result* junk = 0)
512 {
513 arma_ignore(junk);
514
515 return x;
516 }
517
518
519
520 template<typename T1>
521 inline
522 static
523 const T1*
524 str_wrapper(const T1* x, const typename char_only<T1>::result* junk = 0)
525 {
526 arma_ignore(junk);
527
528 return x;
529 }
530
531
532
533 template<typename T1>
534 inline
535 static
536 std::string
537 str_wrapper(const T1& x, const typename basic_format_only<T1>::result* junk = 0)
538 {
539 arma_ignore(junk);
540
541 return str(x);
542 }
543
544 }
545
546 //! @}