synfig-core  1.0.3
guid.h
Go to the documentation of this file.
1 /* === S Y N F I G ========================================================= */
21 /* ========================================================================= */
22 
23 /* === S T A R T =========================================================== */
24 
25 #ifndef __SYNFIG_GUID_H
26 #define __SYNFIG_GUID_H
27 
28 /* === H E A D E R S ======================================================= */
29 
30 #include "string.h"
31 #include <stdint.h>
32 #include <cassert>
33 
34 /* === M A C R O S ========================================================= */
35 
36 /* === T Y P E D E F S ===================================================== */
37 
38 /* === C L A S S E S & S T R U C T S ======================================= */
39 
40 namespace synfig {
41 
42 class GUID
43 {
44  union {
45  struct {
46  unsigned int a;
47  unsigned int b;
48  unsigned int c;
49  unsigned int d;
50  } u_32;
51  struct {
52  uint64_t a;
53  uint64_t b;
54  } u_64;
55 
56  } data;
57 
58 public:
59  GUID()
60  { make_unique(); }
61  GUID(const GUID& x):data(x.data)
62  { }
63  GUID(const int i __attribute__ ((unused))){assert(!i); data.u_64.a=0;data.u_64.b=0;}
64 
65  GUID(const String& str);
66 
67  static GUID zero() { return GUID(0); }
68  static GUID hasher(const String& str);
69  static GUID hasher(int i);
70  static GUID hasher(const GUID &x);
71 
72  operator bool()const { return data.u_32.a||data.u_32.b||data.u_32.c||data.u_32.d; }
73 
74  uint64_t get_hi()const { return data.u_64.a; }
75  uint64_t get_lo()const { return data.u_64.b; }
76 
77  uint64_t get_hi_hi()const { return data.u_32.a; }
78  uint64_t get_hi_lo()const { return data.u_32.b; }
79  uint64_t get_lo_hi()const { return data.u_32.c; }
80  uint64_t get_lo_lo()const { return data.u_32.d; }
81 
82  void make_unique();
83  String get_string()const;
84 
85  bool operator==(const GUID& rhs)const
86  { return data.u_64.a==rhs.data.u_64.a && data.u_64.b==rhs.data.u_64.b; }
87  bool operator!=(const GUID& rhs)const
88  { return data.u_64.a!=rhs.data.u_64.a || data.u_64.b!=rhs.data.u_64.b; }
89  bool operator<(const GUID& rhs)const
90  { return (data.u_64.a==rhs.data.u_64.a)?(data.u_64.b<rhs.data.u_64.b):(data.u_64.a<rhs.data.u_64.a); }
91  bool operator>(const GUID& rhs)const
92  { return (data.u_64.a==rhs.data.u_64.a)?(data.u_64.b>rhs.data.u_64.b):(data.u_64.a>rhs.data.u_64.a); }
93  bool operator<=(const GUID& rhs)const
94  { return operator<(rhs) || operator==(rhs); }
95  bool operator>=(const GUID& rhs)const
96  { return operator>(rhs) || operator==(rhs); }
97 
99 
101  GUID& operator^=(const GUID& rhs)
102  {
103  data.u_32.a^=rhs.data.u_32.a;
104  data.u_32.b^=rhs.data.u_32.b;
105  data.u_32.c^=rhs.data.u_32.c;
106  data.u_32.d^=rhs.data.u_32.d;
107  return *this;
108  }
109  GUID operator^(const GUID& rhs)const { return GUID(*this)^=rhs; }
110 
112 
113  GUID& operator%=(const GUID& rhs)
114  {
115  data.u_32.a^=rhs.data.u_32.b;
116  data.u_32.b^=rhs.data.u_32.c;
117  data.u_32.c^=rhs.data.u_32.d;
118  data.u_32.d^=rhs.data.u_32.a;
119  return *this;
120  }
121  GUID operator%(const GUID& rhs)const { return GUID(*this)%=rhs; }
122 
123 };
124 
125 class GUIDHash
126 {
127 public:
128  size_t operator()(const GUID& guid)const
129  {
130  return
131  guid.get_hi_hi()+
132  guid.get_hi_lo()+
133  guid.get_lo_hi()+
134  guid.get_lo_lo();
135  }
136 };
137 
138 };
139 
140 /* === E N D =============================================================== */
141 
142 #endif