[*] Remove redundant constructor from UTF8 iterator

[+] Missing members on AuArray
This commit is contained in:
Reece Wilson 2024-09-01 19:43:22 +01:00
parent 52f3ca8026
commit b82d7aa98b
6 changed files with 184 additions and 28 deletions

View File

@ -8,8 +8,6 @@
***/ ***/
#pragma once #pragma once
/* read-only, null terminated, utf-8 *byte* view */ /* read-only, null terminated, utf-8 *byte* view */
struct AuRONString struct AuRONString
{ {

View File

@ -23,8 +23,8 @@ struct AuROString
using const_reference = const char &; using const_reference = const char &;
using const_iterator = const char *; using const_iterator = const char *;
using iterator = char *; using iterator = char *;
using const_reverse_iterator = typename std::reverse_iterator<const char *>; using const_reverse_iterator = AuReverseIterator<const char *>;
using reverse_iterator = typename std::reverse_iterator<char *>; using reverse_iterator = AuReverseIterator<char *>;
using size_type = AuUInt; using size_type = AuUInt;
using difference_type = AuSInt; using difference_type = AuSInt;

View File

@ -8,8 +8,8 @@
#pragma once #pragma once
template<typename Iterator> template<typename Iterator>
constexpr AuReverseIterator<Iterator>::AuReverseIterator(Iterator that) constexpr AuReverseIterator<Iterator>::AuReverseIterator(Iterator that) :
: iterator(AuMove(that)) iterator(AuMove(that))
{ } { }
template<typename Iterator> template<typename Iterator>

View File

@ -30,8 +30,6 @@ struct AuUTF8Iterator
inline AuUTF8Iterator(const AuROString &in, AuUInt uOffset = AuROString::npos); inline AuUTF8Iterator(const AuROString &in, AuUInt uOffset = AuROString::npos);
inline AuUTF8Iterator(const AuROString &in);
cstatic AuUTF8Iterator FromStringView(AuROString in, AuUInt uOffset = AuROString::npos); cstatic AuUTF8Iterator FromStringView(AuROString in, AuUInt uOffset = AuROString::npos);
inline constexpr const char *base() const; inline constexpr const char *base() const;

View File

@ -50,7 +50,7 @@ inline AuUTF8Iterator::AuUTF8Iterator(const char *pStart)
inline AuUTF8Iterator::AuUTF8Iterator(const AuROString &in, AuUInt uOffset) inline AuUTF8Iterator::AuUTF8Iterator(const AuROString &in, AuUInt uOffset)
{ {
this->baseView = in; this->baseView = in;
this->pCurrent = in.Begin(); this->pCurrent = in.Begin();
if (uOffset != AuROString::npos) if (uOffset != AuROString::npos)
{ {
@ -66,12 +66,6 @@ inline AuUTF8Iterator::AuUTF8Iterator(const AuROString &in, AuUInt uOffset)
} }
} }
inline AuUTF8Iterator::AuUTF8Iterator(const AuROString &in)
{
this->baseView = in;
this->pCurrent = in.Begin();
}
AuUTF8Iterator AuUTF8Iterator::FromStringView(AuROString in, AuUInt uOffset) AuUTF8Iterator AuUTF8Iterator::FromStringView(AuROString in, AuUInt uOffset)
{ {
return AuUTF8Iterator(in, uOffset); return AuUTF8Iterator(in, uOffset);
@ -220,7 +214,7 @@ inline constexpr AuUTF8Iterator &AuUTF8Iterator::operator+=(const difference_typ
auto pNext = pBegin + uDiff; auto pNext = pBegin + uDiff;
auto uNext = uLength - uDiff; auto uNext = uLength - uDiff;
for (AU_ITERATE_N(i, offset)) for (AU_ITERATE_N(i, AuUInt(offset)))
{ {
if (auto uCount = AuCodepointsNextLength(AuROString(pNext, uNext))) if (auto uCount = AuCodepointsNextLength(AuROString(pNext, uNext)))
{ {
@ -263,7 +257,7 @@ inline constexpr AuUTF8Iterator &AuUTF8Iterator::operator-=(const difference_typ
return *this; return *this;
} }
for (AU_ITERATE_N(i, offset)) for (AU_ITERATE_N(i, AuUInt(offset)))
{ {
auto uOffset = AuCodepointsFindPreviousValidByteOffsetFromByteOffset(this->baseView, uDiff); auto uOffset = AuCodepointsFindPreviousValidByteOffsetFromByteOffset(this->baseView, uDiff);
if (uOffset != AuString::npos) if (uOffset != AuString::npos)

View File

@ -19,19 +19,22 @@ struct AuArray
static const AuUInt kElementCount = Count; static const AuUInt kElementCount = Count;
using value_type = T; using value_type = T;
using size_type = AuUInt; using size_type = AuUInt;
using difference_type = AuSInt; using difference_type = AuSInt;
using pointer = value_type *; using pointer = value_type *;
using const_pointer = const value_type *; using const_pointer = const value_type *;
using reference = value_type &; using reference = value_type &;
using const_reference = const value_type &; using const_reference = const value_type &;
using iterator = pointer; using iterator = pointer;
using const_iterator = const_pointer; using const_iterator = const_pointer;
using reverse_iterator = AuReverseIterator<iterator>;
using const_reverse_iterator = AuReverseIterator<const_iterator>;
void fill(const T &value) void fill(const T &value)
{ {
@ -48,11 +51,16 @@ struct AuArray
} }
} }
void Fill(const T &value)
{
this->fill(value);
}
void swap(AuArray &other) void swap(AuArray &other)
{ {
AuArray temp; AuArray temp;
if constexpr (std::is_trivially_copyable_v<T>) if constexpr (AuIsTriviallyCopyable_v<T>)
{ {
AuMemcpy(temp, this->elements, sizeof(this->elements)); AuMemcpy(temp, this->elements, sizeof(this->elements));
AuMemcpy(this->elements, other.elements, sizeof(this->elements)); AuMemcpy(this->elements, other.elements, sizeof(this->elements));
@ -77,6 +85,11 @@ struct AuArray
} }
} }
} }
void Swap(AuArray &other)
{
this->swap(other);
}
constexpr iterator begin() constexpr iterator begin()
{ {
@ -88,6 +101,16 @@ struct AuArray
return this->elements; return this->elements;
} }
constexpr iterator Begin()
{
return this->elements;
}
constexpr const_iterator Begin() const
{
return this->elements;
}
constexpr iterator end() constexpr iterator end()
{ {
return this->elements + kElementCount; return this->elements + kElementCount;
@ -98,6 +121,16 @@ struct AuArray
return this->elements + kElementCount; return this->elements + kElementCount;
} }
constexpr iterator End()
{
return this->elements + kElementCount;
}
constexpr const_iterator End() const
{
return this->elements + kElementCount;
}
constexpr const_iterator cbegin() const constexpr const_iterator cbegin() const
{ {
return begin(); return begin();
@ -108,21 +141,101 @@ struct AuArray
return end(); return end();
} }
constexpr const_iterator CBegin() const
{
return begin();
}
constexpr const_iterator CEnd() const
{
return end();
}
constexpr const_reverse_iterator rbegin() const
{
return reverse_iterator(end());
}
constexpr reverse_iterator RBegin()
{
return reverse_iterator(end());
}
constexpr const_reverse_iterator RBegin() const
{
return const_reverse_iterator(end());
}
constexpr reverse_iterator rend()
{
return reverse_iterator(begin());
}
constexpr const_reverse_iterator rend() const
{
return reverse_iterator(begin());
}
constexpr reverse_iterator REnd()
{
return const_reverse_iterator(begin());
}
constexpr const_reverse_iterator REnd() const
{
return const_reverse_iterator(begin());
}
constexpr const_reverse_iterator crbegin() const
{
return const_reverse_iterator(end());
}
constexpr const_reverse_iterator crend() const
{
return const_reverse_iterator(begin());
}
constexpr const_reverse_iterator CRBegin() const
{
return const_reverse_iterator(end());
}
constexpr const_reverse_iterator CREnd() const
{
return const_reverse_iterator(begin());
}
constexpr size_type size() const constexpr size_type size() const
{ {
return kElementCount; return kElementCount;
} }
constexpr size_type Size() const
{
return kElementCount;
}
constexpr size_type max_size() const constexpr size_type max_size() const
{ {
return kElementCount; return kElementCount;
} }
constexpr size_type MaxSize() const
{
return kElementCount;
}
constexpr bool empty() const constexpr bool empty() const
{ {
return false; return false;
} }
constexpr bool Empty() const
{
return false;
}
reference at(size_type pos) reference at(size_type pos)
{ {
#if defined(AU_CFG_ID_DEBUG) #if defined(AU_CFG_ID_DEBUG)
@ -146,6 +259,29 @@ struct AuArray
return this->elements[pos]; return this->elements[pos];
} }
reference At(size_type pos)
{
#if defined(AU_CFG_ID_DEBUG)
if (pos >= kElementCount)
{
AuMemoryPanic("out of bounds access");
}
#endif
return this->elements[pos];
}
constexpr const_reference At(size_type pos) const
{
#if defined(AU_CFG_ID_DEBUG)
if (pos >= kElementCount)
{
AuMemoryPanic("out of bounds access");
}
#endif
return this->elements[pos];
}
reference operator[](size_type pos) reference operator[](size_type pos)
{ {
#if defined(AU_CFG_ID_DEBUG) #if defined(AU_CFG_ID_DEBUG)
@ -190,6 +326,26 @@ struct AuArray
return this->elements[Count - 1]; return this->elements[Count - 1];
} }
constexpr reference Front()
{
return this->elements[0];
}
constexpr const_reference Front() const
{
return this->elements[0];
}
constexpr reference Back()
{
return this->elements[Count - 1];
}
constexpr const_reference Back() const
{
return this->elements[Count - 1];
}
constexpr T *data() constexpr T *data()
{ {
return this->elements; return this->elements;
@ -200,12 +356,22 @@ struct AuArray
return this->elements; return this->elements;
} }
constexpr T *Data()
{
return this->elements;
}
constexpr const T *Data() const
{
return this->elements;
}
// oh look, its that feature in that nearly 30 year old programming language intended to replace xerox alto's OOP language for the internet era. // oh look, its that feature in that nearly 30 year old programming language intended to replace xerox alto's OOP language for the internet era.
AuUInt HashCode() const AuUInt HashCode() const
{ {
AuUInt uRet {}; AuUInt uRet {};
if constexpr (std::is_trivially_copyable_v<T>) if constexpr (AuIsTriviallyCopyable_v<T>)
{ {
return AuFnv1aRuntime(this->elements, sizeof(this->elements)); return AuFnv1aRuntime(this->elements, sizeof(this->elements));
} }