[util] Improve util::counted usage as a bool

I often want to use util::counted as a bool, like with a regular
pointer. There was some basic support for that, but it didn't cover
every case - now it should.
This commit is contained in:
Justin C. Miller
2023-02-06 01:16:26 -08:00
parent 359ee035d8
commit 9297017688

View File

@@ -12,8 +12,8 @@ namespace util {
template <typename T>
struct counted
{
T *pointer;
size_t count;
T *pointer = nullptr;
size_t count = 0;
/// Index this object as an array of type T
inline T & operator [] (int i) { return pointer[i]; }
@@ -21,6 +21,9 @@ struct counted
/// Index this object as a const array of type T
inline const T & operator [] (int i) const { return pointer[i]; }
operator bool() const { return pointer != nullptr; }
bool operator!() const { return pointer == nullptr; }
using iterator = offset_iterator<T>;
using const_iterator = const_offset_iterator<T>;
@@ -63,14 +66,17 @@ struct counted
template <>
struct counted<const void>
{
const void *pointer;
size_t count;
const void *pointer = nullptr;
size_t count = 0;
template <typename T>
static inline counted<const void> from(T *p, size_t c) {
return {reinterpret_cast<const void*>(p), c};
}
operator bool() const { return pointer != nullptr; }
bool operator!() const { return pointer == nullptr; }
/// Return a counted<T> advanced by N items
inline counted<const void> operator+(size_t i) {
counted<const void> other = *this;
@@ -98,8 +104,8 @@ struct counted<const void>
template <>
struct counted<void>
{
void *pointer;
size_t count;
void *pointer = nullptr;
size_t count = 0;
template <typename T>
static inline counted<void> from(T *p, size_t c) {
@@ -108,6 +114,9 @@ struct counted<void>
operator counted<const void>() const { return {pointer, count}; }
operator bool() const { return pointer != nullptr; }
bool operator!() const { return pointer == nullptr; }
/// Return a counted<T> advanced by N items
inline counted<void> operator+(size_t i) {
counted<void> other = *this;