1 // file      : cutl/container/key.hxx
2 // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
3 // license   : MIT; see accompkeying LICENSE file
4 
5 #ifndef CUTL_CONTAINER_KEY_HXX
6 #define CUTL_CONTAINER_KEY_HXX
7 
8 namespace cutl
9 {
10   namespace container
11   {
12     // A modifiable map key wrapper that can be used to implement multi-
13     // index containers, as discussed in the following post:
14     //
15     // http://www.codesynthesis.com/~boris/blog/2012/09/11/emulating-boost-multi-index-with-std-containers/
16     //
17     template <class T1, class T2 = void, class T3 = void>
18     struct key;
19 
20     template <class T1>
21     struct key<T1, void, void>
22     {
23       mutable const T1* p1;
24 
keycutl::container::key25       key (): p1 (0) {}
keycutl::container::key26       key (const T1& r1): p1 (&r1) {}
assigncutl::container::key27       void assign (const T1& r1) const {p1 = &r1;}
28 
operator <cutl::container::key29       bool operator< (const key& x) const {return *p1 < *x.p1;}
30     };
31 
32     template <class T1, class T2>
33     struct key<T1, T2, void>
34     {
35       mutable const T1* p1;
36       mutable const T2* p2;
37 
keycutl::container::key38       key (): p1 (0), p2 (0) {}
keycutl::container::key39       key (const T1& r1, const T2& r2): p1 (&r1), p2 (&r2) {}
assigncutl::container::key40       void assign (const T1& r1, const T2& r2) const {p1 = &r1; p2 = &r2;}
41 
operator <cutl::container::key42       bool operator< (const key& x) const
43       {
44         return *p1 < *x.p1 || (!(*x.p1 < *p1) && *p2 < *x.p2);
45       }
46     };
47 
48     template <class T1, class T2, class T3>
49     struct key
50     {
51       mutable const T1* p1;
52       mutable const T2* p2;
53       mutable const T3* p3;
54 
keycutl::container::key55       key (): p1 (0), p2 (0), p3 (0) {}
keycutl::container::key56       key (const T1& r1, const T2& r2, const T3& r3)
57           : p1 (&r1), p2 (&r2) , p3 (&r3) {}
assigncutl::container::key58       void assign (const T1& r1, const T2& r2, const T3& r3) const
59       {p1 = &r1; p2 = &r2; p3 = &r3;}
60 
operator <cutl::container::key61       bool operator< (const key& x) const
62       {
63         return (*p1 < *x.p1 ||
64                 (!(*x.p1 < *p1) && (*p2 < *x.p2 ||
65                                     (!(*x.p2 < *p2) && *p3 < *x.p3))));
66       }
67     };
68   }
69 }
70 
71 #endif // CUTL_CONTAINER_KEY_HXX
72