TablePrefixSum 32/64 bit decision

This commit is contained in:
Joachim Schoeberl 2025-01-08 08:25:12 +01:00
parent 0a1fd5a2e2
commit dcd6f6d60d
3 changed files with 24 additions and 3 deletions

View File

@ -62,9 +62,9 @@ namespace ngcore
return index;
}
NGCORE_API size_t * TablePrefixSum32 (FlatArray<unsigned int> entrysize)
NGCORE_API size_t * TablePrefixSum32 (FlatArray<uint32_t> entrysize)
{ return TablePrefixSum2 (entrysize); }
NGCORE_API size_t * TablePrefixSum64 (FlatArray<size_t> entrysize)
NGCORE_API size_t * TablePrefixSum64 (FlatArray<uint64_t> entrysize)
{ return TablePrefixSum2 (entrysize); }
/*

View File

@ -94,6 +94,7 @@ namespace ngcore
Iterator end() const { return Iterator(*this, BASE+size); }
};
/*
NGCORE_API extern size_t * TablePrefixSum32 (FlatArray<unsigned int> entrysize);
NGCORE_API extern size_t * TablePrefixSum64 (FlatArray<size_t> entrysize);
@ -106,7 +107,20 @@ namespace ngcore
{ return TablePrefixSum32 (FlatArray<unsigned> (entrysize.Size(), (unsigned int*)(std::atomic<int>*)entrysize.Addr(0))); }
NETGEN_INLINE size_t * TablePrefixSum (FlatArray<size_t> entrysize)
{ return TablePrefixSum64 (entrysize); }
*/
NGCORE_API extern size_t * TablePrefixSum32 (FlatArray<uint32_t> entrysize);
NGCORE_API extern size_t * TablePrefixSum64 (FlatArray<uint64_t> entrysize);
template <typename T> // TODO: enable_if T is integral
NETGEN_INLINE size_t * TablePrefixSum (FlatArray<T> entrysize)
{
if constexpr (sizeof(T) == 4)
return TablePrefixSum32 ( { entrysize.Size(), (uint32_t*)(void*)entrysize.Addr(0) });
else
return TablePrefixSum64 ( { entrysize.Size(), (uint64_t*)(void*)entrysize.Addr(0) });
}
/**
A compact Table container.

View File

@ -138,6 +138,8 @@ namespace netgen
class t_invalid { public: constexpr t_invalid() = default; };
static constexpr t_invalid INVALID{};
typedef decltype( declval<T>()-declval<T>() ) T_diff;
public:
constexpr Index () = default;
@ -182,11 +184,16 @@ namespace netgen
TIndex operator-- (int) { TIndex hi(*this); i--; return hi; }
TIndex & operator++ () { i++; return static_cast<TIndex&>(*this); }
TIndex & operator-- () { i--; return static_cast<TIndex&>(*this); }
/*
constexpr TIndex operator+= (int add) { i += add; return TIndex{*this}; }
constexpr TIndex operator+= (size_t add) { i += add; return TIndex{*this}; }
constexpr TIndex operator-= (int add) { i -= add; return TIndex{*this}; }
constexpr TIndex operator-= (size_t add) { i -= add; return TIndex{*this}; }
*/
constexpr TIndex operator+= (T_diff add) { i += add; return TIndex{*this}; }
constexpr TIndex operator-= (T_diff add) { i -= add; return TIndex{*this}; }
constexpr auto operator- (Index i2) const { return i-i2.i; }
// bool operator== (Index i2) const { return i==i2.i; }