Update contrib.
2 // ----------------------------------------------------------------------------
3 // group.hpp : encapsulates a group of manipulators along with an argument
4 // ----------------------------------------------------------------------------
6 // Copyright Samuel Krempp 2003. Use, modification, and distribution are
7 // subject to the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 // See http://www.boost.org/libs/format for library home page
12 // ----------------------------------------------------------------------------
15 // group_head : cut the last element of a group out.
16 // (is overloaded below on each type of group)
18 // group_last : returns the last element of a group
19 // (is overloaded below on each type of group)
20 // ----------------------------------------------------------------------------
23 #ifndef BOOST_FORMAT_GROUP_HPP
24 #define BOOST_FORMAT_GROUP_HPP
26 #include <boost/config.hpp>
36 // empty group, but useful even though.
42 template <class Ch, class Tr>
44 BOOST_IO_STD basic_ostream<Ch, Tr>&
45 operator << ( BOOST_IO_STD basic_ostream<Ch, Tr>& os,
60 template <class Ch, class Tr, class T1>
62 BOOST_IO_STD basic_ostream<Ch, Tr>&
63 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
73 template <class T1,class T2>
83 template <class Ch, class Tr, class T1,class T2>
85 BOOST_IO_STD basic_ostream<Ch, Tr>&
86 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
87 const group2<T1,T2>& x)
93 template <class T1,class T2,class T3>
99 group3(T1 a1,T2 a2,T3 a3)
100 : a1_(a1),a2_(a2),a3_(a3)
104 template <class Ch, class Tr, class T1,class T2,class T3>
106 BOOST_IO_STD basic_ostream<Ch, Tr>&
107 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
108 const group3<T1,T2,T3>& x)
110 os << x.a1_<< x.a2_<< x.a3_;
114 template <class T1,class T2,class T3,class T4>
121 group4(T1 a1,T2 a2,T3 a3,T4 a4)
122 : a1_(a1),a2_(a2),a3_(a3),a4_(a4)
126 template <class Ch, class Tr, class T1,class T2,class T3,class T4>
128 BOOST_IO_STD basic_ostream<Ch, Tr>&
129 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
130 const group4<T1,T2,T3,T4>& x)
132 os << x.a1_<< x.a2_<< x.a3_<< x.a4_;
136 template <class T1,class T2,class T3,class T4,class T5>
144 group5(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5)
145 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5)
149 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5>
151 BOOST_IO_STD basic_ostream<Ch, Tr>&
152 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
153 const group5<T1,T2,T3,T4,T5>& x)
155 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_;
159 template <class T1,class T2,class T3,class T4,class T5,class T6>
168 group6(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6)
169 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6)
173 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6>
175 BOOST_IO_STD basic_ostream<Ch, Tr>&
176 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
177 const group6<T1,T2,T3,T4,T5,T6>& x)
179 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_;
183 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
193 group7(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7)
194 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7)
198 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7>
200 BOOST_IO_STD basic_ostream<Ch, Tr>&
201 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
202 const group7<T1,T2,T3,T4,T5,T6,T7>& x)
204 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_;
208 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
219 group8(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8)
220 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8)
224 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
226 BOOST_IO_STD basic_ostream<Ch, Tr>&
227 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
228 const group8<T1,T2,T3,T4,T5,T6,T7,T8>& x)
230 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_;
234 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
246 group9(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9)
247 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9)
251 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
253 BOOST_IO_STD basic_ostream<Ch, Tr>&
254 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
255 const group9<T1,T2,T3,T4,T5,T6,T7,T8,T9>& x)
257 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_;
261 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
274 group10(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9,T10 a10)
275 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9),a10_(a10)
279 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>
281 BOOST_IO_STD basic_ostream<Ch, Tr>&
282 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
283 const group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>& x)
285 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_<< x.a10_;
292 template <class T1,class T2>
295 group_head( group2<T1,T2> const& x)
297 return group1<T1> (x.a1_);
300 template <class T1,class T2>
303 group_last( group2<T1,T2> const& x)
305 return group1<T2> (x.a2_);
310 template <class T1,class T2,class T3>
313 group_head( group3<T1,T2,T3> const& x)
315 return group2<T1,T2> (x.a1_,x.a2_);
318 template <class T1,class T2,class T3>
321 group_last( group3<T1,T2,T3> const& x)
323 return group1<T3> (x.a3_);
328 template <class T1,class T2,class T3,class T4>
331 group_head( group4<T1,T2,T3,T4> const& x)
333 return group3<T1,T2,T3> (x.a1_,x.a2_,x.a3_);
336 template <class T1,class T2,class T3,class T4>
339 group_last( group4<T1,T2,T3,T4> const& x)
341 return group1<T4> (x.a4_);
346 template <class T1,class T2,class T3,class T4,class T5>
349 group_head( group5<T1,T2,T3,T4,T5> const& x)
351 return group4<T1,T2,T3,T4> (x.a1_,x.a2_,x.a3_,x.a4_);
354 template <class T1,class T2,class T3,class T4,class T5>
357 group_last( group5<T1,T2,T3,T4,T5> const& x)
359 return group1<T5> (x.a5_);
364 template <class T1,class T2,class T3,class T4,class T5,class T6>
366 group5<T1,T2,T3,T4,T5>
367 group_head( group6<T1,T2,T3,T4,T5,T6> const& x)
369 return group5<T1,T2,T3,T4,T5> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_);
372 template <class T1,class T2,class T3,class T4,class T5,class T6>
375 group_last( group6<T1,T2,T3,T4,T5,T6> const& x)
377 return group1<T6> (x.a6_);
382 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
384 group6<T1,T2,T3,T4,T5,T6>
385 group_head( group7<T1,T2,T3,T4,T5,T6,T7> const& x)
387 return group6<T1,T2,T3,T4,T5,T6> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_);
390 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
393 group_last( group7<T1,T2,T3,T4,T5,T6,T7> const& x)
395 return group1<T7> (x.a7_);
400 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
402 group7<T1,T2,T3,T4,T5,T6,T7>
403 group_head( group8<T1,T2,T3,T4,T5,T6,T7,T8> const& x)
405 return group7<T1,T2,T3,T4,T5,T6,T7> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_);
408 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
411 group_last( group8<T1,T2,T3,T4,T5,T6,T7,T8> const& x)
413 return group1<T8> (x.a8_);
418 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
420 group8<T1,T2,T3,T4,T5,T6,T7,T8>
421 group_head( group9<T1,T2,T3,T4,T5,T6,T7,T8,T9> const& x)
423 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_);
426 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
429 group_last( group9<T1,T2,T3,T4,T5,T6,T7,T8,T9> const& x)
431 return group1<T9> (x.a9_);
436 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
438 group9<T1,T2,T3,T4,T5,T6,T7,T8,T9>
439 group_head( group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> const& x)
441 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_);
444 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
447 group_last( group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> const& x)
449 return group1<T10> (x.a10_);
456 } // namespace detail
463 inline detail::group1< detail::group0 >
464 group() { return detail::group1< detail::group0 > ( detail::group0() ); }
466 template <class T1, class Var>
468 detail::group1< detail::group2<T1, Var const&> >
469 group(T1 a1, Var const& var)
471 return detail::group1< detail::group2<T1, Var const&> >
472 ( detail::group2<T1, Var const&>
477 template <class T1,class T2, class Var>
479 detail::group1< detail::group3<T1,T2, Var const&> >
480 group(T1 a1,T2 a2, Var const& var)
482 return detail::group1< detail::group3<T1,T2, Var const&> >
483 ( detail::group3<T1,T2, Var const&>
488 template <class T1,class T2,class T3, class Var>
490 detail::group1< detail::group4<T1,T2,T3, Var const&> >
491 group(T1 a1,T2 a2,T3 a3, Var const& var)
493 return detail::group1< detail::group4<T1,T2,T3, Var const&> >
494 ( detail::group4<T1,T2,T3, Var const&>
499 template <class T1,class T2,class T3,class T4, class Var>
501 detail::group1< detail::group5<T1,T2,T3,T4, Var const&> >
502 group(T1 a1,T2 a2,T3 a3,T4 a4, Var const& var)
504 return detail::group1< detail::group5<T1,T2,T3,T4, Var const&> >
505 ( detail::group5<T1,T2,T3,T4, Var const&>
510 template <class T1,class T2,class T3,class T4,class T5, class Var>
512 detail::group1< detail::group6<T1,T2,T3,T4,T5, Var const&> >
513 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var const& var)
515 return detail::group1< detail::group6<T1,T2,T3,T4,T5, Var const&> >
516 ( detail::group6<T1,T2,T3,T4,T5, Var const&>
517 (a1,a2,a3,a4,a5, var)
521 template <class T1,class T2,class T3,class T4,class T5,class T6, class Var>
523 detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var const&> >
524 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var const& var)
526 return detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var const&> >
527 ( detail::group7<T1,T2,T3,T4,T5,T6, Var const&>
528 (a1,a2,a3,a4,a5,a6, var)
532 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7, class Var>
534 detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&> >
535 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var const& var)
537 return detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&> >
538 ( detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&>
539 (a1,a2,a3,a4,a5,a6,a7, var)
543 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8, class Var>
545 detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&> >
546 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var const& var)
548 return detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&> >
549 ( detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&>
550 (a1,a2,a3,a4,a5,a6,a7,a8, var)
554 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9, class Var>
556 detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&> >
557 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var const& var)
559 return detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&> >
560 ( detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&>
561 (a1,a2,a3,a4,a5,a6,a7,a8,a9, var)
566 #ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST
568 template <class T1, class Var>
570 detail::group1< detail::group2<T1, Var&> >
571 group(T1 a1, Var& var)
573 return detail::group1< detail::group2<T1, Var&> >
574 ( detail::group2<T1, Var&>
579 template <class T1,class T2, class Var>
581 detail::group1< detail::group3<T1,T2, Var&> >
582 group(T1 a1,T2 a2, Var& var)
584 return detail::group1< detail::group3<T1,T2, Var&> >
585 ( detail::group3<T1,T2, Var&>
590 template <class T1,class T2,class T3, class Var>
592 detail::group1< detail::group4<T1,T2,T3, Var&> >
593 group(T1 a1,T2 a2,T3 a3, Var& var)
595 return detail::group1< detail::group4<T1,T2,T3, Var&> >
596 ( detail::group4<T1,T2,T3, Var&>
601 template <class T1,class T2,class T3,class T4, class Var>
603 detail::group1< detail::group5<T1,T2,T3,T4, Var&> >
604 group(T1 a1,T2 a2,T3 a3,T4 a4, Var& var)
606 return detail::group1< detail::group5<T1,T2,T3,T4, Var&> >
607 ( detail::group5<T1,T2,T3,T4, Var&>
612 template <class T1,class T2,class T3,class T4,class T5, class Var>
614 detail::group1< detail::group6<T1,T2,T3,T4,T5, Var&> >
615 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var& var)
617 return detail::group1< detail::group6<T1,T2,T3,T4,T5, Var&> >
618 ( detail::group6<T1,T2,T3,T4,T5, Var&>
619 (a1,a2,a3,a4,a5, var)
623 template <class T1,class T2,class T3,class T4,class T5,class T6, class Var>
625 detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var&> >
626 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var& var)
628 return detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var&> >
629 ( detail::group7<T1,T2,T3,T4,T5,T6, Var&>
630 (a1,a2,a3,a4,a5,a6, var)
634 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7, class Var>
636 detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&> >
637 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var& var)
639 return detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&> >
640 ( detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&>
641 (a1,a2,a3,a4,a5,a6,a7, var)
645 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8, class Var>
647 detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&> >
648 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var& var)
650 return detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&> >
651 ( detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&>
652 (a1,a2,a3,a4,a5,a6,a7,a8, var)
656 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9, class Var>
658 detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&> >
659 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var& var)
661 return detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&> >
662 ( detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&>
663 (a1,a2,a3,a4,a5,a6,a7,a8,a9, var)
668 #endif // - BOOST_NO_OVERLOAD_FOR_NON_CONST
676 #endif // BOOST_FORMAT_GROUP_HPP