File Coverage

/usr/local/lib/perl5/site_perl/5.26.1/x86_64-linux/CPP/Boost/Mini.x/i/boost/uuid/basic_name_generator.hpp
Criterion Covered Total %
statement 24 24 100.0
branch 7 12 58.3
condition n/a
subroutine n/a
pod n/a
total 31 36 86.1


line stmt bran cond sub pod time code
1             // Boost basic_name_generator.hpp header file -----------------------//
2              
3             // Copyright 2010 Andy Tompkins.
4             // Copyright 2017 James E. King III
5              
6             // Distributed under the Boost Software License, Version 1.0. (See
7             // accompanying file LICENSE_1_0.txt or copy at
8             // http://www.boost.org/LICENSE_1_0.txt)
9              
10             #ifndef BOOST_UUID_BASIC_NAME_GENERATOR_HPP
11             #define BOOST_UUID_BASIC_NAME_GENERATOR_HPP
12              
13             #include
14             #include
15             #include
16             #include
17             #include // for strlen, wcslen
18             #include
19              
20             #ifdef BOOST_HAS_PRAGMA_ONCE
21             #pragma once
22             #endif
23              
24             #ifdef BOOST_NO_STDC_NAMESPACE
25             namespace std {
26             using ::size_t;
27             using ::strlen;
28             using ::wcslen;
29             } //namespace std
30             #endif //BOOST_NO_STDC_NAMESPACE
31              
32             namespace boost {
33             namespace uuids {
34              
35             //! \brief Generate a name based UUID using
36             //! the provided hashing algorithm that
37             //! implements the NameHashProvider concept.
38             template
39             class basic_name_generator
40             {
41             public:
42             typedef uuid result_type;
43             typedef typename HashAlgo::digest_type digest_type;
44              
45 2           explicit basic_name_generator(uuid const& namespace_uuid_)
46 2           : namespace_uuid(namespace_uuid_)
47 2           {}
48              
49             uuid operator()(const char* name) const {
50             HashAlgo hash;
51             hash.process_bytes(namespace_uuid.begin(), namespace_uuid.size());
52             process_characters(hash, name, std::strlen(name));
53             return hash_to_uuid(hash);
54             }
55              
56             uuid operator()(const wchar_t* name) const {
57             HashAlgo hash;
58             hash.process_bytes(namespace_uuid.begin(), namespace_uuid.size());
59             process_characters(hash, name, std::wcslen(name));
60             return hash_to_uuid(hash);
61             }
62              
63             template
64 2           uuid operator()(std::basic_string const& name) const {
65 2 50         HashAlgo hash;
66 2 50         hash.process_bytes(namespace_uuid.begin(), namespace_uuid.size());
67 2 50         process_characters(hash, name.c_str(), name.length());
68 2 50         return hash_to_uuid(hash);
69             }
70              
71             uuid operator()(void const* buffer, std::size_t byte_count) const {
72             HashAlgo hash;
73             hash.process_bytes(namespace_uuid.begin(), namespace_uuid.size());
74             hash.process_bytes(buffer, byte_count);
75             return hash_to_uuid(hash);
76             };
77              
78             private:
79             // we convert all characters to uint32_t so that each
80             // character is 4 bytes regardless of sizeof(char) or
81             // sizeof(wchar_t). We want the name string on any
82             // platform / compiler to generate the same uuid
83             // except for char
84             template
85             void process_characters(HashAlgo& hash, char_type const*const characters, std::size_t count) const {
86             BOOST_STATIC_ASSERT(sizeof(uint32_t) >= sizeof(char_type));
87              
88             for (std::size_t i=0; i
89             std::size_t c = characters[i];
90             hash.process_byte(static_cast((c >> 0) & 0xFF));
91             hash.process_byte(static_cast((c >> 8) & 0xFF));
92             hash.process_byte(static_cast((c >> 16) & 0xFF));
93             hash.process_byte(static_cast((c >> 24) & 0xFF));
94             }
95             }
96              
97 2           void process_characters(HashAlgo& hash, char const*const characters, std::size_t count) const {
98 2           hash.process_bytes(characters, count);
99 2           }
100              
101 2           uuid hash_to_uuid(HashAlgo& hash) const
102             {
103             digest_type digest;
104 2 50         hash.get_digest(digest);
105              
106             BOOST_STATIC_ASSERT(sizeof(digest_type) >= 16);
107              
108             uuid u;
109 10 100         for (int i=0; i<4; ++i) {
110 8           *(u.begin() + i*4+0) = static_cast((digest[i] >> 24) & 0xFF);
111 8           *(u.begin() + i*4+1) = static_cast((digest[i] >> 16) & 0xFF);
112 8           *(u.begin() + i*4+2) = static_cast((digest[i] >> 8) & 0xFF);
113 8           *(u.begin() + i*4+3) = static_cast((digest[i] >> 0) & 0xFF);
114             }
115              
116             // set variant: must be 0b10xxxxxx
117 2           *(u.begin()+8) &= 0xBF;
118 2           *(u.begin()+8) |= 0x80;
119              
120             // set version
121 2           unsigned char hashver = hash.get_version();
122 2           *(u.begin()+6) &= 0x0F; // clear out the relevant bits
123 2           *(u.begin()+6) |= (hashver << 4); // and apply them
124              
125 2           return u;
126             }
127              
128             private:
129             uuid namespace_uuid;
130             };
131              
132             namespace ns {
133              
134             BOOST_FORCEINLINE uuid dns() {
135             uuid result = {{
136             0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1 ,
137             0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 }};
138             return result;
139             }
140              
141             BOOST_FORCEINLINE uuid url() {
142             uuid result = {{
143             0x6b, 0xa7, 0xb8, 0x11, 0x9d, 0xad, 0x11, 0xd1 ,
144             0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 }};
145             return result;
146             }
147              
148             BOOST_FORCEINLINE uuid oid() {
149             uuid result = {{
150             0x6b, 0xa7, 0xb8, 0x12, 0x9d, 0xad, 0x11, 0xd1 ,
151             0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 }};
152             return result;
153             }
154              
155             BOOST_FORCEINLINE uuid x500dn() {
156             uuid result = {{
157             0x6b, 0xa7, 0xb8, 0x14, 0x9d, 0xad, 0x11, 0xd1 ,
158             0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 }};
159             return result;
160             }
161              
162             } // ns
163             } // uuids
164             } // boost
165              
166             #endif // BOOST_UUID_BASIC_NAME_GENERATOR_HPP