]> git.proxmox.com Git - ceph.git/blob - ceph/src/include/uuid.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / include / uuid.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 #ifndef _CEPH_UUID_H
3 #define _CEPH_UUID_H
4
5 /*
6 * Thin C++ wrapper around libuuid.
7 */
8
9 #include "encoding.h"
10 #include "random.h"
11
12 #include <ostream>
13 #include <random>
14
15 #include <boost/uuid/uuid.hpp>
16 #include <boost/uuid/uuid_generators.hpp>
17 #include <boost/uuid/uuid_io.hpp>
18
19 namespace ceph {
20 class Formatter;
21 }
22
23 struct uuid_d {
24 boost::uuids::uuid uuid;
25
26 uuid_d() {
27 boost::uuids::nil_generator gen;
28 uuid = gen();
29 }
30
31 bool is_zero() const {
32 return uuid.is_nil();
33 }
34
35 void generate_random() {
36 random_device_t rng;
37 boost::uuids::basic_random_generator gen(rng);
38 uuid = gen();
39 }
40
41 bool parse(const char *s) {
42 try {
43 boost::uuids::string_generator gen;
44 uuid = gen(s);
45 return true;
46 } catch (std::runtime_error& e) {
47 return false;
48 }
49 }
50 void print(char *s) const {
51 memcpy(s, boost::uuids::to_string(uuid).c_str(), 37);
52 }
53
54 std::string to_string() const {
55 return boost::uuids::to_string(uuid);
56 }
57
58 const char *bytes() const {
59 return (const char*)uuid.data;
60 }
61
62 void encode(::ceph::buffer::list::contiguous_appender& p) const {
63 p.append(reinterpret_cast<const char *>(&uuid), sizeof(uuid));
64 }
65
66 void bound_encode(size_t& p) const {
67 p += sizeof(uuid);
68 }
69
70 void decode(::ceph::buffer::ptr::const_iterator& p) {
71 assert((p.get_end() - p.get_pos()) >= (int)sizeof(*this));
72 memcpy((char *)this, p.get_pos_add(sizeof(*this)), sizeof(*this));
73 }
74
75 void dump(ceph::Formatter *f) const;
76 static void generate_test_instances(std::list<uuid_d*>& o);
77 };
78 WRITE_CLASS_DENC_BOUNDED(uuid_d)
79
80 inline std::ostream& operator<<(std::ostream& out, const uuid_d& u) {
81 char b[37];
82 u.print(b);
83 return out << b;
84 }
85
86 inline bool operator==(const uuid_d& l, const uuid_d& r) {
87 return l.uuid == r.uuid;
88 }
89 inline bool operator!=(const uuid_d& l, const uuid_d& r) {
90 return l.uuid != r.uuid;
91 }
92 inline bool operator<(const uuid_d& l, const uuid_d& r) {
93 return l.to_string() < r.to_string();
94 }
95
96
97 #endif