summaryrefslogtreecommitdiffstats
path: root/src/util/tuple.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/tuple.h')
-rw-r--r--src/util/tuple.h182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/util/tuple.h b/src/util/tuple.h
new file mode 100644
index 000000000..bf9338366
--- /dev/null
+++ b/src/util/tuple.h
@@ -0,0 +1,182 @@
+/*
+ * Inkscape::Util::Tuple - generic tuple type
+ *
+ * Authors:
+ * MenTaLguY <mental@rydia.net>
+ *
+ * Copyright (C) 2004 MenTaLguY
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef SEEN_INKSCAPE_UTIL_TUPLE_H
+#define SEEN_INKSCAPE_UTIL_TUPLE_H
+
+#include "traits/reference.h"
+
+namespace Inkscape {
+
+namespace Util {
+
+template <typename A=void, typename B=void, typename C=void,
+ typename D=void, typename E=void, typename F=void>
+struct Tuple {
+ Tuple() {}
+ Tuple(typename Traits::Reference<A>::RValue a_,
+ typename Traits::Reference<B>::RValue b_,
+ typename Traits::Reference<C>::RValue c_,
+ typename Traits::Reference<D>::RValue d_,
+ typename Traits::Reference<E>::RValue e_,
+ typename Traits::Reference<F>::RValue f_)
+ : a(a_), b(b_), c(c_), d(d_), e(e_), f(f_) {}
+
+ A a;
+ B b;
+ C c;
+ D d;
+ E e;
+ F f;
+};
+
+template <typename A, typename B, typename C,
+ typename D, typename E>
+struct Tuple<A, B, C, D, E, void> {
+ Tuple() {}
+ Tuple(typename Traits::Reference<A>::RValue a_,
+ typename Traits::Reference<B>::RValue b_,
+ typename Traits::Reference<C>::RValue c_,
+ typename Traits::Reference<D>::RValue d_,
+ typename Traits::Reference<E>::RValue e_)
+ : a(a_), b(b_), c(c_), d(d_), e(e_) {}
+
+ A a;
+ B b;
+ C c;
+ D d;
+ E e;
+};
+
+template <typename A, typename B, typename C, typename D>
+struct Tuple<A, B, C, D, void, void> {
+ Tuple() {}
+ Tuple(typename Traits::Reference<A>::RValue a_,
+ typename Traits::Reference<B>::RValue b_,
+ typename Traits::Reference<C>::RValue c_,
+ typename Traits::Reference<D>::RValue d_)
+ : a(a_), b(b_), c(c_), d(d_) {}
+
+ A a;
+ B b;
+ C c;
+ D d;
+};
+
+template <typename A, typename B, typename C>
+struct Tuple<A, B, C, void, void, void> {
+ Tuple() {}
+ Tuple(typename Traits::Reference<A>::RValue a_,
+ typename Traits::Reference<B>::RValue b_,
+ typename Traits::Reference<C>::RValue c_)
+ : a(a_), b(b_), c(c_) {}
+
+ A a;
+ B b;
+ C c;
+};
+
+template <typename A, typename B>
+struct Tuple<A, B, void, void, void, void> {
+ Tuple() {}
+ Tuple(typename Traits::Reference<A>::RValue a_,
+ typename Traits::Reference<B>::RValue b_)
+ : a(a_), b(b_) {}
+
+ A a;
+ B b;
+};
+
+template <typename A>
+struct Tuple<A, void, void, void, void, void> {
+ Tuple() {}
+ Tuple(typename Traits::Reference<A>::RValue a_)
+ : a(a_) {}
+
+ A a;
+};
+
+template <> struct Tuple<void, void, void, void, void, void> {};
+
+template <typename A, typename B, typename C,
+ typename D, typename E, typename F>
+inline Tuple<A, B, C, D, E, F>
+tuple(typename Traits::Reference<A>::RValue a,
+ typename Traits::Reference<B>::RValue b,
+ typename Traits::Reference<C>::RValue c,
+ typename Traits::Reference<D>::RValue d,
+ typename Traits::Reference<E>::RValue e,
+ typename Traits::Reference<F>::RValue f)
+{
+ return Tuple<A, B, C, D, E, F>(a, b, c, d, e, f);
+}
+
+template <typename A, typename B, typename C, typename D, typename E>
+inline Tuple<A, B, C, D, E>
+tuple(typename Traits::Reference<A>::RValue a,
+ typename Traits::Reference<B>::RValue b,
+ typename Traits::Reference<C>::RValue c,
+ typename Traits::Reference<D>::RValue d,
+ typename Traits::Reference<E>::RValue e)
+{
+ return Tuple<A, B, C, D, E>(a, b, c, d, e);
+}
+
+template <typename A, typename B, typename C, typename D>
+inline Tuple<A, B, C, D>
+tuple(typename Traits::Reference<A>::RValue a,
+ typename Traits::Reference<B>::RValue b,
+ typename Traits::Reference<C>::RValue c,
+ typename Traits::Reference<D>::RValue d)
+{
+ return Tuple<A, B, C, D>(a, b, c, d);
+}
+
+template <typename A, typename B, typename C>
+inline Tuple<A, B, C>
+tuple(typename Traits::Reference<A>::RValue a,
+ typename Traits::Reference<B>::RValue b,
+ typename Traits::Reference<C>::RValue c)
+{
+ return Tuple<A, B, C>(a, b, c);
+}
+
+template <typename A, typename B>
+inline Tuple<A, B>
+tuple(typename Traits::Reference<A>::RValue a,
+ typename Traits::Reference<B>::RValue b)
+{
+ return Tuple<A, B>(a, b);
+}
+
+template <typename A>
+inline Tuple<A>
+tuple(typename Traits::Reference<A>::RValue a) {
+ return Tuple<A>(a);
+}
+
+inline Tuple<> tuple() { return Tuple<>(); }
+
+}
+
+}
+
+#endif
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :