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,
59 group1& operator=(const group1&);
62 template <class Ch, class Tr, class T1>
64 BOOST_IO_STD basic_ostream<Ch, Tr>&
65 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
75 template <class T1,class T2>
84 group2& operator=(const group2&);
87 template <class Ch, class Tr, class T1,class T2>
89 BOOST_IO_STD basic_ostream<Ch, Tr>&
90 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
91 const group2<T1,T2>& x)
97 template <class T1,class T2,class T3>
103 group3(T1 a1,T2 a2,T3 a3)
104 : a1_(a1),a2_(a2),a3_(a3)
107 group3& operator=(const group3&);
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)
131 group4& operator=(const group4&);
134 template <class Ch, class Tr, class T1,class T2,class T3,class T4>
136 BOOST_IO_STD basic_ostream<Ch, Tr>&
137 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
138 const group4<T1,T2,T3,T4>& x)
140 os << x.a1_<< x.a2_<< x.a3_<< x.a4_;
144 template <class T1,class T2,class T3,class T4,class T5>
152 group5(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5)
153 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5)
157 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5>
159 BOOST_IO_STD basic_ostream<Ch, Tr>&
160 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
161 const group5<T1,T2,T3,T4,T5>& x)
163 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_;
167 template <class T1,class T2,class T3,class T4,class T5,class T6>
176 group6(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6)
177 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6)
181 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6>
183 BOOST_IO_STD basic_ostream<Ch, Tr>&
184 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
185 const group6<T1,T2,T3,T4,T5,T6>& x)
187 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_;
191 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
201 group7(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7)
202 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7)
206 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7>
208 BOOST_IO_STD basic_ostream<Ch, Tr>&
209 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
210 const group7<T1,T2,T3,T4,T5,T6,T7>& x)
212 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_;
216 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
227 group8(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8)
228 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8)
232 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
234 BOOST_IO_STD basic_ostream<Ch, Tr>&
235 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
236 const group8<T1,T2,T3,T4,T5,T6,T7,T8>& x)
238 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_;
242 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
254 group9(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9)
255 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9)
259 template <class Ch, class Tr, class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
261 BOOST_IO_STD basic_ostream<Ch, Tr>&
262 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
263 const group9<T1,T2,T3,T4,T5,T6,T7,T8,T9>& x)
265 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_;
269 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
282 group10(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9,T10 a10)
283 : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9),a10_(a10)
287 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>
289 BOOST_IO_STD basic_ostream<Ch, Tr>&
290 operator << (BOOST_IO_STD basic_ostream<Ch, Tr>& os,
291 const group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>& x)
293 os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_<< x.a10_;
300 template <class T1,class T2>
303 group_head( group2<T1,T2> const& x)
305 return group1<T1> (x.a1_);
308 template <class T1,class T2>
311 group_last( group2<T1,T2> const& x)
313 return group1<T2> (x.a2_);
318 template <class T1,class T2,class T3>
321 group_head( group3<T1,T2,T3> const& x)
323 return group2<T1,T2> (x.a1_,x.a2_);
326 template <class T1,class T2,class T3>
329 group_last( group3<T1,T2,T3> const& x)
331 return group1<T3> (x.a3_);
336 template <class T1,class T2,class T3,class T4>
339 group_head( group4<T1,T2,T3,T4> const& x)
341 return group3<T1,T2,T3> (x.a1_,x.a2_,x.a3_);
344 template <class T1,class T2,class T3,class T4>
347 group_last( group4<T1,T2,T3,T4> const& x)
349 return group1<T4> (x.a4_);
354 template <class T1,class T2,class T3,class T4,class T5>
357 group_head( group5<T1,T2,T3,T4,T5> const& x)
359 return group4<T1,T2,T3,T4> (x.a1_,x.a2_,x.a3_,x.a4_);
362 template <class T1,class T2,class T3,class T4,class T5>
365 group_last( group5<T1,T2,T3,T4,T5> const& x)
367 return group1<T5> (x.a5_);
372 template <class T1,class T2,class T3,class T4,class T5,class T6>
374 group5<T1,T2,T3,T4,T5>
375 group_head( group6<T1,T2,T3,T4,T5,T6> const& x)
377 return group5<T1,T2,T3,T4,T5> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_);
380 template <class T1,class T2,class T3,class T4,class T5,class T6>
383 group_last( group6<T1,T2,T3,T4,T5,T6> const& x)
385 return group1<T6> (x.a6_);
390 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
392 group6<T1,T2,T3,T4,T5,T6>
393 group_head( group7<T1,T2,T3,T4,T5,T6,T7> const& x)
395 return group6<T1,T2,T3,T4,T5,T6> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_);
398 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
401 group_last( group7<T1,T2,T3,T4,T5,T6,T7> const& x)
403 return group1<T7> (x.a7_);
408 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
410 group7<T1,T2,T3,T4,T5,T6,T7>
411 group_head( group8<T1,T2,T3,T4,T5,T6,T7,T8> const& x)
413 return group7<T1,T2,T3,T4,T5,T6,T7> (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_);
416 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
419 group_last( group8<T1,T2,T3,T4,T5,T6,T7,T8> const& x)
421 return group1<T8> (x.a8_);
426 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
428 group8<T1,T2,T3,T4,T5,T6,T7,T8>
429 group_head( group9<T1,T2,T3,T4,T5,T6,T7,T8,T9> const& x)
431 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_);
434 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
437 group_last( group9<T1,T2,T3,T4,T5,T6,T7,T8,T9> const& x)
439 return group1<T9> (x.a9_);
444 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
446 group9<T1,T2,T3,T4,T5,T6,T7,T8,T9>
447 group_head( group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> const& x)
449 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_);
452 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
455 group_last( group10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> const& x)
457 return group1<T10> (x.a10_);
464 } // namespace detail
471 inline detail::group1< detail::group0 >
472 group() { return detail::group1< detail::group0 > ( detail::group0() ); }
474 template <class T1, class Var>
476 detail::group1< detail::group2<T1, Var const&> >
477 group(T1 a1, Var const& var)
479 return detail::group1< detail::group2<T1, Var const&> >
480 ( detail::group2<T1, Var const&>
485 template <class T1,class T2, class Var>
487 detail::group1< detail::group3<T1,T2, Var const&> >
488 group(T1 a1,T2 a2, Var const& var)
490 return detail::group1< detail::group3<T1,T2, Var const&> >
491 ( detail::group3<T1,T2, Var const&>
496 template <class T1,class T2,class T3, class Var>
498 detail::group1< detail::group4<T1,T2,T3, Var const&> >
499 group(T1 a1,T2 a2,T3 a3, Var const& var)
501 return detail::group1< detail::group4<T1,T2,T3, Var const&> >
502 ( detail::group4<T1,T2,T3, Var const&>
507 template <class T1,class T2,class T3,class T4, class Var>
509 detail::group1< detail::group5<T1,T2,T3,T4, Var const&> >
510 group(T1 a1,T2 a2,T3 a3,T4 a4, Var const& var)
512 return detail::group1< detail::group5<T1,T2,T3,T4, Var const&> >
513 ( detail::group5<T1,T2,T3,T4, Var const&>
518 template <class T1,class T2,class T3,class T4,class T5, class Var>
520 detail::group1< detail::group6<T1,T2,T3,T4,T5, Var const&> >
521 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var const& var)
523 return detail::group1< detail::group6<T1,T2,T3,T4,T5, Var const&> >
524 ( detail::group6<T1,T2,T3,T4,T5, Var const&>
525 (a1,a2,a3,a4,a5, var)
529 template <class T1,class T2,class T3,class T4,class T5,class T6, class Var>
531 detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var const&> >
532 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var const& var)
534 return detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var const&> >
535 ( detail::group7<T1,T2,T3,T4,T5,T6, Var const&>
536 (a1,a2,a3,a4,a5,a6, var)
540 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7, class Var>
542 detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&> >
543 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var const& var)
545 return detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&> >
546 ( detail::group8<T1,T2,T3,T4,T5,T6,T7, Var const&>
547 (a1,a2,a3,a4,a5,a6,a7, var)
551 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8, class Var>
553 detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&> >
554 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var const& var)
556 return detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&> >
557 ( detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var const&>
558 (a1,a2,a3,a4,a5,a6,a7,a8, var)
562 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9, class Var>
564 detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&> >
565 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var const& var)
567 return detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&> >
568 ( detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var const&>
569 (a1,a2,a3,a4,a5,a6,a7,a8,a9, var)
574 #ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST
576 template <class T1, class Var>
578 detail::group1< detail::group2<T1, Var&> >
579 group(T1 a1, Var& var)
581 return detail::group1< detail::group2<T1, Var&> >
582 ( detail::group2<T1, Var&>
587 template <class T1,class T2, class Var>
589 detail::group1< detail::group3<T1,T2, Var&> >
590 group(T1 a1,T2 a2, Var& var)
592 return detail::group1< detail::group3<T1,T2, Var&> >
593 ( detail::group3<T1,T2, Var&>
598 template <class T1,class T2,class T3, class Var>
600 detail::group1< detail::group4<T1,T2,T3, Var&> >
601 group(T1 a1,T2 a2,T3 a3, Var& var)
603 return detail::group1< detail::group4<T1,T2,T3, Var&> >
604 ( detail::group4<T1,T2,T3, Var&>
609 template <class T1,class T2,class T3,class T4, class Var>
611 detail::group1< detail::group5<T1,T2,T3,T4, Var&> >
612 group(T1 a1,T2 a2,T3 a3,T4 a4, Var& var)
614 return detail::group1< detail::group5<T1,T2,T3,T4, Var&> >
615 ( detail::group5<T1,T2,T3,T4, Var&>
620 template <class T1,class T2,class T3,class T4,class T5, class Var>
622 detail::group1< detail::group6<T1,T2,T3,T4,T5, Var&> >
623 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var& var)
625 return detail::group1< detail::group6<T1,T2,T3,T4,T5, Var&> >
626 ( detail::group6<T1,T2,T3,T4,T5, Var&>
627 (a1,a2,a3,a4,a5, var)
631 template <class T1,class T2,class T3,class T4,class T5,class T6, class Var>
633 detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var&> >
634 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var& var)
636 return detail::group1< detail::group7<T1,T2,T3,T4,T5,T6, Var&> >
637 ( detail::group7<T1,T2,T3,T4,T5,T6, Var&>
638 (a1,a2,a3,a4,a5,a6, var)
642 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7, class Var>
644 detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&> >
645 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var& var)
647 return detail::group1< detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&> >
648 ( detail::group8<T1,T2,T3,T4,T5,T6,T7, Var&>
649 (a1,a2,a3,a4,a5,a6,a7, var)
653 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8, class Var>
655 detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&> >
656 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var& var)
658 return detail::group1< detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&> >
659 ( detail::group9<T1,T2,T3,T4,T5,T6,T7,T8, Var&>
660 (a1,a2,a3,a4,a5,a6,a7,a8, var)
664 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9, class Var>
666 detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&> >
667 group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var& var)
669 return detail::group1< detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&> >
670 ( detail::group10<T1,T2,T3,T4,T5,T6,T7,T8,T9, Var&>
671 (a1,a2,a3,a4,a5,a6,a7,a8,a9, var)
676 #endif // - BOOST_NO_OVERLOAD_FOR_NON_CONST
684 #endif // BOOST_FORMAT_GROUP_HPP