1 /*
2 * Inkscape::Util::Tuple - generic tuple type
3 *
4 * Authors:
5 * MenTaLguY <mental@rydia.net>
6 *
7 * Copyright (C) 2004 MenTaLguY
8 *
9 * Released under GNU GPL, read the file 'COPYING' for more information
10 */
12 #ifndef SEEN_INKSCAPE_UTIL_TUPLE_H
13 #define SEEN_INKSCAPE_UTIL_TUPLE_H
15 #include "traits/reference.h"
17 namespace Inkscape {
19 namespace Util {
21 template <typename A=void, typename B=void, typename C=void,
22 typename D=void, typename E=void, typename F=void>
23 struct Tuple {
24 Tuple() {}
25 Tuple(typename Traits::Reference<A>::RValue a_,
26 typename Traits::Reference<B>::RValue b_,
27 typename Traits::Reference<C>::RValue c_,
28 typename Traits::Reference<D>::RValue d_,
29 typename Traits::Reference<E>::RValue e_,
30 typename Traits::Reference<F>::RValue f_)
31 : a(a_), b(b_), c(c_), d(d_), e(e_), f(f_) {}
33 A a;
34 B b;
35 C c;
36 D d;
37 E e;
38 F f;
39 };
41 template <typename A, typename B, typename C,
42 typename D, typename E>
43 struct Tuple<A, B, C, D, E, void> {
44 Tuple() {}
45 Tuple(typename Traits::Reference<A>::RValue a_,
46 typename Traits::Reference<B>::RValue b_,
47 typename Traits::Reference<C>::RValue c_,
48 typename Traits::Reference<D>::RValue d_,
49 typename Traits::Reference<E>::RValue e_)
50 : a(a_), b(b_), c(c_), d(d_), e(e_) {}
52 A a;
53 B b;
54 C c;
55 D d;
56 E e;
57 };
59 template <typename A, typename B, typename C, typename D>
60 struct Tuple<A, B, C, D, void, void> {
61 Tuple() {}
62 Tuple(typename Traits::Reference<A>::RValue a_,
63 typename Traits::Reference<B>::RValue b_,
64 typename Traits::Reference<C>::RValue c_,
65 typename Traits::Reference<D>::RValue d_)
66 : a(a_), b(b_), c(c_), d(d_) {}
68 A a;
69 B b;
70 C c;
71 D d;
72 };
74 template <typename A, typename B, typename C>
75 struct Tuple<A, B, C, void, void, void> {
76 Tuple() {}
77 Tuple(typename Traits::Reference<A>::RValue a_,
78 typename Traits::Reference<B>::RValue b_,
79 typename Traits::Reference<C>::RValue c_)
80 : a(a_), b(b_), c(c_) {}
82 A a;
83 B b;
84 C c;
85 };
87 template <typename A, typename B>
88 struct Tuple<A, B, void, void, void, void> {
89 Tuple() {}
90 Tuple(typename Traits::Reference<A>::RValue a_,
91 typename Traits::Reference<B>::RValue b_)
92 : a(a_), b(b_) {}
94 A a;
95 B b;
96 };
98 template <typename A>
99 struct Tuple<A, void, void, void, void, void> {
100 Tuple() {}
101 Tuple(typename Traits::Reference<A>::RValue a_)
102 : a(a_) {}
104 A a;
105 };
107 template <> struct Tuple<void, void, void, void, void, void> {};
109 template <typename A, typename B, typename C,
110 typename D, typename E, typename F>
111 inline Tuple<A, B, C, D, E, F>
112 tuple(typename Traits::Reference<A>::RValue a,
113 typename Traits::Reference<B>::RValue b,
114 typename Traits::Reference<C>::RValue c,
115 typename Traits::Reference<D>::RValue d,
116 typename Traits::Reference<E>::RValue e,
117 typename Traits::Reference<F>::RValue f)
118 {
119 return Tuple<A, B, C, D, E, F>(a, b, c, d, e, f);
120 }
122 template <typename A, typename B, typename C, typename D, typename E>
123 inline Tuple<A, B, C, D, E>
124 tuple(typename Traits::Reference<A>::RValue a,
125 typename Traits::Reference<B>::RValue b,
126 typename Traits::Reference<C>::RValue c,
127 typename Traits::Reference<D>::RValue d,
128 typename Traits::Reference<E>::RValue e)
129 {
130 return Tuple<A, B, C, D, E>(a, b, c, d, e);
131 }
133 template <typename A, typename B, typename C, typename D>
134 inline Tuple<A, B, C, D>
135 tuple(typename Traits::Reference<A>::RValue a,
136 typename Traits::Reference<B>::RValue b,
137 typename Traits::Reference<C>::RValue c,
138 typename Traits::Reference<D>::RValue d)
139 {
140 return Tuple<A, B, C, D>(a, b, c, d);
141 }
143 template <typename A, typename B, typename C>
144 inline Tuple<A, B, C>
145 tuple(typename Traits::Reference<A>::RValue a,
146 typename Traits::Reference<B>::RValue b,
147 typename Traits::Reference<C>::RValue c)
148 {
149 return Tuple<A, B, C>(a, b, c);
150 }
152 template <typename A, typename B>
153 inline Tuple<A, B>
154 tuple(typename Traits::Reference<A>::RValue a,
155 typename Traits::Reference<B>::RValue b)
156 {
157 return Tuple<A, B>(a, b);
158 }
160 template <typename A>
161 inline Tuple<A>
162 tuple(typename Traits::Reference<A>::RValue a) {
163 return Tuple<A>(a);
164 }
166 inline Tuple<> tuple() { return Tuple<>(); }
168 }
170 }
172 #endif
173 /*
174 Local Variables:
175 mode:c++
176 c-file-style:"stroustrup"
177 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
178 indent-tabs-mode:nil
179 fill-column:99
180 End:
181 */
182 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :