switch to uuid as range id
This commit is contained in:
parent
25b5c13608
commit
b3d1ced728
7 changed files with 130 additions and 11 deletions
|
@ -24,6 +24,7 @@
|
||||||
#include "dtype.h"
|
#include "dtype.h"
|
||||||
#include "isq.h"
|
#include "isq.h"
|
||||||
#include "iter.h"
|
#include "iter.h"
|
||||||
|
#include "uuid.h"
|
||||||
|
|
||||||
#include "base.cc.h"
|
#include "base.cc.h"
|
||||||
|
|
||||||
|
|
50
src/include/base/uuid.h
Normal file
50
src/include/base/uuid.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
#ifndef __cxz_uuid_h__
|
||||||
|
#define __cxz_uuid_h__
|
||||||
|
|
||||||
|
//#include <cstdlib>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
struct Uuid
|
||||||
|
{
|
||||||
|
uint64_t i1;
|
||||||
|
uint64_t i2;
|
||||||
|
};
|
||||||
|
|
||||||
|
Uuid mkUuid();
|
||||||
|
|
||||||
|
inline bool operator==(const Uuid& a, const Uuid& b)
|
||||||
|
{
|
||||||
|
return a.i1 == b.i1 and a.i2 == b.i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator!=(const Uuid& a, const Uuid& b)
|
||||||
|
{
|
||||||
|
return a.i1 != b.i1 or a.i2 != b.i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator<(const Uuid& a, const Uuid& b)
|
||||||
|
{
|
||||||
|
return (a.i1 == b.i1) ? a.i2 < b.i2 : a.i1 < b.i1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator>(const Uuid& a, const Uuid& b)
|
||||||
|
{
|
||||||
|
return (a.i1 == b.i1) ? a.i2 > b.i2 : a.i1 > b.i1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator<=(const Uuid& a, const Uuid& b)
|
||||||
|
{
|
||||||
|
return not( (a.i1 == b.i1) ? a.i2 > b.i2 : a.i1 > b.i1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator>=(const Uuid& a, const Uuid& b)
|
||||||
|
{
|
||||||
|
return not( (a.i1 == b.i1) ? a.i2 < b.i2 : a.i1 < b.i1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -24,15 +24,15 @@ namespace CNORXZ
|
||||||
|
|
||||||
virtual void make() = 0;
|
virtual void make() = 0;
|
||||||
|
|
||||||
RangePtr fromCreated(const TypeInfo& info, const Vector<PtrId>& rids) const;
|
RangePtr fromCreated(const TypeInfo& info, const Vector<Uuid>& rids) const;
|
||||||
void addToCreated(const TypeInfo& info, const Vector<PtrId>& rids, const RangePtr& r);
|
void addToCreated(const TypeInfo& info, const Vector<Uuid>& rids, const RangePtr& r);
|
||||||
|
|
||||||
RangePtr mProd;
|
RangePtr mProd;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// also add single ranges here (PtrId -> own)
|
// also add single ranges here (PtrId -> own)
|
||||||
// rangeCast: PtrId -> original Range
|
// rangeCast: PtrId -> original Range
|
||||||
static Map<SizeT,Map<Vector<PtrId>,RangePtr>> sCreated;
|
static Map<SizeT,Map<Vector<Uuid>,RangePtr>> sCreated;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ namespace CNORXZ
|
||||||
bool operator==(const RangeBase& in) const;
|
bool operator==(const RangeBase& in) const;
|
||||||
bool operator!=(const RangeBase& in) const;
|
bool operator!=(const RangeBase& in) const;
|
||||||
|
|
||||||
PtrId id() const;
|
Uuid id() const;
|
||||||
DIndex begin() const;
|
DIndex begin() const;
|
||||||
DIndex end() const;
|
DIndex end() const;
|
||||||
RangePtr orig() const;
|
RangePtr orig() const;
|
||||||
|
@ -67,9 +67,10 @@ namespace CNORXZ
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
RangeBase() = default;
|
RangeBase();
|
||||||
RangeBase(const RangePtr& rel);
|
RangeBase(const RangePtr& rel);
|
||||||
// delete copy/move???
|
// delete copy/move???
|
||||||
|
Uuid mId = {0,0};
|
||||||
Wptr<RangeBase> mThis;
|
Wptr<RangeBase> mThis;
|
||||||
RangePtr mRel; // used, if created from another range, to point on it
|
RangePtr mRel; // used, if created from another range, to point on it
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
set(libcnorxz_a_SOURCES
|
set(libcnorxz_a_SOURCES
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/base/to_string.cc
|
${CMAKE_SOURCE_DIR}/src/lib/base/to_string.cc
|
||||||
|
${CMAKE_SOURCE_DIR}/src/lib/base/uuid.cc
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/memory/memcount.cc
|
${CMAKE_SOURCE_DIR}/src/lib/memory/memcount.cc
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/ranges/range_base.cc
|
${CMAKE_SOURCE_DIR}/src/lib/ranges/range_base.cc
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/ranges/yrange.cc
|
${CMAKE_SOURCE_DIR}/src/lib/ranges/yrange.cc
|
||||||
|
|
60
src/lib/base/uuid.cc
Normal file
60
src/lib/base/uuid.cc
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include <ctime>
|
||||||
|
#include <chrono>
|
||||||
|
#include "base/uuid.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
|
||||||
|
constexpr std::tm mkTRef()
|
||||||
|
{
|
||||||
|
std::tm o = {};
|
||||||
|
o.tm_sec = 0;
|
||||||
|
o.tm_min = 0;
|
||||||
|
o.tm_hour = 0;
|
||||||
|
o.tm_mday = 1;
|
||||||
|
o.tm_mon = 0;
|
||||||
|
o.tm_year = 70;
|
||||||
|
o.tm_wday = 4;
|
||||||
|
o.tm_yday = 0;
|
||||||
|
o.tm_isdst = 0;
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the node bits are created randomly (no search for mac or similar)
|
||||||
|
Uuid mkUuid()
|
||||||
|
{
|
||||||
|
static constexpr uint64_t diff_1970_1582_ns =
|
||||||
|
141427ull * 86400ull * 1000ull * 1000ull * 1000ull;
|
||||||
|
static std::tm tref_1970 = mkTRef();
|
||||||
|
static uint16_t version = 1;
|
||||||
|
std::tm tref_1970_tmp = tref_1970;
|
||||||
|
const auto ref = std::chrono::system_clock::from_time_t(std::mktime(&tref_1970_tmp));
|
||||||
|
const auto now = std::chrono::system_clock::now();
|
||||||
|
const uint64_t diff_ns = std::chrono::duration_cast<std::chrono::duration<uint64_t,std::nano>>
|
||||||
|
(now - ref).count() + diff_1970_1582_ns;
|
||||||
|
|
||||||
|
// following nomenclature of wikipedia
|
||||||
|
const uint32_t time_low = diff_ns & 0xffffffff;
|
||||||
|
const uint16_t time_mid = (diff_ns >> 32) & 0xffff;
|
||||||
|
const uint16_t time_hi_and_version = ((diff_ns >> 48) & 0x0fff) | ( version << 12 );
|
||||||
|
const uint8_t clock_seq_high_and_reserved = ((diff_ns >> 8) & 0x3f) | ( 0x02 << 6 );
|
||||||
|
const uint8_t clock_seq_low = diff_ns & 0xff;
|
||||||
|
|
||||||
|
static std::mt19937_64 gen {diff_ns};
|
||||||
|
const uint64_t node = gen();
|
||||||
|
|
||||||
|
const Uuid id =
|
||||||
|
{ ( static_cast<uint64_t>(time_low) << 32 ) |
|
||||||
|
( static_cast<uint64_t>(time_mid) << 16 ) |
|
||||||
|
( static_cast<uint64_t>(time_hi_and_version) ),
|
||||||
|
( static_cast<uint64_t>(clock_seq_high_and_reserved) << 56 ) |
|
||||||
|
( static_cast<uint64_t>(clock_seq_low) << 48 ) |
|
||||||
|
( node & 0xffffffffffff )
|
||||||
|
};
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ namespace CNORXZ
|
||||||
* RangeFactoryBase *
|
* RangeFactoryBase *
|
||||||
*************************/
|
*************************/
|
||||||
|
|
||||||
Map<SizeT,Map<Vector<PtrId>,RangePtr>> RangeFactoryBase::sCreated;
|
Map<SizeT,Map<Vector<Uuid>,RangePtr>> RangeFactoryBase::sCreated;
|
||||||
|
|
||||||
RangePtr RangeFactoryBase::create()
|
RangePtr RangeFactoryBase::create()
|
||||||
{
|
{
|
||||||
|
@ -19,7 +19,7 @@ namespace CNORXZ
|
||||||
return mProd;
|
return mProd;
|
||||||
}
|
}
|
||||||
|
|
||||||
RangePtr RangeFactoryBase::fromCreated(const TypeInfo& info, const Vector<PtrId>& rids) const
|
RangePtr RangeFactoryBase::fromCreated(const TypeInfo& info, const Vector<Uuid>& rids) const
|
||||||
{
|
{
|
||||||
RangePtr out = nullptr;
|
RangePtr out = nullptr;
|
||||||
if(sCreated.count(info.hash_code()) != 0){
|
if(sCreated.count(info.hash_code()) != 0){
|
||||||
|
@ -30,7 +30,7 @@ namespace CNORXZ
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RangeFactoryBase::addToCreated(const TypeInfo& info, const Vector<PtrId>& rids, const RangePtr& r)
|
void RangeFactoryBase::addToCreated(const TypeInfo& info, const Vector<Uuid>& rids, const RangePtr& r)
|
||||||
{
|
{
|
||||||
sCreated[info.hash_code()][rids] = r;
|
sCreated[info.hash_code()][rids] = r;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,11 @@ namespace CNORXZ
|
||||||
* RangeBase *
|
* RangeBase *
|
||||||
******************/
|
******************/
|
||||||
|
|
||||||
|
RangeBase::RangeBase()
|
||||||
|
{
|
||||||
|
mId = mkUuid();
|
||||||
|
}
|
||||||
|
|
||||||
RangePtr RangeBase::sub(SizeT num) const
|
RangePtr RangeBase::sub(SizeT num) const
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -54,9 +59,10 @@ namespace CNORXZ
|
||||||
return this != ∈
|
return this != ∈
|
||||||
}
|
}
|
||||||
|
|
||||||
PtrId RangeBase::id() const
|
Uuid RangeBase::id() const
|
||||||
{
|
{
|
||||||
return reinterpret_cast<PtrId>(this);
|
//return reinterpret_cast<PtrId>(this);
|
||||||
|
return mId;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIndex RangeBase::begin() const
|
DIndex RangeBase::begin() const
|
||||||
|
|
|
@ -425,7 +425,7 @@ namespace CNORXZ
|
||||||
|
|
||||||
void YRangeFactory::make()
|
void YRangeFactory::make()
|
||||||
{
|
{
|
||||||
Vector<PtrId> key(mRVec.size());
|
Vector<Uuid> key(mRVec.size());
|
||||||
std::transform(mRVec.begin(), mRVec.end(), key.begin(),
|
std::transform(mRVec.begin(), mRVec.end(), key.begin(),
|
||||||
[&](const RangePtr& r) { return r->id(); } );
|
[&](const RangePtr& r) { return r->id(); } );
|
||||||
mProd = this->fromCreated(typeid(YRange), key);
|
mProd = this->fromCreated(typeid(YRange), key);
|
||||||
|
|
Loading…
Reference in a new issue