33 #ifndef STRING_COMPOSE_H
34 #define STRING_COMPOSE_H
56 std::string str()
const;
59 std::ostringstream os;
66 typedef std::list<std::string> output_list;
71 typedef std::multimap<int, output_list::iterator> specification_map;
72 specification_map specs;
76 inline int char_to_int(
char c)
89 default:
return -1000;
93 inline bool is_number(
int n)
115 template <
typename T>
116 inline Composition &Composition::arg(
const T &obj)
120 std::string rep = os.str();
123 for (specification_map::const_iterator i = specs.lower_bound(arg_no),
124 end = specs.upper_bound(arg_no); i != end; ++i) {
125 output_list::iterator pos = i->second;
128 output.insert(pos, rep);
131 os.str(std::string());
139 inline Composition::Composition(std::string fmt)
142 std::string::size_type b = 0, i = 0;
146 while (i < fmt.length()) {
147 if (fmt[i] ==
'%' && i + 1 < fmt.length()) {
148 if (fmt[i + 1] ==
'%') {
149 fmt.replace(i, 2,
"%");
152 else if (is_number(fmt[i + 1])) {
154 output.push_back(fmt.substr(b, i - b));
160 spec_no += char_to_int(fmt[i + n]);
163 }
while (i + n < fmt.length() && is_number(fmt[i + n]));
166 output_list::iterator pos = output.end();
169 specs.insert(specification_map::value_type(spec_no, pos));
183 output.push_back(fmt.substr(b, i - b));
186 inline std::string Composition::str()
const
191 for (output_list::const_iterator i = output.begin(), end = output.end();
205 template <
typename T1>
206 inline std::string compose(
const std::string &fmt,
const T1 &o1)
213 template <
typename T1,
typename T2>
214 inline std::string compose(
const std::string &fmt,
215 const T1 &o1,
const T2 &o2)
222 template <
typename T1,
typename T2,
typename T3>
223 inline std::string compose(
const std::string &fmt,
224 const T1 &o1,
const T2 &o2,
const T3 &o3)
227 c.arg(o1).arg(o2).arg(o3);
231 template <
typename T1,
typename T2,
typename T3,
typename T4>
232 inline std::string compose(
const std::string &fmt,
233 const T1 &o1,
const T2 &o2,
const T3 &o3,
237 c.arg(o1).arg(o2).arg(o3).arg(o4);
241 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
242 inline std::string compose(
const std::string &fmt,
243 const T1 &o1,
const T2 &o2,
const T3 &o3,
244 const T4 &o4,
const T5 &o5)
247 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5);
251 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
253 inline std::string compose(
const std::string &fmt,
254 const T1 &o1,
const T2 &o2,
const T3 &o3,
255 const T4 &o4,
const T5 &o5,
const T6 &o6)
258 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6);
262 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
263 typename T6,
typename T7>
264 inline std::string compose(
const std::string &fmt,
265 const T1 &o1,
const T2 &o2,
const T3 &o3,
266 const T4 &o4,
const T5 &o5,
const T6 &o6,
270 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7);
274 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
275 typename T6,
typename T7,
typename T8>
276 inline std::string compose(
const std::string &fmt,
277 const T1 &o1,
const T2 &o2,
const T3 &o3,
278 const T4 &o4,
const T5 &o5,
const T6 &o6,
279 const T7 &o7,
const T8 &o8)
282 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8);
286 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
287 typename T6,
typename T7,
typename T8,
typename T9>
288 inline std::string compose(
const std::string &fmt,
289 const T1 &o1,
const T2 &o2,
const T3 &o3,
290 const T4 &o4,
const T5 &o5,
const T6 &o6,
291 const T7 &o7,
const T8 &o8,
const T9 &o9)
294 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9);
298 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
299 typename T6,
typename T7,
typename T8,
typename T9,
typename T10>
300 inline std::string compose(
const std::string &fmt,
301 const T1 &o1,
const T2 &o2,
const T3 &o3,
302 const T4 &o4,
const T5 &o5,
const T6 &o6,
303 const T7 &o7,
const T8 &o8,
const T9 &o9,
307 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
312 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
313 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
315 inline std::string compose(
const std::string &fmt,
316 const T1 &o1,
const T2 &o2,
const T3 &o3,
317 const T4 &o4,
const T5 &o5,
const T6 &o6,
318 const T7 &o7,
const T8 &o8,
const T9 &o9,
319 const T10 &o10,
const T11 &o11)
322 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
327 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
328 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
329 typename T11,
typename T12>
330 inline std::string compose(
const std::string &fmt,
331 const T1 &o1,
const T2 &o2,
const T3 &o3,
332 const T4 &o4,
const T5 &o5,
const T6 &o6,
333 const T7 &o7,
const T8 &o8,
const T9 &o9,
334 const T10 &o10,
const T11 &o11,
const T12 &o12)
337 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
338 .arg(o10).arg(o11).arg(o12);
342 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
343 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
344 typename T11,
typename T12,
typename T13>
345 inline std::string compose(
const std::string &fmt,
346 const T1 &o1,
const T2 &o2,
const T3 &o3,
347 const T4 &o4,
const T5 &o5,
const T6 &o6,
348 const T7 &o7,
const T8 &o8,
const T9 &o9,
349 const T10 &o10,
const T11 &o11,
const T12 &o12,
353 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
354 .arg(o10).arg(o11).arg(o12).arg(o13);
358 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
359 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
360 typename T11,
typename T12,
typename T13,
typename T14>
361 inline std::string compose(
const std::string &fmt,
362 const T1 &o1,
const T2 &o2,
const T3 &o3,
363 const T4 &o4,
const T5 &o5,
const T6 &o6,
364 const T7 &o7,
const T8 &o8,
const T9 &o9,
365 const T10 &o10,
const T11 &o11,
const T12 &o12,
366 const T13 &o13,
const T14 &o14)
369 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
370 .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14);
374 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
375 typename T6,
typename T7,
typename T8,
typename T9,
typename T10,
376 typename T11,
typename T12,
typename T13,
typename T14,
378 inline std::string compose(
const std::string &fmt,
379 const T1 &o1,
const T2 &o2,
const T3 &o3,
380 const T4 &o4,
const T5 &o5,
const T6 &o6,
381 const T7 &o7,
const T8 &o8,
const T9 &o9,
382 const T10 &o10,
const T11 &o11,
const T12 &o12,
383 const T13 &o13,
const T14 &o14,
const T15 &o15)
386 c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
387 .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14).arg(o15);
393 #endif // STRING_COMPOSE_H
Definition: compose.hpp:45
Definition: compose.hpp:41
Definition: compose.hpp:200