Collage  1.7.0
High-performance C++ library for developing object-oriented distributed applications.
objectVersion.h
1 
2 /* Copyright (c) 2009-2017, Stefan Eilemann <eile@equalizergraphics.com>
3  *
4  * This file is part of Collage <https://github.com/Eyescale/Collage>
5  *
6  * This library is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU Lesser General Public License version 2.1 as published
8  * by the Free Software Foundation.
9  *
10  * This library is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13  * details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this library; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #ifndef CO_OBJECTVERSION_H
21 #define CO_OBJECTVERSION_H
22 
23 #include <co/api.h>
24 #include <co/types.h>
25 #include <iostream>
26 #include <lunchbox/bitOperation.h>
27 
28 namespace co
29 {
31 static const uint128_t VERSION_NONE(0, 0);
32 static const uint128_t VERSION_FIRST(0, 1);
33 static const uint128_t VERSION_NEWEST(0, 0xfffffffffffffffbull);
34 static const uint128_t VERSION_OLDEST(0, 0xfffffffffffffffcull);
35 static const uint128_t VERSION_NEXT(0, 0xfffffffffffffffdull);
36 static const uint128_t VERSION_INVALID(0, 0xfffffffffffffffeull);
37 static const uint128_t VERSION_HEAD(0, 0xffffffffffffffffull);
38 
47 {
49  CO_API ObjectVersion();
50 
52  CO_API ObjectVersion(const uint128_t& identifier, const uint128_t& version);
53 
55  CO_API explicit ObjectVersion(const Object* object);
56 
58  CO_API explicit ObjectVersion(const Object& object);
59 
61  template <class R>
62  explicit ObjectVersion(lunchbox::RefPtr<R> object)
63  {
64  *this = object.get();
65  }
66 
68  CO_API ObjectVersion& operator=(const Object* object);
69 
71  bool operator==(const ObjectVersion& value) const
72  {
73  return (identifier == value.identifier && version == value.version);
74  }
75 
77  bool operator!=(const ObjectVersion& value) const
78  {
79  return (identifier != value.identifier || version != value.version);
80  }
81 
82  bool operator<(const ObjectVersion& rhs) const
83  {
84  return identifier < rhs.identifier ||
85  (identifier == rhs.identifier && version < rhs.version);
86  }
87 
88  bool operator>(const ObjectVersion& rhs) const
89  {
90  return identifier > rhs.identifier ||
91  (identifier == rhs.identifier && version > rhs.version);
92  }
93 
95  explicit operator bool() const
96  {
97  return identifier != 0 && version != VERSION_NONE;
98  }
99 
101  bool operator!() const
102  {
103  return identifier == 0 || version == VERSION_NONE;
104  }
105 
106  uint128_t identifier;
107  uint128_t version;
108 };
109 
110 inline std::ostream& operator<<(std::ostream& os, const ObjectVersion& ov)
111 {
112  return os << "id " << ov.identifier << " v" << ov.version;
113 }
114 }
115 
116 namespace std
117 {
119 template <>
120 struct hash<co::ObjectVersion>
121 {
122  template <typename P>
123  size_t operator()(const P& key) const
124  {
125  return hash<uint64_t>()(hash_value(key.version) ^
126  hash_value(key.identifier));
127  }
128 };
129 }
130 #endif // CO_OBJECT_H
Defines export visibility macros for library Collage.
A distributed object.
Definition: object.h:47
bool operator!=(const ObjectVersion &value) const
Definition: objectVersion.h:77
STL namespace.
CO_API ObjectVersion()
Construct a new, zero-initialized object version.
A helper struct bundling an object identifier and version.
Definition: objectVersion.h:46
CO_API ObjectVersion & operator=(const Object *object)
Assign a new identifier and version.
bool operator!() const
uint128_t identifier
the object identifier
Object-oriented network library.
Definition: barrier.h:27
bool operator==(const ObjectVersion &value) const
Definition: objectVersion.h:71
ObjectVersion(lunchbox::RefPtr< R > object)
Construct a new object version.
Definition: objectVersion.h:62
uint128_t version
the object version
bool operator<(const ObjectVersion &rhs) const
<
Definition: objectVersion.h:82
bool operator>(const ObjectVersion &rhs) const
<
Definition: objectVersion.h:88
static const uint128_t VERSION_NONE(0, 0)
Special object version values.