[ox/std] Add UUID implementation
This commit is contained in:
		
							
								
								
									
										2
									
								
								deps/ox/src/ox/std/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								deps/ox/src/ox/std/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							| @@ -37,6 +37,7 @@ add_library( | |||||||
| 		strops.cpp | 		strops.cpp | ||||||
| 		trace.cpp | 		trace.cpp | ||||||
| 		typetraits.cpp | 		typetraits.cpp | ||||||
|  | 		uuid.cpp | ||||||
| ) | ) | ||||||
|  |  | ||||||
| if(NOT MSVC) | if(NOT MSVC) | ||||||
| @@ -109,6 +110,7 @@ install( | |||||||
| 		types.hpp | 		types.hpp | ||||||
| 		typetraits.hpp | 		typetraits.hpp | ||||||
| 		units.hpp | 		units.hpp | ||||||
|  | 		uuid.hpp | ||||||
| 		vector.hpp | 		vector.hpp | ||||||
| 		writer.hpp | 		writer.hpp | ||||||
| 	DESTINATION | 	DESTINATION | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								deps/ox/src/ox/std/random.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								deps/ox/src/ox/std/random.cpp
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * Copyright 2015 - 2022 gary@drinkingtea.net |  * Copyright 2015 - 2023 gary@drinkingtea.net | ||||||
|  * |  * | ||||||
|  * This Source Code Form is subject to the terms of the Mozilla Public |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								deps/ox/src/ox/std/random.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								deps/ox/src/ox/std/random.hpp
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * Copyright 2015 - 2022 gary@drinkingtea.net |  * Copyright 2015 - 2023 gary@drinkingtea.net | ||||||
|  * |  * | ||||||
|  * This Source Code Form is subject to the terms of the Mozilla Public |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
| @@ -25,12 +25,19 @@ class OX_PACKED Random { | |||||||
|  |  | ||||||
| 		explicit constexpr Random(const RandomSeed &seed) noexcept; | 		explicit constexpr Random(const RandomSeed &seed) noexcept; | ||||||
|  |  | ||||||
|  | 		constexpr void seed(const RandomSeed &seed) noexcept; | ||||||
|  |  | ||||||
| 		constexpr uint64_t gen() noexcept; | 		constexpr uint64_t gen() noexcept; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| constexpr Random::Random(const RandomSeed &seed) noexcept: m_seed{seed[0], seed[1]} { | constexpr Random::Random(const RandomSeed &seed) noexcept: m_seed{seed[0], seed[1]} { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | constexpr void Random::seed(const RandomSeed &seed) noexcept { | ||||||
|  | 	m_seed[0] = seed[0]; | ||||||
|  | 	m_seed[1] = seed[1]; | ||||||
|  | } | ||||||
|  |  | ||||||
| constexpr uint64_t Random::gen() noexcept { | constexpr uint64_t Random::gen() noexcept { | ||||||
| 	auto s0 = m_seed[0]; | 	auto s0 = m_seed[0]; | ||||||
| 	auto s1 = m_seed[1]; | 	auto s1 = m_seed[1]; | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								deps/ox/src/ox/std/std.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								deps/ox/src/ox/std/std.hpp
									
									
									
									
										vendored
									
									
								
							| @@ -42,4 +42,5 @@ | |||||||
| #include "types.hpp" | #include "types.hpp" | ||||||
| #include "typetraits.hpp" | #include "typetraits.hpp" | ||||||
| #include "units.hpp" | #include "units.hpp" | ||||||
|  | #include "uuid.hpp" | ||||||
| #include "vector.hpp" | #include "vector.hpp" | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								deps/ox/src/ox/std/uuid.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								deps/ox/src/ox/std/uuid.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright 2015 - 2023 gary@drinkingtea.net | ||||||
|  |  * | ||||||
|  |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|  |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "uuid.hpp" | ||||||
|  |  | ||||||
|  | namespace ox { | ||||||
|  |  | ||||||
|  | bool UUID::s_seeded = false; | ||||||
|  | Random UUID::s_rand; | ||||||
|  |  | ||||||
|  | void UUID::seed(const RandomSeed &seed) noexcept { | ||||||
|  | 	s_seeded = true; | ||||||
|  | 	s_rand.seed(seed); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UUID v4 | ||||||
|  | Result<UUID> UUID::generate() noexcept { | ||||||
|  | 	if (!s_seeded) { | ||||||
|  | 		return OxError(1, "UUID generator not seeded."); | ||||||
|  | 	} | ||||||
|  | 	UUID out; | ||||||
|  | 	for (auto &v : out.m_value) { | ||||||
|  | 		v = static_cast<uint8_t>(s_rand.gen() % 255); | ||||||
|  | 	} | ||||||
|  | 	out.m_value[6] = 4; | ||||||
|  | 	return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										84
									
								
								deps/ox/src/ox/std/uuid.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								deps/ox/src/ox/std/uuid.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright 2015 - 2023 gary@drinkingtea.net | ||||||
|  |  * | ||||||
|  |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|  |  * file, You can obtain one at https://mozilla.org/MPL/2.0/. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "array.hpp" | ||||||
|  | #include "bstring.hpp" | ||||||
|  | #include "random.hpp" | ||||||
|  | #include "strops.hpp" | ||||||
|  | #include "trace.hpp" | ||||||
|  |  | ||||||
|  | namespace ox { | ||||||
|  |  | ||||||
|  | namespace detail { | ||||||
|  | constexpr ox::BString<2> toHex(uint8_t v) noexcept { | ||||||
|  | 	constexpr ox::Array<char, 16> valMap { | ||||||
|  | 		'0', | ||||||
|  | 		'1', | ||||||
|  | 		'2', | ||||||
|  | 		'3', | ||||||
|  | 		'4', | ||||||
|  | 		'5', | ||||||
|  | 		'6', | ||||||
|  | 		'7', | ||||||
|  | 		'8', | ||||||
|  | 		'9', | ||||||
|  | 		'a', | ||||||
|  | 		'b', | ||||||
|  | 		'c', | ||||||
|  | 		'd', | ||||||
|  | 		'e', | ||||||
|  | 		'f', | ||||||
|  | 	}; | ||||||
|  | 	ox::Array<char, 3> out; | ||||||
|  | 	out[0] = valMap[static_cast<unsigned>((v & 0xf0) / 0xf)]; | ||||||
|  | 	out[1] = valMap[static_cast<unsigned>(v & 0x0f)]; | ||||||
|  | 	out[2] = 0; | ||||||
|  | 	return out.data(); | ||||||
|  | } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class UUID { | ||||||
|  | 	private: | ||||||
|  | 		static bool s_seeded; | ||||||
|  | 		static Random s_rand; | ||||||
|  | 		ox::Array<uint8_t, 16> m_value; | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		static void seed(const RandomSeed &seed) noexcept; | ||||||
|  |  | ||||||
|  | 		static ox::Result<UUID> generate() noexcept; | ||||||
|  |  | ||||||
|  | 		[[nodiscard]] | ||||||
|  | 		constexpr ox::BString<36> toString() const noexcept { | ||||||
|  | 			ox::BString<36> out; | ||||||
|  | 			auto i = 0u; | ||||||
|  | 			constexpr auto printChars = []( | ||||||
|  | 					ox::BString<36> *out, const Array<uint8_t, 16> &value, std::size_t cnt, unsigned i) { | ||||||
|  | 				for (; i < cnt; ++i) { | ||||||
|  | 					const auto v = value[i]; | ||||||
|  | 					const auto h = detail::toHex(v); | ||||||
|  | 					oxIgnoreError(out->append(h.c_str(), h.len())); | ||||||
|  | 				} | ||||||
|  | 				return i; | ||||||
|  | 			}; | ||||||
|  | 			i = printChars(&out, m_value, 4, i); | ||||||
|  | 			out += "-"; | ||||||
|  | 			i = printChars(&out, m_value, 2, i); | ||||||
|  | 			out += "-"; | ||||||
|  | 			i = printChars(&out, m_value, 2, i); | ||||||
|  | 			out += "-"; | ||||||
|  | 			i = printChars(&out, m_value, 2, i); | ||||||
|  | 			out += "-"; | ||||||
|  | 			i = printChars(&out, m_value, 6, i); | ||||||
|  | 			return out; | ||||||
|  | 		} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user