1 ////////////////////////////////////////////////////////////////////////////////
2 // The Loki Library
3 // Copyright (c) 2006 by Guillaume Chatelet
4 //
5 // Code covered by the MIT License
6 //
7 // Permission to use, copy, modify, distribute and sell this software for any
8 // purpose is hereby granted without fee, provided that the above copyright
9 // notice appear in all copies and that both that copyright notice and this
10 // permission notice appear in supporting documentation.
11 //
12 // The authors make no representations about the suitability of this software
13 // for any purpose. It is provided "as is" without express or implied warranty.
14 //
15 // This code DOES NOT accompany the book:
16 // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
17 //     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
18 //
19 ////////////////////////////////////////////////////////////////////////////////
20 #ifndef LOKI_KEY_INC_
21 #define LOKI_KEY_INC_
22 
23 // $Id: Key.h 771 2006-10-27 18:05:03Z clitte_bbt $
24 
25 
26 #include <loki/Factory.h>
27 
28 namespace Loki
29 {
30 
31      template<
32          class Factory,
33          typename IdentifierType
34      >
35      class Key;
36 
37     template<class F, typename I>
38     bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
39 
40     template<class F, typename I>
41     bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
42 
43 
44     /**
45      * A Key class
46      */
47      template<
48          class Factory,
49          typename IdentifierType
50      >
51      class Key
52      {
53         typedef typename Factory::Parm1 Parm1;
54         typedef typename Factory::Parm2 Parm2;
55         typedef typename Factory::Parm3 Parm3;
56         typedef typename Factory::Parm4 Parm4;
57         typedef typename Factory::Parm5 Parm5;
58         typedef typename Factory::Parm6 Parm6;
59         typedef typename Factory::Parm7 Parm7;
60         typedef typename Factory::Parm8 Parm8;
61         typedef typename Factory::Parm9 Parm9;
62         typedef typename Factory::Parm10 Parm10;
63         typedef typename Factory::Parm11 Parm11;
64         typedef typename Factory::Parm12 Parm12;
65         typedef typename Factory::Parm13 Parm13;
66         typedef typename Factory::Parm14 Parm14;
67         typedef typename Factory::Parm15 Parm15;
68      public:
69         // member variables
70         int count; // should be const, but constness prevent default copy ctor
71         IdentifierType id;
72         Parm1  p1;
73         Parm2  p2;
74         Parm3  p3;
75         Parm4  p4;
76         Parm5  p5;
77         Parm6  p6;
78         Parm7  p7;
79         Parm8  p8;
80         Parm9  p9;
81         Parm10 p10;
82         Parm11 p11;
83         Parm12 p12;
84         Parm13 p13;
85         Parm14 p14;
86         Parm15 p15;
87 
88         // member functions
Key()89         Key() : count(-1)
90         {
91         }
92 
Key(const IdentifierType & id)93         Key(const IdentifierType& id) : count(0)
94         {
95             this->id = id;
96         }
97 
Key(const IdentifierType & id,Parm1 & p1)98         Key(const IdentifierType& id,
99 				    Parm1 &p1) : count(1)
100         {
101             this->id = id;
102             this->p1 = p1;
103         }
104 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2)105         Key(const IdentifierType& id,
106 				    Parm1 &p1, Parm2 &p2) : count(2)
107         {
108             this->id = id;
109             this->p1 = p1;
110             this->p2 = p2;
111         }
112 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3)113         Key(const IdentifierType& id,
114 				    Parm1 &p1, Parm2 &p2, Parm3 &p3) : count(3)
115         {
116             this->id = id;
117             this->p1 = p1;
118             this->p2 = p2;
119             this->p3 = p3;
120         }
121 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3,Parm4 & p4)122         Key(const IdentifierType& id,
123 				    Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4) : count(4)
124         {
125             this->id = id;
126             this->p1 = p1;
127             this->p2 = p2;
128             this->p3 = p3;
129             this->p4 = p4;
130         }
131 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3,Parm4 & p4,Parm5 & p5)132         Key(const IdentifierType& id,
133 				    Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5) : count(5)
134         {
135             this->id = id;
136             this->p1 = p1;
137             this->p2 = p2;
138             this->p3 = p3;
139             this->p4 = p4;
140             this->p5 = p5;
141         }
142 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3,Parm4 & p4,Parm5 & p5,Parm6 & p6)143         Key(const IdentifierType& id,
144 				    Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
145 				    Parm6 &p6) : count(6)
146         {
147             this->id = id;
148             this->p1 = p1;
149             this->p2 = p2;
150             this->p3 = p3;
151             this->p4 = p4;
152             this->p5 = p5;
153             this->p6 = p6;
154         }
155 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3,Parm4 & p4,Parm5 & p5,Parm6 & p6,Parm7 & p7)156         Key(const IdentifierType& id,
157 				    Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
158 				    Parm6 &p6, Parm7 &p7 ) : count(7)
159         {
160             this->id = id;
161             this->p1 = p1;
162             this->p2 = p2;
163             this->p3 = p3;
164             this->p4 = p4;
165             this->p5 = p5;
166             this->p6 = p6;
167             this->p7 = p7;
168         }
169 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3,Parm4 & p4,Parm5 & p5,Parm6 & p6,Parm7 & p7,Parm8 & p8)170         Key(const IdentifierType& id,
171 				    Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
172 				    Parm6 &p6, Parm7 &p7, Parm8 &p8) : count(8)
173         {
174             this->id = id;
175             this->p1 = p1;
176             this->p2 = p2;
177             this->p3 = p3;
178             this->p4 = p4;
179             this->p5 = p5;
180             this->p6 = p6;
181             this->p7 = p7;
182             this->p8 = p8;
183         }
184 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3,Parm4 & p4,Parm5 & p5,Parm6 & p6,Parm7 & p7,Parm8 & p8,Parm9 & p9)185         Key(const IdentifierType& id,
186 				    Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
187 				    Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9) : count(9)
188         {
189             this->id = id;
190             this->p1 = p1;
191             this->p2 = p2;
192             this->p3 = p3;
193             this->p4 = p4;
194             this->p5 = p5;
195             this->p6 = p6;
196             this->p7 = p7;
197             this->p8 = p8;
198             this->p9 = p9;
199         }
200 
Key(const IdentifierType & id,Parm1 & p1,Parm2 & p2,Parm3 & p3,Parm4 & p4,Parm5 & p5,Parm6 & p6,Parm7 & p7,Parm8 & p8,Parm9 & p9,Parm10 & p10)201         Key(const IdentifierType& id,
202 				    Parm1 &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5 &p5,
203 				    Parm6 &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9,Parm10 &p10) : count(10)
204         {
205             this->id = id;
206             this->p1 = p1;
207             this->p2 = p2;
208             this->p3 = p3;
209             this->p4 = p4;
210             this->p5 = p5;
211             this->p6 = p6;
212             this->p7 = p7;
213             this->p8 = p8;
214             this->p9 = p9;
215             this->p10 = p10;
216         }
217 
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)218         Key(const IdentifierType& id,
219 				    Parm1  &p1, Parm2 &p2, Parm3 &p3, Parm4 &p4, Parm5  &p5,
220 				    Parm6  &p6, Parm7 &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10,
221 				    Parm11 &p11) : count(11)
222         {
223             this->id = id;
224             this->p1 = p1;
225             this->p2 = p2;
226             this->p3 = p3;
227             this->p4 = p4;
228             this->p5 = p5;
229             this->p6 = p6;
230             this->p7 = p7;
231             this->p8 = p8;
232             this->p9 = p9;
233             this->p10 = p10;
234             this->p11 = p11;
235         }
236 
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)237         Key(const IdentifierType& id,
238 				    Parm1  &p1,  Parm2  &p2, Parm3 &p3, Parm4 &p4, Parm5  &p5,
239 				    Parm6  &p6,  Parm7  &p7, Parm8 &p8, Parm9 &p9, Parm10 &p10,
240 				    Parm11 &p11, Parm12 &p12) : count(12)
241         {
242             this->id = id;
243             this->p1 = p1;
244             this->p2 = p2;
245             this->p3 = p3;
246             this->p4 = p4;
247             this->p5 = p5;
248             this->p6 = p6;
249             this->p7 = p7;
250             this->p8 = p8;
251             this->p9 = p9;
252             this->p10 = p10;
253             this->p11 = p11;
254             this->p12 = p12;
255         }
256 
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)257         Key(const IdentifierType& id,
258 				    Parm1  &p1,  Parm2  &p2,  Parm3  &p3, Parm4 &p4, Parm5  &p5,
259 				    Parm6  &p6,  Parm7  &p7,  Parm8  &p8, Parm9 &p9, Parm10 &p10,
260 				    Parm11 &p11, Parm12 &p12, Parm13 &p13) : count(13)
261         {
262             this->id = id;
263             this->p1 = p1;
264             this->p2 = p2;
265             this->p3 = p3;
266             this->p4 = p4;
267             this->p5 = p5;
268             this->p6 = p6;
269             this->p7 = p7;
270             this->p8 = p8;
271             this->p9 = p9;
272             this->p10 = p10;
273             this->p11 = p11;
274             this->p12 = p12;
275             this->p13 = p13;
276         }
277 
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)278         Key(const IdentifierType& id,
279 				    Parm1  &p1,  Parm2  &p2,  Parm3  &p3,  Parm4  &p4, Parm5  &p5,
280 				    Parm6  &p6,  Parm7  &p7,  Parm8  &p8,  Parm9  &p9, Parm10 &p10,
281 				    Parm11 &p11, Parm12 &p12, Parm13 &p13, Parm14 &p14) : count(14)
282         {
283             this->id = id;
284             this->p1 = p1;
285             this->p2 = p2;
286             this->p3 = p3;
287             this->p4 = p4;
288             this->p5 = p5;
289             this->p6 = p6;
290             this->p7 = p7;
291             this->p8 = p8;
292             this->p9 = p9;
293             this->p10 = p10;
294             this->p11 = p11;
295             this->p12 = p12;
296             this->p13 = p13;
297             this->p14 = p14;
298         }
299 
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)300         Key(const IdentifierType& id,
301 				    Parm1  &p1,  Parm2  &p2,  Parm3  &p3,  Parm4  &p4,  Parm5  &p5,
302 				    Parm6  &p6,  Parm7  &p7,  Parm8  &p8,  Parm9  &p9,  Parm10 &p10,
303 				    Parm11 &p11, Parm12 &p12, Parm13 &p13, Parm14 &p14, Parm15 &p15) : count(15)
304         {
305             this->id = id;
306             this->p1 = p1;
307             this->p2 = p2;
308             this->p3 = p3;
309             this->p4 = p4;
310             this->p5 = p5;
311             this->p6 = p6;
312             this->p7 = p7;
313             this->p8 = p8;
314             this->p9 = p9;
315             this->p10 = p10;
316             this->p11 = p11;
317             this->p12 = p12;
318             this->p13 = p13;
319             this->p14 = p14;
320             this->p15 = p15;
321         }
322 
323         template<class F, typename I>
324         friend bool operator==(const Key<F, I> &k1, const Key<F, I> &k2);
325 
326         template<class F, typename I>
327         friend bool operator<(const Key<F, I> &k1, const Key<F, I> &k2);
328     };
329 
330 
331     template<class F, typename I>
332      bool operator==(const Key<F, I> &k1, const Key<F, I> &k2)
333     {
334         if( k1.count != k2.count )
335             return false;
336         switch(k1.count){
337             case -1:
338                 return true;
339             case 0:
340                 if( k1.id == k2.id )
341                     return true;
342                 else
343                     return false;
344             case 1:
345                 if( (k1.id == k2.id) &&
346                     (k1.p1 == k2.p1) )
347                     return true;
348                 else
349                     return false;
350             case 2:
351                 if( (k1.id == k2.id) &&
352                     (k1.p1 == k2.p1) &&
353                     (k1.p2 == k2.p2) )
354                     return true;
355                 else
356                     return false;
357             case 3:
358                 if( (k1.id == k2.id) &&
359                     (k1.p1 == k2.p1) &&
360                     (k1.p2 == k2.p2) &&
361                     (k1.p3 == k2.p3) )
362                     return true;
363                 else
364                     return false;
365             case 4:
366                 if( (k1.id == k2.id) &&
367                     (k1.p1 == k2.p1) &&
368                     (k1.p2 == k2.p2) &&
369                     (k1.p3 == k2.p3) &&
370                     (k1.p4 == k2.p4) )
371                     return true;
372                 else
373                     return false;
374             case 5:
375                 if( (k1.id == k2.id) &&
376                     (k1.p1 == k2.p1) &&
377                     (k1.p2 == k2.p2) &&
378                     (k1.p3 == k2.p3) &&
379                     (k1.p4 == k2.p4) &&
380                     (k1.p5 == k2.p5) )
381                     return true;
382                 else
383                     return false;
384             case 6:
385                 if( (k1.id == k2.id) &&
386                     (k1.p1 == k2.p1) &&
387                     (k1.p2 == k2.p2) &&
388                     (k1.p3 == k2.p3) &&
389                     (k1.p4 == k2.p4) &&
390                     (k1.p5 == k2.p5) &&
391                     (k1.p6 == k2.p6) )
392                     return true;
393                 else
394                     return false;
395             case 7:
396                 if( (k1.id == k2.id) &&
397                     (k1.p1 == k2.p1) &&
398                     (k1.p2 == k2.p2) &&
399                     (k1.p3 == k2.p3) &&
400                     (k1.p4 == k2.p4) &&
401                     (k1.p5 == k2.p5) &&
402                     (k1.p6 == k2.p6) &&
403                     (k1.p7 == k2.p7) )
404                     return true;
405                 else
406                     return false;
407             case 8:
408                 if( (k1.id == k2.id) &&
409                     (k1.p1 == k2.p1) &&
410                     (k1.p2 == k2.p2) &&
411                     (k1.p3 == k2.p3) &&
412                     (k1.p4 == k2.p4) &&
413                     (k1.p5 == k2.p5) &&
414                     (k1.p6 == k2.p6) &&
415                     (k1.p7 == k2.p7) &&
416                     (k1.p8 == k2.p8) )
417                     return true;
418                 else
419                     return false;
420             case 9:
421                 if( (k1.id == k2.id) &&
422                     (k1.p1 == k2.p1) &&
423                     (k1.p2 == k2.p2) &&
424                     (k1.p3 == k2.p3) &&
425                     (k1.p4 == k2.p4) &&
426                     (k1.p5 == k2.p5) &&
427                     (k1.p6 == k2.p6) &&
428                     (k1.p7 == k2.p7) &&
429                     (k1.p8 == k2.p8) &&
430                     (k1.p9 == k2.p9) )
431                     return true;
432                 else
433                     return false;
434             case 10:
435                 if( (k1.id == k2.id) &&
436                     (k1.p1 == k2.p1) &&
437                     (k1.p2 == k2.p2) &&
438                     (k1.p3 == k2.p3) &&
439                     (k1.p4 == k2.p4) &&
440                     (k1.p5 == k2.p5) &&
441                     (k1.p6 == k2.p6) &&
442                     (k1.p7 == k2.p7) &&
443                     (k1.p8 == k2.p8) &&
444                     (k1.p9 == k2.p9) &&
445                     (k1.p10 == k2.p10) )
446                     return true;
447                 else
448                     return false;
449             case 11:
450                 if( (k1.id == k2.id) &&
451                     (k1.p1 == k2.p1) &&
452                     (k1.p2 == k2.p2) &&
453                     (k1.p3 == k2.p3) &&
454                     (k1.p4 == k2.p4) &&
455                     (k1.p5 == k2.p5) &&
456                     (k1.p6 == k2.p6) &&
457                     (k1.p7 == k2.p7) &&
458                     (k1.p8 == k2.p8) &&
459                     (k1.p9 == k2.p9) &&
460                     (k1.p10 == k2.p10) &&
461                     (k1.p11 == k2.p11) )
462                     return true;
463                 else
464                     return false;
465             case 12:
466                 if( (k1.id == k2.id) &&
467                     (k1.p1 == k2.p1) &&
468                     (k1.p2 == k2.p2) &&
469                     (k1.p3 == k2.p3) &&
470                     (k1.p4 == k2.p4) &&
471                     (k1.p5 == k2.p5) &&
472                     (k1.p6 == k2.p6) &&
473                     (k1.p7 == k2.p7) &&
474                     (k1.p8 == k2.p8) &&
475                     (k1.p9 == k2.p9) &&
476                     (k1.p10 == k2.p10) &&
477                     (k1.p11 == k2.p11) &&
478                     (k1.p12 == k2.p12) )
479                     return true;
480                 else
481                     return false;
482             case 13:
483                 if( (k1.id == k2.id) &&
484                     (k1.p1 == k2.p1) &&
485                     (k1.p2 == k2.p2) &&
486                     (k1.p3 == k2.p3) &&
487                     (k1.p4 == k2.p4) &&
488                     (k1.p5 == k2.p5) &&
489                     (k1.p6 == k2.p6) &&
490                     (k1.p7 == k2.p7) &&
491                     (k1.p8 == k2.p8) &&
492                     (k1.p9 == k2.p9) &&
493                     (k1.p10 == k2.p10) &&
494                     (k1.p11 == k2.p11) &&
495                     (k1.p12 == k2.p12) &&
496                     (k1.p13 == k2.p13) )
497                     return true;
498                 else
499                     return false;
500             case 14:
501                 if( (k1.id == k2.id) &&
502                     (k1.p1 == k2.p1) &&
503                     (k1.p2 == k2.p2) &&
504                     (k1.p3 == k2.p3) &&
505                     (k1.p4 == k2.p4) &&
506                     (k1.p5 == k2.p5) &&
507                     (k1.p6 == k2.p6) &&
508                     (k1.p7 == k2.p7) &&
509                     (k1.p8 == k2.p8) &&
510                     (k1.p9 == k2.p9) &&
511                     (k1.p10 == k2.p10) &&
512                     (k1.p11 == k2.p11) &&
513                     (k1.p12 == k2.p12) &&
514                     (k1.p13 == k2.p13) &&
515                     (k1.p14 == k2.p14) )
516                     return true;
517                 else
518                     return false;
519             case 15:
520                 if( (k1.id == k2.id) &&
521                     (k1.p1 == k2.p1) &&
522                     (k1.p2 == k2.p2) &&
523                     (k1.p3 == k2.p3) &&
524                     (k1.p4 == k2.p4) &&
525                     (k1.p5 == k2.p5) &&
526                     (k1.p6 == k2.p6) &&
527                     (k1.p7 == k2.p7) &&
528                     (k1.p8 == k2.p8) &&
529                     (k1.p9 == k2.p9) &&
530                     (k1.p10 == k2.p10) &&
531                     (k1.p11 == k2.p11) &&
532                     (k1.p12 == k2.p12) &&
533                     (k1.p13 == k2.p13) &&
534                     (k1.p14 == k2.p14) &&
535                     (k1.p15 == k2.p15) )
536                     return true;
537                 else
538                     return false;
539             default:
540                 return false;
541         }
542     }
543 
544 
545 
546     template<class F, typename I>
547     bool operator<(const Key<F, I> &k1, const Key<F, I> &k2)
548     {
549         if( k1.count < k2.count )
550             return true;
551         switch(k1.count){
552             case -1:
553                 return false;
554             case 0:
555                 if( k1.id < k2.id )
556                     return true;
557                 else
558                     return false;
559             case 1:
560                 if( (k1.id < k2.id) ||
561                     (k1.p1 < k2.p1) )
562                     return true;
563                 else
564                     return false;
565             case 2:
566                 if( (k1.id < k2.id) ||
567                     (k1.p1 < k2.p1) ||
568                     (k1.p2 < k2.p2) )
569                     return true;
570                 else
571                     return false;
572             case 3:
573                 if( (k1.id < k2.id) ||
574                     (k1.p1 < k2.p1) ||
575                     (k1.p2 < k2.p2) ||
576                     (k1.p3 < k2.p3) )
577                     return true;
578                 else
579                     return false;
580             case 4:
581                 if( (k1.id < k2.id) ||
582                     (k1.p1 < k2.p1) ||
583                     (k1.p2 < k2.p2) ||
584                     (k1.p3 < k2.p3) ||
585                     (k1.p4 < k2.p4) )
586                     return true;
587                 else
588                     return false;
589             case 5:
590                 if( (k1.id < k2.id) ||
591                     (k1.p1 < k2.p1) ||
592                     (k1.p2 < k2.p2) ||
593                     (k1.p3 < k2.p3) ||
594                     (k1.p4 < k2.p4) ||
595                     (k1.p5 < k2.p5) )
596                     return true;
597                 else
598                     return false;
599             case 6:
600                 if( (k1.id < k2.id) ||
601                     (k1.p1 < k2.p1) ||
602                     (k1.p2 < k2.p2) ||
603                     (k1.p3 < k2.p3) ||
604                     (k1.p4 < k2.p4) ||
605                     (k1.p5 < k2.p5) ||
606                     (k1.p6 < k2.p6) )
607                     return true;
608                 else
609                     return false;
610             case 7:
611                 if( (k1.id < k2.id) ||
612                     (k1.p1 < k2.p1) ||
613                     (k1.p2 < k2.p2) ||
614                     (k1.p3 < k2.p3) ||
615                     (k1.p4 < k2.p4) ||
616                     (k1.p5 < k2.p5) ||
617                     (k1.p6 < k2.p6) ||
618                     (k1.p7 < k2.p7) )
619                     return true;
620                 else
621                     return false;
622             case 8:
623                 if( (k1.id < k2.id) ||
624                     (k1.p1 < k2.p1) ||
625                     (k1.p2 < k2.p2) ||
626                     (k1.p3 < k2.p3) ||
627                     (k1.p4 < k2.p4) ||
628                     (k1.p5 < k2.p5) ||
629                     (k1.p6 < k2.p6) ||
630                     (k1.p7 < k2.p7) ||
631                     (k1.p8 < k2.p8) )
632                     return true;
633                 else
634                     return false;
635             case 9:
636                 if( (k1.id < k2.id) ||
637                     (k1.p1 < k2.p1) ||
638                     (k1.p2 < k2.p2) ||
639                     (k1.p3 < k2.p3) ||
640                     (k1.p4 < k2.p4) ||
641                     (k1.p5 < k2.p5) ||
642                     (k1.p6 < k2.p6) ||
643                     (k1.p7 < k2.p7) ||
644                     (k1.p8 < k2.p8) ||
645                     (k1.p9 < k2.p9) )
646                     return true;
647                 else
648                     return false;
649             case 10:
650                 if( (k1.id < k2.id) ||
651                     (k1.p1 < k2.p1) ||
652                     (k1.p2 < k2.p2) ||
653                     (k1.p3 < k2.p3) ||
654                     (k1.p4 < k2.p4) ||
655                     (k1.p5 < k2.p5) ||
656                     (k1.p6 < k2.p6) ||
657                     (k1.p7 < k2.p7) ||
658                     (k1.p8 < k2.p8) ||
659                     (k1.p9 < k2.p9) ||
660                     (k1.p10 < k2.p10) )
661                     return true;
662                 else
663                     return false;
664             case 11:
665                 if( (k1.id < k2.id) ||
666                     (k1.p1 < k2.p1) ||
667                     (k1.p2 < k2.p2) ||
668                     (k1.p3 < k2.p3) ||
669                     (k1.p4 < k2.p4) ||
670                     (k1.p5 < k2.p5) ||
671                     (k1.p6 < k2.p6) ||
672                     (k1.p7 < k2.p7) ||
673                     (k1.p8 < k2.p8) ||
674                     (k1.p9 < k2.p9) ||
675                     (k1.p10 < k2.p10) ||
676                     (k1.p11 < k2.p11) )
677                     return true;
678                 else
679                     return false;
680             case 12:
681                 if( (k1.id < k2.id) ||
682                     (k1.p1 < k2.p1) ||
683                     (k1.p2 < k2.p2) ||
684                     (k1.p3 < k2.p3) ||
685                     (k1.p4 < k2.p4) ||
686                     (k1.p5 < k2.p5) ||
687                     (k1.p6 < k2.p6) ||
688                     (k1.p7 < k2.p7) ||
689                     (k1.p8 < k2.p8) ||
690                     (k1.p9 < k2.p9) ||
691                     (k1.p10 < k2.p10) ||
692                     (k1.p11 < k2.p11) ||
693                     (k1.p12 < k2.p12) )
694                     return true;
695                 else
696                     return false;
697             case 13:
698                 if( (k1.id < k2.id) ||
699                     (k1.p1 < k2.p1) ||
700                     (k1.p2 < k2.p2) ||
701                     (k1.p3 < k2.p3) ||
702                     (k1.p4 < k2.p4) ||
703                     (k1.p5 < k2.p5) ||
704                     (k1.p6 < k2.p6) ||
705                     (k1.p7 < k2.p7) ||
706                     (k1.p8 < k2.p8) ||
707                     (k1.p9 < k2.p9) ||
708                     (k1.p10 < k2.p10) ||
709                     (k1.p11 < k2.p11) ||
710                     (k1.p12 < k2.p12) ||
711                     (k1.p13 < k2.p13) )
712                     return true;
713                 else
714                     return false;
715             case 14:
716                 if( (k1.id < k2.id) ||
717                     (k1.p1 < k2.p1) ||
718                     (k1.p2 < k2.p2) ||
719                     (k1.p3 < k2.p3) ||
720                     (k1.p4 < k2.p4) ||
721                     (k1.p5 < k2.p5) ||
722                     (k1.p6 < k2.p6) ||
723                     (k1.p7 < k2.p7) ||
724                     (k1.p8 < k2.p8) ||
725                     (k1.p9 < k2.p9) ||
726                     (k1.p10 < k2.p10) ||
727                     (k1.p11 < k2.p11) ||
728                     (k1.p12 < k2.p12) ||
729                     (k1.p13 < k2.p13) ||
730                     (k1.p14 < k2.p14) )
731                     return true;
732                 else
733                     return false;
734             case 15:
735                 if( (k1.id < k2.id) ||
736                     (k1.p1 < k2.p1) ||
737                     (k1.p2 < k2.p2) ||
738                     (k1.p3 < k2.p3) ||
739                     (k1.p4 < k2.p4) ||
740                     (k1.p5 < k2.p5) ||
741                     (k1.p6 < k2.p6) ||
742                     (k1.p7 < k2.p7) ||
743                     (k1.p8 < k2.p8) ||
744                     (k1.p9 < k2.p9) ||
745                     (k1.p10 < k2.p10) ||
746                     (k1.p11 < k2.p11) ||
747                     (k1.p12 < k2.p12) ||
748                     (k1.p13 < k2.p13) ||
749                     (k1.p14 < k2.p14) ||
750                     (k1.p15 < k2.p15) )
751                     return true;
752                 else
753                     return false;
754             default:
755                 return false;
756         }
757     }
758 
759 
760 
761 } // namespace Loki
762 
763 #endif // end file guardian
764 
765