summaryrefslogtreecommitdiff
path: root/shared/loki/Key.h
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:10:11 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:10:11 +0200
commitc0cdb2ad99a1e2a6ade5ce76c91177a79258e669 (patch)
tree4701a015385d9a6a5a4ba99a8f1f5d400fff26b1 /shared/loki/Key.h
parent3.13 (diff)
downloadFreeFileSync-c0cdb2ad99a1e2a6ade5ce76c91177a79258e669.tar.gz
FreeFileSync-c0cdb2ad99a1e2a6ade5ce76c91177a79258e669.tar.bz2
FreeFileSync-c0cdb2ad99a1e2a6ade5ce76c91177a79258e669.zip
3.14
Diffstat (limited to 'shared/loki/Key.h')
-rw-r--r--shared/loki/Key.h1442
1 files changed, 722 insertions, 720 deletions
diff --git a/shared/loki/Key.h b/shared/loki/Key.h
index 4daaa603..c80d6f4e 100644
--- a/shared/loki/Key.h
+++ b/shared/loki/Key.h
@@ -4,16 +4,16 @@
//
// Code covered by the MIT License
//
-// Permission to use, copy, modify, distribute and sell this software for any
-// purpose is hereby granted without fee, provided that the above copyright
-// notice appear in all copies and that both that copyright notice and this
+// Permission to use, copy, modify, distribute and sell this software for any
+// purpose is hereby granted without fee, provided that the above copyright
+// notice appear in all copies and that both that copyright notice and this
// permission notice appear in supporting documentation.
//
// The authors make no representations about the suitability of this software
// for any purpose. It is provided "as is" without express or implied warranty.
//
// This code DOES NOT accompany the book:
-// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
+// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
// Patterns Applied". Copyright (c) 2001. Addison-Wesley.
//
////////////////////////////////////////////////////////////////////////////////
@@ -28,735 +28,737 @@
namespace Loki
{
- template<
- class Factory,
- typename IdentifierType
- >
- class Key;
+template<
+class Factory,
+ typename IdentifierType
+ >
+class Key;
- template<class F, typename I>
- bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
+template<class F, typename I>
+bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
+
+template<class F, typename I>
+bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
+
+
+/**
+ * A Key class
+ */
+template<
+class Factory,
+ typename IdentifierType
+ >
+class Key
+{
+ typedef typename Factory::Parm1 Parm1;
+ typedef typename Factory::Parm2 Parm2;
+ typedef typename Factory::Parm3 Parm3;
+ typedef typename Factory::Parm4 Parm4;
+ typedef typename Factory::Parm5 Parm5;
+ typedef typename Factory::Parm6 Parm6;
+ typedef typename Factory::Parm7 Parm7;
+ typedef typename Factory::Parm8 Parm8;
+ typedef typename Factory::Parm9 Parm9;
+ typedef typename Factory::Parm10 Parm10;
+ typedef typename Factory::Parm11 Parm11;
+ typedef typename Factory::Parm12 Parm12;
+ typedef typename Factory::Parm13 Parm13;
+ typedef typename Factory::Parm14 Parm14;
+ typedef typename Factory::Parm15 Parm15;
+public:
+ // member variables
+ int count; // should be const, but constness prevent default copy ctor
+ IdentifierType id;
+ Parm1 p1;
+ Parm2 p2;
+ Parm3 p3;
+ Parm4 p4;
+ Parm5 p5;
+ Parm6 p6;
+ Parm7 p7;
+ Parm8 p8;
+ Parm9 p9;
+ Parm10 p10;
+ Parm11 p11;
+ Parm12 p12;
+ Parm13 p13;
+ Parm14 p14;
+ Parm15 p15;
+
+ // member functions
+ Key() : count(-1)
+ {
+ }
+
+ Key(const IdentifierType& id) : count(0)
+ {
+ this->id = id;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1) : count(1)
+ {
+ this->id = id;
+ this->p1 = p1;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2) : count(2)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3) : count(3)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4) : count(4)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5) : count(5)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6) : count(6)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7 ) : count(7)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8) : count(8)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9) : count(9)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ this->p9 = p9;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9,Parm10& p10) : count(10)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ this->p9 = p9;
+ this->p10 = p10;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9, Parm10& p10,
+ Parm11& p11) : count(11)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ this->p9 = p9;
+ this->p10 = p10;
+ this->p11 = p11;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9, Parm10& p10,
+ Parm11& p11, Parm12& p12) : count(12)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ this->p9 = p9;
+ this->p10 = p10;
+ this->p11 = p11;
+ this->p12 = p12;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9, Parm10& p10,
+ Parm11& p11, Parm12& p12, Parm13& p13) : count(13)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ this->p9 = p9;
+ this->p10 = p10;
+ this->p11 = p11;
+ this->p12 = p12;
+ this->p13 = p13;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9, Parm10& p10,
+ Parm11& p11, Parm12& p12, Parm13& p13, Parm14& p14) : count(14)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ this->p9 = p9;
+ this->p10 = p10;
+ this->p11 = p11;
+ this->p12 = p12;
+ this->p13 = p13;
+ this->p14 = p14;
+ }
+
+ Key(const IdentifierType& id,
+ Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5,
+ Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9, Parm10& p10,
+ Parm11& p11, Parm12& p12, Parm13& p13, Parm14& p14, Parm15& p15) : count(15)
+ {
+ this->id = id;
+ this->p1 = p1;
+ this->p2 = p2;
+ this->p3 = p3;
+ this->p4 = p4;
+ this->p5 = p5;
+ this->p6 = p6;
+ this->p7 = p7;
+ this->p8 = p8;
+ this->p9 = p9;
+ this->p10 = p10;
+ this->p11 = p11;
+ this->p12 = p12;
+ this->p13 = p13;
+ this->p14 = p14;
+ this->p15 = p15;
+ }
template<class F, typename I>
- bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
-
-
- /**
- * A Key class
- */
- template<
- class Factory,
- typename IdentifierType
- >
- class Key
- {
- typedef typename Factory::Parm1 Parm1;
- typedef typename Factory::Parm2 Parm2;
- typedef typename Factory::Parm3 Parm3;
- typedef typename Factory::Parm4 Parm4;
- typedef typename Factory::Parm5 Parm5;
- typedef typename Factory::Parm6 Parm6;
- typedef typename Factory::Parm7 Parm7;
- typedef typename Factory::Parm8 Parm8;
- typedef typename Factory::Parm9 Parm9;
- typedef typename Factory::Parm10 Parm10;
- typedef typename Factory::Parm11 Parm11;
- typedef typename Factory::Parm12 Parm12;
- typedef typename Factory::Parm13 Parm13;
- typedef typename Factory::Parm14 Parm14;
- typedef typename Factory::Parm15 Parm15;
- public:
- // member variables
- int count; // should be const, but constness prevent default copy ctor
- IdentifierType id;
- Parm1 p1;
- Parm2 p2;
- Parm3 p3;
- Parm4 p4;
- Parm5 p5;
- Parm6 p6;
- Parm7 p7;
- Parm8 p8;
- Parm9 p9;
- Parm10 p10;
- Parm11 p11;
- Parm12 p12;
- Parm13 p13;
- Parm14 p14;
- Parm15 p15;
-
- // member functions
- Key() : count(-1)
- {
- }
-
- Key(const IdentifierType& id) : count(0)
- {
- this->id = id;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1) : count(1)
- {
- this->id = id;
- this->p1 = p1;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2) : count(2)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3) : count(3)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4) : count(4)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5) : count(5)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6) : count(6)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7 ) : count(7)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8) : count(8)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9) : count(9)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- this->p9 = p9;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9,Parm10 &p10) : count(10)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- this->p9 = p9;
- this->p10 = p10;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10,
- Parm11 &p11) : count(11)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- this->p9 = p9;
- this->p10 = p10;
- this->p11 = p11;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10,
- Parm11 &p11, Parm12 &p12) : count(12)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- this->p9 = p9;
- this->p10 = p10;
- this->p11 = p11;
- this->p12 = p12;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10,
- Parm11 &p11, Parm12 &p12, Parm13 &p13) : count(13)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- this->p9 = p9;
- this->p10 = p10;
- this->p11 = p11;
- this->p12 = p12;
- this->p13 = p13;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10,
- Parm11 &p11, Parm12 &p12, Parm13 &p13, Parm14 &p14) : count(14)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- this->p9 = p9;
- this->p10 = p10;
- this->p11 = p11;
- this->p12 = p12;
- this->p13 = p13;
- this->p14 = p14;
- }
-
- Key(const IdentifierType& id,
- Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
- Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10,
- Parm11 &p11, Parm12 &p12, Parm13 &p13, Parm14 &p14, Parm15 &p15) : count(15)
- {
- this->id = id;
- this->p1 = p1;
- this->p2 = p2;
- this->p3 = p3;
- this->p4 = p4;
- this->p5 = p5;
- this->p6 = p6;
- this->p7 = p7;
- this->p8 = p8;
- this->p9 = p9;
- this->p10 = p10;
- this->p11 = p11;
- this->p12 = p12;
- this->p13 = p13;
- this->p14 = p14;
- this->p15 = p15;
- }
-
- template<class F, typename I>
- friend bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
-
- template<class F, typename I>
- friend bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
- };
-
-
+ friend bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
+
template<class F, typename I>
- bool operator==(const Key<F, I> &k1, const Key<F, I> &k2)
+ friend bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
+};
+
+
+template<class F, typename I>
+bool operator==(const Key<F, I> &k1, const Key<F, I> &k2)
+{
+ if( k1.count != k2.count )
+ return false;
+ switch(k1.count)
{
- if( k1.count != k2.count )
+ case -1:
+ return true;
+ case 0:
+ if( k1.id == k2.id )
+ return true;
+ else
+ return false;
+ case 1:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) )
+ return true;
+ else
+ return false;
+ case 2:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) )
+ return true;
+ else
+ return false;
+ case 3:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) )
+ return true;
+ else
+ return false;
+ case 4:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) )
+ return true;
+ else
+ return false;
+ case 5:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) )
+ return true;
+ else
+ return false;
+ case 6:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) )
+ return true;
+ else
+ return false;
+ case 7:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) )
+ return true;
+ else
+ return false;
+ case 8:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) )
+ return true;
+ else
+ return false;
+ case 9:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) &&
+ (k1.p9 == k2.p9) )
+ return true;
+ else
+ return false;
+ case 10:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) &&
+ (k1.p9 == k2.p9) &&
+ (k1.p10 == k2.p10) )
+ return true;
+ else
+ return false;
+ case 11:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) &&
+ (k1.p9 == k2.p9) &&
+ (k1.p10 == k2.p10) &&
+ (k1.p11 == k2.p11) )
+ return true;
+ else
+ return false;
+ case 12:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) &&
+ (k1.p9 == k2.p9) &&
+ (k1.p10 == k2.p10) &&
+ (k1.p11 == k2.p11) &&
+ (k1.p12 == k2.p12) )
+ return true;
+ else
+ return false;
+ case 13:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) &&
+ (k1.p9 == k2.p9) &&
+ (k1.p10 == k2.p10) &&
+ (k1.p11 == k2.p11) &&
+ (k1.p12 == k2.p12) &&
+ (k1.p13 == k2.p13) )
+ return true;
+ else
+ return false;
+ case 14:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) &&
+ (k1.p9 == k2.p9) &&
+ (k1.p10 == k2.p10) &&
+ (k1.p11 == k2.p11) &&
+ (k1.p12 == k2.p12) &&
+ (k1.p13 == k2.p13) &&
+ (k1.p14 == k2.p14) )
+ return true;
+ else
+ return false;
+ case 15:
+ if( (k1.id == k2.id) &&
+ (k1.p1 == k2.p1) &&
+ (k1.p2 == k2.p2) &&
+ (k1.p3 == k2.p3) &&
+ (k1.p4 == k2.p4) &&
+ (k1.p5 == k2.p5) &&
+ (k1.p6 == k2.p6) &&
+ (k1.p7 == k2.p7) &&
+ (k1.p8 == k2.p8) &&
+ (k1.p9 == k2.p9) &&
+ (k1.p10 == k2.p10) &&
+ (k1.p11 == k2.p11) &&
+ (k1.p12 == k2.p12) &&
+ (k1.p13 == k2.p13) &&
+ (k1.p14 == k2.p14) &&
+ (k1.p15 == k2.p15) )
+ return true;
+ else
+ return false;
+ default:
return false;
- switch(k1.count){
- case -1:
- return true;
- case 0:
- if( k1.id == k2.id )
- return true;
- else
- return false;
- case 1:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) )
- return true;
- else
- return false;
- case 2:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) )
- return true;
- else
- return false;
- case 3:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) )
- return true;
- else
- return false;
- case 4:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) )
- return true;
- else
- return false;
- case 5:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) )
- return true;
- else
- return false;
- case 6:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) )
- return true;
- else
- return false;
- case 7:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) )
- return true;
- else
- return false;
- case 8:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) )
- return true;
- else
- return false;
- case 9:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) &&
- (k1.p9 == k2.p9) )
- return true;
- else
- return false;
- case 10:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) &&
- (k1.p9 == k2.p9) &&
- (k1.p10 == k2.p10) )
- return true;
- else
- return false;
- case 11:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) &&
- (k1.p9 == k2.p9) &&
- (k1.p10 == k2.p10) &&
- (k1.p11 == k2.p11) )
- return true;
- else
- return false;
- case 12:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) &&
- (k1.p9 == k2.p9) &&
- (k1.p10 == k2.p10) &&
- (k1.p11 == k2.p11) &&
- (k1.p12 == k2.p12) )
- return true;
- else
- return false;
- case 13:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) &&
- (k1.p9 == k2.p9) &&
- (k1.p10 == k2.p10) &&
- (k1.p11 == k2.p11) &&
- (k1.p12 == k2.p12) &&
- (k1.p13 == k2.p13) )
- return true;
- else
- return false;
- case 14:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) &&
- (k1.p9 == k2.p9) &&
- (k1.p10 == k2.p10) &&
- (k1.p11 == k2.p11) &&
- (k1.p12 == k2.p12) &&
- (k1.p13 == k2.p13) &&
- (k1.p14 == k2.p14) )
- return true;
- else
- return false;
- case 15:
- if( (k1.id == k2.id) &&
- (k1.p1 == k2.p1) &&
- (k1.p2 == k2.p2) &&
- (k1.p3 == k2.p3) &&
- (k1.p4 == k2.p4) &&
- (k1.p5 == k2.p5) &&
- (k1.p6 == k2.p6) &&
- (k1.p7 == k2.p7) &&
- (k1.p8 == k2.p8) &&
- (k1.p9 == k2.p9) &&
- (k1.p10 == k2.p10) &&
- (k1.p11 == k2.p11) &&
- (k1.p12 == k2.p12) &&
- (k1.p13 == k2.p13) &&
- (k1.p14 == k2.p14) &&
- (k1.p15 == k2.p15) )
- return true;
- else
- return false;
- default:
- return false;
- }
}
+}
- template<class F, typename I>
- bool operator<(const Key<F, I> &k1, const Key<F, I> &k2)
+template<class F, typename I>
+bool operator<(const Key<F, I> &k1, const Key<F, I> &k2)
+{
+ if( k1.count < k2.count )
+ return true;
+ switch(k1.count)
{
- if( k1.count < k2.count )
- return true;
- switch(k1.count){
- case -1:
- return false;
- case 0:
- if( k1.id < k2.id )
- return true;
- else
- return false;
- case 1:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) )
- return true;
- else
- return false;
- case 2:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) )
- return true;
- else
- return false;
- case 3:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) )
- return true;
- else
- return false;
- case 4:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) )
- return true;
- else
- return false;
- case 5:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) )
- return true;
- else
- return false;
- case 6:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) )
- return true;
- else
- return false;
- case 7:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) )
- return true;
- else
- return false;
- case 8:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) )
- return true;
- else
- return false;
- case 9:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) ||
- (k1.p9 < k2.p9) )
- return true;
- else
- return false;
- case 10:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) ||
- (k1.p9 < k2.p9) ||
- (k1.p10 < k2.p10) )
- return true;
- else
- return false;
- case 11:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) ||
- (k1.p9 < k2.p9) ||
- (k1.p10 < k2.p10) ||
- (k1.p11 < k2.p11) )
- return true;
- else
- return false;
- case 12:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) ||
- (k1.p9 < k2.p9) ||
- (k1.p10 < k2.p10) ||
- (k1.p11 < k2.p11) ||
- (k1.p12 < k2.p12) )
- return true;
- else
- return false;
- case 13:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) ||
- (k1.p9 < k2.p9) ||
- (k1.p10 < k2.p10) ||
- (k1.p11 < k2.p11) ||
- (k1.p12 < k2.p12) ||
- (k1.p13 < k2.p13) )
- return true;
- else
- return false;
- case 14:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) ||
- (k1.p9 < k2.p9) ||
- (k1.p10 < k2.p10) ||
- (k1.p11 < k2.p11) ||
- (k1.p12 < k2.p12) ||
- (k1.p13 < k2.p13) ||
- (k1.p14 < k2.p14) )
- return true;
- else
- return false;
- case 15:
- if( (k1.id < k2.id) ||
- (k1.p1 < k2.p1) ||
- (k1.p2 < k2.p2) ||
- (k1.p3 < k2.p3) ||
- (k1.p4 < k2.p4) ||
- (k1.p5 < k2.p5) ||
- (k1.p6 < k2.p6) ||
- (k1.p7 < k2.p7) ||
- (k1.p8 < k2.p8) ||
- (k1.p9 < k2.p9) ||
- (k1.p10 < k2.p10) ||
- (k1.p11 < k2.p11) ||
- (k1.p12 < k2.p12) ||
- (k1.p13 < k2.p13) ||
- (k1.p14 < k2.p14) ||
- (k1.p15 < k2.p15) )
- return true;
- else
- return false;
- default:
- return false;
- }
+ case -1:
+ return false;
+ case 0:
+ if( k1.id < k2.id )
+ return true;
+ else
+ return false;
+ case 1:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) )
+ return true;
+ else
+ return false;
+ case 2:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) )
+ return true;
+ else
+ return false;
+ case 3:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) )
+ return true;
+ else
+ return false;
+ case 4:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) )
+ return true;
+ else
+ return false;
+ case 5:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) )
+ return true;
+ else
+ return false;
+ case 6:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) )
+ return true;
+ else
+ return false;
+ case 7:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) )
+ return true;
+ else
+ return false;
+ case 8:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) )
+ return true;
+ else
+ return false;
+ case 9:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) ||
+ (k1.p9 < k2.p9) )
+ return true;
+ else
+ return false;
+ case 10:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) ||
+ (k1.p9 < k2.p9) ||
+ (k1.p10 < k2.p10) )
+ return true;
+ else
+ return false;
+ case 11:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) ||
+ (k1.p9 < k2.p9) ||
+ (k1.p10 < k2.p10) ||
+ (k1.p11 < k2.p11) )
+ return true;
+ else
+ return false;
+ case 12:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) ||
+ (k1.p9 < k2.p9) ||
+ (k1.p10 < k2.p10) ||
+ (k1.p11 < k2.p11) ||
+ (k1.p12 < k2.p12) )
+ return true;
+ else
+ return false;
+ case 13:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) ||
+ (k1.p9 < k2.p9) ||
+ (k1.p10 < k2.p10) ||
+ (k1.p11 < k2.p11) ||
+ (k1.p12 < k2.p12) ||
+ (k1.p13 < k2.p13) )
+ return true;
+ else
+ return false;
+ case 14:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) ||
+ (k1.p9 < k2.p9) ||
+ (k1.p10 < k2.p10) ||
+ (k1.p11 < k2.p11) ||
+ (k1.p12 < k2.p12) ||
+ (k1.p13 < k2.p13) ||
+ (k1.p14 < k2.p14) )
+ return true;
+ else
+ return false;
+ case 15:
+ if( (k1.id < k2.id) ||
+ (k1.p1 < k2.p1) ||
+ (k1.p2 < k2.p2) ||
+ (k1.p3 < k2.p3) ||
+ (k1.p4 < k2.p4) ||
+ (k1.p5 < k2.p5) ||
+ (k1.p6 < k2.p6) ||
+ (k1.p7 < k2.p7) ||
+ (k1.p8 < k2.p8) ||
+ (k1.p9 < k2.p9) ||
+ (k1.p10 < k2.p10) ||
+ (k1.p11 < k2.p11) ||
+ (k1.p12 < k2.p12) ||
+ (k1.p13 < k2.p13) ||
+ (k1.p14 < k2.p14) ||
+ (k1.p15 < k2.p15) )
+ return true;
+ else
+ return false;
+ default:
+ return false;
}
+}
+
-
} // namespace Loki
bgstack15