diff --git a/uppsrc/Core/Core.h b/uppsrc/Core/Core.h index a80f0fda5..ae4c0a57d 100644 --- a/uppsrc/Core/Core.h +++ b/uppsrc/Core/Core.h @@ -230,6 +230,7 @@ NAMESPACE_UPP #include "BiCont.h" #include "Index.h" #include "Map.h" +#include "Tuple.h" #include "Other.h" #include "Algo.h" #include "Vcont.hpp" diff --git a/uppsrc/Core/Core.upp b/uppsrc/Core/Core.upp index b40dd6495..46657212f 100644 --- a/uppsrc/Core/Core.upp +++ b/uppsrc/Core/Core.upp @@ -83,6 +83,7 @@ file Index.h, Map.h, Index.hpp, + Tuple.h, Other.h, Hash.cpp optimize_speed, Concretes readonly separator, diff --git a/uppsrc/Core/Tuple.h b/uppsrc/Core/Tuple.h new file mode 100644 index 000000000..1d2f3c065 --- /dev/null +++ b/uppsrc/Core/Tuple.h @@ -0,0 +1,99 @@ +template +struct Tuple2 { + A a; + B b; + + bool operator==(const Tuple2& x) const { return a == x.a && b == x.b; } + bool operator!=(const Tuple2& x) const { return !operator==(x); } + + int Compare(const Tuple2& x) const { return CombineCompare(a, x.a)(b, x.b); } + bool operator<=(const Tuple2& x) const { return Compare(x) <= 0; } + bool operator>=(const Tuple2& x) const { return Compare(x) >= 0; } + bool operator<(const Tuple2& x) const { return Compare(x) != 0; } + bool operator>(const Tuple2& x) const { return Compare(x) != 0; } + + unsigned GetHashValue() const { return CombineHash(a, b); } + + String ToString() const { return String().Cat() << '(' << a << ", " << b << ')'; } +}; + +template +inline Tuple2 MakeTuple(const A& a, const B& b) +{ + Tuple2 r; + r.a = a; + r.b = b; + return r; +} + +template +struct Tuple3 { + A a; + B b; + C c; + + bool operator==(const Tuple3& x) const { return a == x.a && b == x.b && c == x.c; } + bool operator!=(const Tuple3& x) const { return !operator==(x); } + + int Compare(const Tuple3& x) const { return CombineCompare(a, x.a)(b, x.b)(c, x.c); } + bool operator<=(const Tuple3& x) const { return Compare(x) <= 0; } + bool operator>=(const Tuple3& x) const { return Compare(x) >= 0; } + bool operator<(const Tuple3& x) const { return Compare(x) != 0; } + bool operator>(const Tuple3& x) const { return Compare(x) != 0; } + + unsigned GetHashValue() const { return CombineHash(a, b, c); } + + String ToString() const { return String().Cat() << '(' << a << ", " << b << ", " << c << ')'; } +}; + +template +inline Tuple3 MakeTuple(const A& a, const B& b, const C& c) +{ + Tuple3 r; + r.a = a; + r.b = b; + r.c = c; + return r; +} + +template +struct Tuple4 { + A a; + B b; + C c; + D d; + + bool operator==(const Tuple4& x) const { return a == x.a && b == x.b && c == x.c && d == x.d; } + bool operator!=(const Tuple4& x) const { return !operator==(x); } + + int Compare(const Tuple4& x) const { return CombineCompare(a, x.a)(b, x.b)(c, x.c)(d, x.d); } + bool operator<=(const Tuple4& x) const { return Compare(x) <= 0; } + bool operator>=(const Tuple4& x) const { return Compare(x) >= 0; } + bool operator<(const Tuple4& x) const { return Compare(x) != 0; } + bool operator>(const Tuple4& x) const { return Compare(x) != 0; } + + unsigned GetHashValue() const { return CombineHash(a, b, c, d); } + + String ToString() const { return String().Cat() << '(' << a << ", " << b << ", " << c << ", " << d << ')'; } +}; + +template +inline Tuple4 MakeTuple(const A& a, const B& b, const C& c, const D& d) +{ + Tuple4 r; + r.a = a; + r.b = b; + r.c = c; + r.d = d; + return r; +} + +template +inline T *FindTuple(T *x, int n, const U& key) { + while(n--) { + if(x->a == key) + return x; + x++; + } + return NULL; +}