1 #ifndef UTIL_FORMAT_GROUP_H
2 #define UTIL_FORMAT_GROUP_H
5 namespace format_interal
{
6 // empty group, but useful even though.
11 inline std::ostream
& operator << ( std::ostream
& os
, const group0
& ) {
19 group1(T1 a1
) : a1_(a1
) {}
23 inline std::ostream
& operator <<(std::ostream
& os
, const group1
<T1
> & x
) {
28 template <class T1
,class T2
>
33 group2(T1 a1
,T2 a2
) : a1_(a1
),a2_(a2
) {}
36 template <class T1
,class T2
>
37 inline std::ostream
& operator <<(std::ostream
& os
, const group2
<T1
,T2
>& x
) {
42 template <class T1
,class T2
,class T3
>
48 group3(T1 a1
,T2 a2
,T3 a3
) : a1_(a1
),a2_(a2
),a3_(a3
) {}
51 template <class T1
,class T2
,class T3
>
52 inline std::ostream
& operator << (std::ostream
& os
, const group3
<T1
,T2
,T3
>& x
) {
53 os
<< x
.a1_
<< x
.a2_
<< x
.a3_
;
57 template <class T1
,class T2
,class T3
,class T4
>
64 group4(T1 a1
,T2 a2
,T3 a3
,T4 a4
) : a1_(a1
),a2_(a2
),a3_(a3
),a4_(a4
) {}
67 template <class Ch
, class Tr
, class T1
,class T2
,class T3
,class T4
>
68 inline std::ostream
& operator <<(std::ostream
& os
, const group4
<T1
,T2
,T3
,T4
>& x
) {
69 os
<< x
.a1_
<< x
.a2_
<< x
.a3_
<< x
.a4_
;
73 template <class T1
,class T2
>
74 inline group1
<T1
> group_head( group2
<T1
,T2
> const& x
) {
75 return group1
<T1
> (x
.a1_
);
78 template <class T1
,class T2
>
79 inline group1
<T2
> group_last( group2
<T1
,T2
> const& x
) {
80 return group1
<T2
> (x
.a2_
);
83 template <class T1
,class T2
,class T3
>
84 inline group2
<T1
,T2
> group_head( group3
<T1
,T2
,T3
> const& x
) {
85 return group2
<T1
,T2
> (x
.a1_
,x
.a2_
);
88 template <class T1
,class T2
,class T3
>
89 inline group1
<T3
> group_last( group3
<T1
,T2
,T3
> const& x
) {
90 return group1
<T3
> (x
.a3_
);
93 template <class T1
,class T2
,class T3
,class T4
>
94 inline group3
<T1
,T2
,T3
> group_head( group4
<T1
,T2
,T3
,T4
> const& x
) {
95 return group3
<T1
,T2
,T3
> (x
.a1_
,x
.a2_
,x
.a3_
);
98 template <class T1
,class T2
,class T3
,class T4
>
99 inline group1
<T4
> group_last( group4
<T1
,T2
,T3
,T4
> const& x
) {
100 return group1
<T4
> (x
.a4_
);
104 inline format_interal::group1
< format_interal::group0
> group() {
105 return format_interal::group1
< format_interal::group0
> ( format_interal::group0() );
108 template <class T1
, class Var
>
109 inline format_interal::group1
< format_interal::group2
<T1
, Var
const&> >
110 group(T1 a1
, Var
const& var
) {
111 return format_interal::group1
< format_interal::group2
<T1
, Var
const&> >
112 ( format_interal::group2
<T1
, Var
const&>
117 template <class T1
,class T2
, class Var
>
118 inline format_interal::group1
< format_interal::group3
<T1
,T2
, Var
const&> >
119 group(T1 a1
,T2 a2
, Var
const& var
) {
120 return format_interal::group1
< format_interal::group3
<T1
,T2
, Var
const&> >
121 ( format_interal::group3
<T1
,T2
, Var
const&>
126 template <class T1
,class T2
,class T3
, class Var
>
127 inline format_interal::group1
< format_interal::group4
<T1
,T2
,T3
, Var
const&> >
128 group(T1 a1
,T2 a2
,T3 a3
, Var
const& var
) {
129 return format_interal::group1
< format_interal::group4
<T1
,T2
,T3
, Var
const&> >
130 ( format_interal::group4
<T1
,T2
,T3
, Var
const&>