34 #ifndef STRING_COMPOSE_H
35 #define STRING_COMPOSE_H
37 #include "locale_convert.h"
38 #include <boost/filesystem.hpp>
45 namespace StringPrivate
60 std::string str()
const;
70 typedef std::list<std::string> output_list;
75 typedef std::multimap<int, output_list::iterator> specification_map;
76 specification_map specs;
80 inline int char_to_int(
char c)
93 default:
return -1000;
97 inline bool is_number(
int n)
118 template <
typename T>
119 inline Composition &Composition::arg(
const T &obj)
121 os += sub::locale_convert<std::string>(obj);
124 for (specification_map::const_iterator i = specs.lower_bound(arg_no), end = specs.upper_bound(arg_no); i != end; ++i) {
125 output_list::iterator pos = i->second;
128 output.insert(pos, os);
138 inline Composition::Composition(std::string fmt)
141 std::string::size_type b = 0, i = 0;
145 while (i < fmt.length()) {
146 if (fmt[i] ==
'%' && i + 1 < fmt.length()) {
147 if (fmt[i + 1] ==
'%') {
148 fmt.replace(i, 2,
"%");
151 else if (is_number(fmt[i + 1])) {
153 output.push_back(fmt.substr(b, i - b));
159 spec_no += char_to_int(fmt[i + n]);
162 }
while (i + n < fmt.length() && is_number(fmt[i + n]));
165 output_list::iterator pos = output.end();
168 specs.insert(specification_map::value_type(spec_no, pos));
182 output.push_back(fmt.substr(b, i - b));
185 inline std::string Composition::str()
const
190 for (output_list::const_iterator i = output.begin(), end = output.end();
204 template <
typename T1>
205 inline std::string compose(
const std::string &fmt,
const T1 &o1)
212 template <
typename T1,
typename T2>
213 inline std::string compose(
const std::string &fmt,
214 const T1 &o1,
const T2 &o2)
221 template <
typename T1,
typename T2,
typename T3>
222 inline std::string compose(
const std::string &fmt,
223 const T1 &o1,
const T2 &o2,
const T3 &o3)
226 c.arg(o1).arg(o2).arg(o3);
230 template <
typename T1,
typename T2,
typename T3,
typename T4>
231 inline std::string compose(
const std::string &fmt,
232 const T1 &o1,
const T2 &o2,
const T3 &o3,
236 c.arg(o1).arg(o2).arg(o3).arg(o4);
240 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
241 inline std::string compose(
const std::string &fmt,
242 const T1 &o1,
const T2 &o2,
const T3 &o3,
243 const T4 &o4,
const T5 &o5)
246 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5);
250 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
252 inline std::string compose(
const std::string &fmt,
253 const T1 &o1,
const T2 &o2,
const T3 &o3,
254 const T4 &o4,
const T5 &o5,
const T6 &o6)
257 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6);
261 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
262 typename T6,
typename T7>
263 inline std::string compose(
const std::string &fmt,
264 const T1 &o1,
const T2 &o2,
const T3 &o3,
265 const T4 &o4,
const T5 &o5,
const T6 &o6,
269 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7);
273 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
274 typename T6,
typename T7,
typename T8>
275 inline std::string compose(
const std::string &fmt,
276 const T1 &o1,
const T2 &o2,
const T3 &o3,
277 const T4 &o4,
const T5 &o5,
const T6 &o6,
278 const T7 &o7,
const T8 &o8)
281 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8);
285 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
286 typename T6,
typename T7,
typename T8,
typename T9>
287 inline std::string compose(
const std::string &fmt,
288 const T1 &o1,
const T2 &o2,
const T3 &o3,
289 const T4 &o4,
const T5 &o5,
const T6 &o6,
290 const T7 &o7,
const T8 &o8,
const T9 &o9)
293 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9);
297 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
298 typename T6,
typename T7,
typename T8,
typename T9,
typename T10>
299 inline std::string compose(
const std::string &fmt,
300 const T1 &o1,
const T2 &o2,
const T3 &o3,
301 const T4 &o4,
const T5 &o5,
const T6 &o6,
302 const T7 &o7,
const T8 &o8,
const T9 &o9,
306 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
311 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
312 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
314 inline std::string compose(
const std::string &fmt,
315 const T1 &o1,
const T2 &o2,
const T3 &o3,
316 const T4 &o4,
const T5 &o5,
const T6 &o6,
317 const T7 &o7,
const T8 &o8,
const T9 &o9,
318 const T10 &o10,
const T11 &o11)
321 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
326 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
327 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
328 typename T11,
typename T12>
329 inline std::string compose(
const std::string &fmt,
330 const T1 &o1,
const T2 &o2,
const T3 &o3,
331 const T4 &o4,
const T5 &o5,
const T6 &o6,
332 const T7 &o7,
const T8 &o8,
const T9 &o9,
333 const T10 &o10,
const T11 &o11,
const T12 &o12)
336 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
337 .arg(o10).arg(o11).arg(o12);
341 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
342 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
343 typename T11,
typename T12,
typename T13>
344 inline std::string compose(
const std::string &fmt,
345 const T1 &o1,
const T2 &o2,
const T3 &o3,
346 const T4 &o4,
const T5 &o5,
const T6 &o6,
347 const T7 &o7,
const T8 &o8,
const T9 &o9,
348 const T10 &o10,
const T11 &o11,
const T12 &o12,
352 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
353 .arg(o10).arg(o11).arg(o12).arg(o13);
357 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
358 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
359 typename T11,
typename T12,
typename T13,
typename T14>
360 inline std::string compose(
const std::string &fmt,
361 const T1 &o1,
const T2 &o2,
const T3 &o3,
362 const T4 &o4,
const T5 &o5,
const T6 &o6,
363 const T7 &o7,
const T8 &o8,
const T9 &o9,
364 const T10 &o10,
const T11 &o11,
const T12 &o12,
365 const T13 &o13,
const T14 &o14)
368 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
369 .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14);
373 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
374 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
375 typename T11,
typename T12,
typename T13,
typename T14,
377 inline std::string compose(
const std::string &fmt,
378 const T1 &o1,
const T2 &o2,
const T3 &o3,
379 const T4 &o4,
const T5 &o5,
const T6 &o6,
380 const T7 &o7,
const T8 &o8,
const T9 &o9,
381 const T10 &o10,
const T11 &o11,
const T12 &o12,
382 const T13 &o13,
const T14 &o14,
const T15 &o15)
385 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
386 .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14).arg(o15);
Definition: compose.hpp:50