3 // Boost general library 'format' ---------------------------
4 // See http://www.boost.org for updates, documentation, and revision history.
6 // (C) Samuel Krempp 2001
7 // krempp@crans.ens-cachan.fr
8 // Permission to copy, use, modify, sell and
9 // distribute this software is granted provided this copyright notice appears
10 // in all copies. This software is provided "as is" without express or implied
11 // warranty, and with no claim as to its suitability for any purpose.
13 // ideas taken from RĂ¼diger Loos's format class
14 // and Karl Nelson's ofstream
16 // ----------------------------------------------------------------------------
18 // group.hpp : encapsulates a group of manipulators along with an argument
20 // group_head : cut the last element of a group out.
21 // (is overloaded below on each type of group)
23 // group_last : returns the last element of a group
24 // (is overloaded below on each type of group)
26 // ----------------------------------------------------------------------------
29 #ifndef BOOST_FORMAT_GROUP_HPP
30 #define BOOST_FORMAT_GROUP_HPP
32 #include <boost/config.hpp>
42 // empty group, but useful even though.
48 template <class Ch, class Tr>
50 BOOST_IO_STD basic_ostream<Ch, Tr>&
51 operator << ( BOOST_IO_STD basic_ostream<Ch, Tr>& os,
66 template <class Ch, class Tr, class T1>
68 BOOST_IO_STD basic_ostream<Ch, Tr>&
69 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
79 template <class T1,class T2>
89 template <class Ch, class Tr, class T1,class T2>
91 BOOST_IO_STD basic_ostream<Ch, Tr>&
92 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
93 const group2<T1,T2>& x)
99 template <class T1,class T2,class T3>
105 group3(T1 a1,T2 a2,T3 a3)
106 : a1_(a1),a2_(a2),a3_(a3)
110 template <class Ch, class Tr, class T1,class T2,class T3>
112 BOOST_IO_STD basic_ostream<Ch, Tr>&
113 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
114 const group3<T1,T2,T3>& x)
116 os << x.a1_<< x.a2_<< x.a3_;
120 template <class T1,class T2,class T3,class T4>
127 group4(T1 a1,T2 a2,T3 a3,T4 a4)
128 : a1_(a1),a2_(a2),a3_(a3),a4_(a4)
132 template <class Ch, class Tr, class T1,class T2,class T3,class T4>
134 BOOST_IO_STD basic_ostream<Ch, Tr>&
135 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
136 const group4<T1,T2,T3,T4>& x)
138 os << x.a1_<< x.a2_<< x.a3_<< x.a4_;
142 template <class T1,class T2,class T3,class T4,class T5>
150 group5(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5)
151 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5)
155 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5>
157 BOOST_IO_STD basic_ostream<Ch, Tr>&
158 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
159 const group5<T1,T2,T3,T4,T5>& x)
161 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_;
165 template <class T1,class T2,class T3,class T4,class T5,class T6>
174 group6(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6)
175 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6)
179 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6>
181 BOOST_IO_STD basic_ostream<Ch, Tr>&
182 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
183 const group6<T1,T2,T3,T4,T5,T6>& x)
185 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_;
189 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
199 group7(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7)
200 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7)
204 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7>
206 BOOST_IO_STD basic_ostream<Ch, Tr>&
207 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
208 const group7<T1,T2,T3,T4,T5,T6,T7>& x)
210 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_;
214 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
225 group8(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8)
226 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8)
230 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
232 BOOST_IO_STD basic_ostream<Ch, Tr>&
233 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
234 const group8<T1,T2,T3,T4,T5,T6,T7,T8>& x)
236 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_;
240 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
252 group9(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9)
253 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9)
257 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
259 BOOST_IO_STD basic_ostream<Ch, Tr>&
260 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
261 const group9<T1,T2,T3,T4,T5,T6,T7,T8,T9>& x)
263 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_;
267 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
280 group10(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9,T10 a10)
281 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9),a10_(a10)
285 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
287 BOOST_IO_STD basic_ostream<Ch, Tr>&
288 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
289 const group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>& x)
291 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_<< x.a10_;
298 template <class T1,class T2>
301 group_head( group2<T1,T2> const& x)
303 return group1<T1> (x.a1_);
306 template <class T1,class T2>
309 group_last( group2<T1,T2> const& x)
311 return group1<T2> (x.a2_);
316 template <class T1,class T2,class T3>
319 group_head( group3<T1,T2,T3> const& x)
321 return group2<T1,T2> (x.a1_,x.a2_);
324 template <class T1,class T2,class T3>
327 group_last( group3<T1,T2,T3> const& x)
329 return group1<T3> (x.a3_);
334 template <class T1,class T2,class T3,class T4>
337 group_head( group4<T1,T2,T3,T4> const& x)
339 return group3<T1,T2,T3> (x.a1_,x.a2_,x.a3_);
342 template <class T1,class T2,class T3,class T4>
345 group_last( group4<T1,T2,T3,T4> const& x)
347 return group1<T4> (x.a4_);
352 template <class T1,class T2,class T3,class T4,class T5>
355 group_head( group5<T1,T2,T3,T4,T5> const& x)
357 return group4<T1,T2,T3,T4> (x.a1_,x.a2_,x.a3_,x.a4_);
360 template <class T1,class T2,class T3,class T4,class T5>
363 group_last( group5<T1,T2,T3,T4,T5> const& x)
365 return group1<T5> (x.a5_);
370 template <class T1,class T2,class T3,class T4,class T5,class T6>
372 group5<T1,T2,T3,T4,T5>
373 group_head( group6<T1,T2,T3,T4,T5,T6> const& x)
375 return group5<T1,T2,T3,T4,T5> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_);
378 template <class T1,class T2,class T3,class T4,class T5,class T6>
381 group_last( group6<T1,T2,T3,T4,T5,T6> const& x)
383 return group1<T6> (x.a6_);
388 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
390 group6<T1,T2,T3,T4,T5,T6>
391 group_head( group7<T1,T2,T3,T4,T5,T6,T7> const& x)
393 return group6<T1,T2,T3,T4,T5,T6> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_);
396 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
399 group_last( group7<T1,T2,T3,T4,T5,T6,T7> const& x)
401 return group1<T7> (x.a7_);
406 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
408 group7<T1,T2,T3,T4,T5,T6,T7>
409 group_head( group8<T1,T2,T3,T4,T5,T6,T7,T8> const& x)
411 return group7<T1,T2,T3,T4,T5,T6,T7> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_);
414 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
417 group_last( group8<T1,T2,T3,T4,T5,T6,T7,T8> const& x)
419 return group1<T8> (x.a8_);
424 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
426 group8<T1,T2,T3,T4,T5,T6,T7,T8>
427 group_head( group9<T1,T2,T3,T4,T5,T6,T7,T8,T9> const& x)
429 return group8<T1,T2,T3,T4,T5,T6,T7,T8> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_,x.a8_);
432 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
435 group_last( group9<T1,T2,T3,T4,T5,T6,T7,T8,T9> const& x)
437 return group1<T9> (x.a9_);
442 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
444 group9<T1,T2,T3,T4,T5,T6,T7,T8,T9>
445 group_head( group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> const& x)
447 return group9<T1,T2,T3,T4,T5,T6,T7,T8,T9> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_,x.a8_,x.a9_);
450 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
453 group_last( group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> const& x)
455 return group1<T10> (x.a10_);
462 } // namespace detail
469 inline detail::group1< detail::group0 >
470 group() { return detail::group1< detail::group0 > ( detail::group0() ); }
472 template <class T1, class Var>
474 detail::group1< detail::group2<T1, Var const&> >
475 group(T1 a1, Var const& var)
477 return detail::group1< detail::group2<T1, Var const&> >
478 ( detail::group2<T1, Var const&>
483 template <class T1,class T2, class Var>
485 detail::group1< detail::group3<T1,T2, Var const&> >
486 group(T1 a1,T2 a2, Var const& var)
488 return detail::group1< detail::group3<T1,T2, Var const&> >
489 ( detail::group3<T1,T2, Var const&>
494 template <class T1,class T2,class T3, class Var>
496 detail::group1< detail::group4<T1,T2,T3, Var const&> >
497 group(T1 a1,T2 a2,T3 a3, Var const& var)
499 return detail::group1< detail::group4<T1,T2,T3, Var const&> >
500 ( detail::group4<T1,T2,T3, Var const&>
505 template <class T1,class T2,class T3,class T4, class Var>
507 detail::group1< detail::group5<T1,T2,T3,T4, Var const&> >
508 group(T1 a1,T2 a2,T3 a3,T4 a4, Var const& var)
510 return detail::group1< detail::group5<T1,T2,T3,T4, Var const&> >
511 ( detail::group5<T1,T2,T3,T4, Var const&>
516 template <class T1,class T2,class T3,class T4,class T5, class Var>
518 detail::group1< detail::group6<T1,T2,T3,T4,T5, Var const&> >
519 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var const& var)
521 return detail::group1< detail::group6<T1,T2,T3,T4,T5, Var const&> >
522 ( detail::group6<T1,T2,T3,T4,T5, Var const&>
523 (a1,a2,a3,a4,a5, var)
527 template <class T1,class T2,class T3,class T4,class T5,class T6, class Var>
529 detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var const&> >
530 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var const& var)
532 return detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var const&> >
533 ( detail::group7<T1,T2,T3,T4,T5,T6, Var const&>
534 (a1,a2,a3,a4,a5,a6, var)
538 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7, class Var>
540 detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&> >
541 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var const& var)
543 return detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&> >
544 ( detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&>
545 (a1,a2,a3,a4,a5,a6,a7, var)
549 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8, class Var>
551 detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&> >
552 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var const& var)
554 return detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&> >
555 ( detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&>
556 (a1,a2,a3,a4,a5,a6,a7,a8, var)
560 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9, class Var>
562 detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&> >
563 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var const& var)
565 return detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&> >
566 ( detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&>
567 (a1,a2,a3,a4,a5,a6,a7,a8,a9, var)
572 #ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST
574 template <class T1, class Var>
576 detail::group1< detail::group2<T1, Var&> >
577 group(T1 a1, Var& var)
579 return detail::group1< detail::group2<T1, Var&> >
580 ( detail::group2<T1, Var&>
585 template <class T1,class T2, class Var>
587 detail::group1< detail::group3<T1,T2, Var&> >
588 group(T1 a1,T2 a2, Var& var)
590 return detail::group1< detail::group3<T1,T2, Var&> >
591 ( detail::group3<T1,T2, Var&>
596 template <class T1,class T2,class T3, class Var>
598 detail::group1< detail::group4<T1,T2,T3, Var&> >
599 group(T1 a1,T2 a2,T3 a3, Var& var)
601 return detail::group1< detail::group4<T1,T2,T3, Var&> >
602 ( detail::group4<T1,T2,T3, Var&>
607 template <class T1,class T2,class T3,class T4, class Var>
609 detail::group1< detail::group5<T1,T2,T3,T4, Var&> >
610 group(T1 a1,T2 a2,T3 a3,T4 a4, Var& var)
612 return detail::group1< detail::group5<T1,T2,T3,T4, Var&> >
613 ( detail::group5<T1,T2,T3,T4, Var&>
618 template <class T1,class T2,class T3,class T4,class T5, class Var>
620 detail::group1< detail::group6<T1,T2,T3,T4,T5, Var&> >
621 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var& var)
623 return detail::group1< detail::group6<T1,T2,T3,T4,T5, Var&> >
624 ( detail::group6<T1,T2,T3,T4,T5, Var&>
625 (a1,a2,a3,a4,a5, var)
629 template <class T1,class T2,class T3,class T4,class T5,class T6, class Var>
631 detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var&> >
632 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var& var)
634 return detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var&> >
635 ( detail::group7<T1,T2,T3,T4,T5,T6, Var&>
636 (a1,a2,a3,a4,a5,a6, var)
640 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7, class Var>
642 detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&> >
643 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var& var)
645 return detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&> >
646 ( detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&>
647 (a1,a2,a3,a4,a5,a6,a7, var)
651 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8, class Var>
653 detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&> >
654 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var& var)
656 return detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&> >
657 ( detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&>
658 (a1,a2,a3,a4,a5,a6,a7,a8, var)
662 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9, class Var>
664 detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&> >
665 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var& var)
667 return detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&> >
668 ( detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&>
669 (a1,a2,a3,a4,a5,a6,a7,a8,a9, var)
674 #endif //end- #ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST
682 #endif // BOOST_FORMAT_GROUP_HPP