diff --git a/CMakeLists.txt b/CMakeLists.txt index e07f3b2..9f6143b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,9 @@ add_library(solanaceae_util ./solanaceae/util/utils.hpp ./solanaceae/util/utils.cpp + ./solanaceae/util/uuid_generator.hpp + ./solanaceae/util/uuid_generator.cpp + ./solanaceae/util/config_model.hpp ./solanaceae/util/config_model.inl diff --git a/solanaceae/util/uuid_generator.cpp b/solanaceae/util/uuid_generator.cpp new file mode 100644 index 0000000..cc07985 --- /dev/null +++ b/solanaceae/util/uuid_generator.cpp @@ -0,0 +1,68 @@ +#include "./uuid_generator.hpp" + +UUIDGenerator_128_128::UUIDGenerator_128_128(void) { + { // random namespace + const auto num0 = _rng(); + const auto num1 = _rng(); + const auto num2 = _rng(); + const auto num3 = _rng(); + + _uuid_namespace[0+0] = (num0 >> 0) & 0xff; + _uuid_namespace[0+1] = (num0 >> 8) & 0xff; + _uuid_namespace[0+2] = (num0 >> 16) & 0xff; + _uuid_namespace[0+3] = (num0 >> 24) & 0xff; + + _uuid_namespace[4+0] = (num1 >> 0) & 0xff; + _uuid_namespace[4+1] = (num1 >> 8) & 0xff; + _uuid_namespace[4+2] = (num1 >> 16) & 0xff; + _uuid_namespace[4+3] = (num1 >> 24) & 0xff; + + _uuid_namespace[8+0] = (num2 >> 0) & 0xff; + _uuid_namespace[8+1] = (num2 >> 8) & 0xff; + _uuid_namespace[8+2] = (num2 >> 16) & 0xff; + _uuid_namespace[8+3] = (num2 >> 24) & 0xff; + + _uuid_namespace[12+0] = (num3 >> 0) & 0xff; + _uuid_namespace[12+1] = (num3 >> 8) & 0xff; + _uuid_namespace[12+2] = (num3 >> 16) & 0xff; + _uuid_namespace[12+3] = (num3 >> 24) & 0xff; + } +} + +UUIDGenerator_128_128::UUIDGenerator_128_128(const std::array& uuid_namespace) : + _uuid_namespace(uuid_namespace) +{ +} + +std::vector UUIDGenerator_128_128::operator()(void) { + std::vector new_uid(_uuid_namespace.cbegin(), _uuid_namespace.cend()); + new_uid.resize(new_uid.size() + 16); + + const auto num0 = _rng(); + const auto num1 = _rng(); + const auto num2 = _rng(); + const auto num3 = _rng(); + + new_uid[_uuid_namespace.size()+0] = (num0 >> 0) & 0xff; + new_uid[_uuid_namespace.size()+1] = (num0 >> 8) & 0xff; + new_uid[_uuid_namespace.size()+2] = (num0 >> 16) & 0xff; + new_uid[_uuid_namespace.size()+3] = (num0 >> 24) & 0xff; + + new_uid[_uuid_namespace.size()+4+0] = (num1 >> 0) & 0xff; + new_uid[_uuid_namespace.size()+4+1] = (num1 >> 8) & 0xff; + new_uid[_uuid_namespace.size()+4+2] = (num1 >> 16) & 0xff; + new_uid[_uuid_namespace.size()+4+3] = (num1 >> 24) & 0xff; + + new_uid[_uuid_namespace.size()+8+0] = (num2 >> 0) & 0xff; + new_uid[_uuid_namespace.size()+8+1] = (num2 >> 8) & 0xff; + new_uid[_uuid_namespace.size()+8+2] = (num2 >> 16) & 0xff; + new_uid[_uuid_namespace.size()+8+3] = (num2 >> 24) & 0xff; + + new_uid[_uuid_namespace.size()+12+0] = (num3 >> 0) & 0xff; + new_uid[_uuid_namespace.size()+12+1] = (num3 >> 8) & 0xff; + new_uid[_uuid_namespace.size()+12+2] = (num3 >> 16) & 0xff; + new_uid[_uuid_namespace.size()+12+3] = (num3 >> 24) & 0xff; + + return new_uid; +} + diff --git a/solanaceae/util/uuid_generator.hpp b/solanaceae/util/uuid_generator.hpp new file mode 100644 index 0000000..b0a1f99 --- /dev/null +++ b/solanaceae/util/uuid_generator.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include +#include + +struct UUIDGeneratorI { + virtual std::vector operator()(void) = 0; +}; + +// TODO: templates? +struct UUIDGenerator_128_128 final : public UUIDGeneratorI { + private: + std::array _uuid_namespace; + std::minstd_rand _rng{std::random_device{}()}; + + public: + UUIDGenerator_128_128(void); // default randomly initializes namespace + UUIDGenerator_128_128(const std::array& uuid_namespace); + + std::vector operator()(void) override; +}; +