28#include <boost/random/mersenne_twister.hpp>
29#include <boost/uuid/uuid_generators.hpp>
30#include <boost/uuid/uuid_io.hpp>
32#if BOOST_VERSION >= 106700
33#include <boost/uuid/entropy_error.hpp>
36#include <nlohmann/json.hpp>
50static boost::mt19937
rng;
76#if BOOST_VERSION >= 106700
87 std::lock_guard<std::mutex> lock(
rng_mutex );
91#if BOOST_VERSION >= 106700
93 catch(
const boost::uuids::entropy_error& )
95 wxLogFatalError(
"A Boost UUID entropy exception was thrown in %s:%s.",
96 __FILE__, __FUNCTION__ );
105 wxASSERT( null == 0 );
112 if( aString.length() == 8
113 && std::all_of( aString.begin(), aString.end(),
114 [](
unsigned char c )
116 return std::isxdigit( c );
122 for(
int i = 0; i < 4; ++i )
124 std::string octet = aString.substr( i * 2, 2 );
125 m_uuid.data[i + 12] = strtol( octet.data(),
nullptr, 16 );
138#if BOOST_VERSION >= 106700
145#if BOOST_VERSION >= 106700
147 catch(
const boost::uuids::entropy_error& )
149 wxLogFatalError(
"A Boost UUID entropy exception was thrown in %s:%s.",
150 __FILE__, __FUNCTION__ );
165 KIID(
std::string( aString.ToUTF8() ) )
174 if( aCandidate.Length() != niluuidStr.Length() )
177 for( wxChar c : aCandidate )
179 if( c >=
'0' && c <=
'9' )
182 if( c >=
'a' && c <=
'f' )
185 if( c >=
'A' && c <=
'F' )
200 m_uuid.data[12] =
static_cast<uint8_t
>( aTimestamp >> 24 );
201 m_uuid.data[13] =
static_cast<uint8_t
>( aTimestamp >> 16 );
202 m_uuid.data[14] =
static_cast<uint8_t
>( aTimestamp >> 8 );
203 m_uuid.data[15] =
static_cast<uint8_t
>( aTimestamp );
217 ret |=
m_uuid.data[12] << 24;
218 ret |=
m_uuid.data[13] << 16;
219 ret |=
m_uuid.data[14] << 8;
228 return boost::uuids::hash_value(
m_uuid );
240 return boost::uuids::to_string(
m_uuid );
246 return boost::uuids::to_string(
m_uuid );
270 for(
int i = 15; i >= 0; --i )
295 for(
const wxString& pathStep : wxSplit( aString,
'/' ) )
297 if( !pathStep.empty() )
298 emplace_back(
KIID( pathStep ) );
308 if( aPath.size() >
copy.size() )
311 for(
size_t i = 0; i < aPath.size(); ++i )
313 if(
copy.at( i ) != aPath.at( i ) )
320 for(
size_t i = aPath.size(); i <
copy.size(); ++i )
321 push_back(
copy.at( i ) );
329 if( aPath.size() > size() )
335 while( !copyThat.empty() )
337 if( *std::prev( copyThis.end() ) != *std::prev( copyThat.end() ) )
352 for(
const KIID& pathStep : *
this )
367 aKIID =
KIID( aJson.get<std::string>() );
bool EndsWith(const KIID_PATH &aPath) const
Test if aPath from the last path towards the first path.
bool MakeRelativeTo(const KIID_PATH &aPath)
wxString AsString() const
static void SeedGenerator(unsigned int aSeed)
Re-initialize the UUID generator with a given seed (for testing or QA purposes)
wxString AsString() const
boost::uuids::uuid m_uuid
void Increment()
Generates a deterministic replacement for a given ID.
std::string AsStdString() const
wxString AsLegacyTimestampString() const
timestamp_t AsLegacyTimestamp() const
static void CreateNilUuids(bool aNil=true)
A performance optimization which disables/enables the generation of pseudo-random UUIDs.
static bool SniffTest(const wxString &aCandidate)
Returns true if a string has the correct formatting to be a KIID.
void Clone(const KIID &aUUID)
bool IsLegacyTimestamp() const
void ConvertTimestampToUuid()
Change an existing time stamp based UUID into a true UUID.
static boost::uuids::nil_generator nilGenerator
static bool g_createNilUuids
static std::mutex rng_mutex
static boost::mt19937 rng
void from_json(const nlohmann::json &aJson, KIID &aKIID)
static boost::uuids::string_generator stringGenerator
static boost::uuids::basic_random_generator< boost::mt19937 > randomGenerator
void to_json(nlohmann::json &aJson, const KIID &aKIID)
KICOMMON_API KIID niluuid
uint32_t timestamp_t
timestamp_t is our type to represent unique IDs for all kinds of elements; historically simply the ti...