All: rename every function from UpperCamelCase to snake_case
This was a mess since I didn't know which to use but now I decided to go with snake_case :)
This commit is contained in:
@@ -17,12 +17,12 @@ namespace BAN
|
||||
|
||||
String::String(const String& other)
|
||||
{
|
||||
MUST(copy_impl(other.SV()));
|
||||
MUST(copy_impl(other.sv()));
|
||||
}
|
||||
|
||||
String::String(String&& other)
|
||||
{
|
||||
move_impl(Move(other));
|
||||
move_impl(move(other));
|
||||
}
|
||||
|
||||
String::String(StringView other)
|
||||
@@ -37,14 +37,14 @@ namespace BAN
|
||||
|
||||
String& String::operator=(const String& other)
|
||||
{
|
||||
MUST(copy_impl(other.SV()));
|
||||
MUST(copy_impl(other.sv()));
|
||||
return *this;
|
||||
}
|
||||
|
||||
String& String::operator=(String&& other)
|
||||
{
|
||||
BAN::deallocator(m_data);
|
||||
move_impl(Move(other));
|
||||
move_impl(move(other));
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -54,19 +54,19 @@ namespace BAN
|
||||
return *this;
|
||||
}
|
||||
|
||||
ErrorOr<void> String::PushBack(char ch)
|
||||
ErrorOr<void> String::push_back(char ch)
|
||||
{
|
||||
TRY(EnsureCapasity(m_size + 2));
|
||||
TRY(ensure_capacity(m_size + 2));
|
||||
m_data[m_size] = ch;
|
||||
m_size++;
|
||||
m_data[m_size] = '\0';
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> String::Insert(char ch, size_type index)
|
||||
ErrorOr<void> String::insert(char ch, size_type index)
|
||||
{
|
||||
ASSERT(index <= m_size);
|
||||
TRY(EnsureCapasity(m_size + 1 + 1));
|
||||
TRY(ensure_capacity(m_size + 1 + 1));
|
||||
memmove(m_data + index + 1, m_data + index, m_size - index);
|
||||
m_data[index] = ch;
|
||||
m_size += 1;
|
||||
@@ -74,45 +74,45 @@ namespace BAN
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> String::Insert(StringView other, size_type index)
|
||||
ErrorOr<void> String::insert(StringView other, size_type index)
|
||||
{
|
||||
ASSERT(index <= m_size);
|
||||
TRY(EnsureCapasity(m_size + other.Size() + 1));
|
||||
memmove(m_data + index + other.Size(), m_data + index, m_size - index);
|
||||
memcpy(m_data + index, other.Data(), other.Size());
|
||||
m_size += other.Size();
|
||||
TRY(ensure_capacity(m_size + other.size() + 1));
|
||||
memmove(m_data + index + other.size(), m_data + index, m_size - index);
|
||||
memcpy(m_data + index, other.data(), other.size());
|
||||
m_size += other.size();
|
||||
m_data[m_size] = '\0';
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> String::Append(StringView other)
|
||||
ErrorOr<void> String::append(StringView other)
|
||||
{
|
||||
TRY(EnsureCapasity(m_size + other.Size() + 1));
|
||||
memcpy(m_data + m_size, other.Data(), other.Size());
|
||||
m_size += other.Size();
|
||||
TRY(ensure_capacity(m_size + other.size() + 1));
|
||||
memcpy(m_data + m_size, other.data(), other.size());
|
||||
m_size += other.size();
|
||||
m_data[m_size] = '\0';
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> String::Append(const String& string)
|
||||
ErrorOr<void> String::append(const String& string)
|
||||
{
|
||||
TRY(Append(string.SV()));
|
||||
TRY(append(string.sv()));
|
||||
return {};
|
||||
}
|
||||
|
||||
void String::PopBack()
|
||||
void String::pop_back()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
m_size--;
|
||||
m_data[m_size] = '\0';
|
||||
}
|
||||
|
||||
void String::Remove(size_type index)
|
||||
void String::remove(size_type index)
|
||||
{
|
||||
Erase(index, 1);
|
||||
erase(index, 1);
|
||||
}
|
||||
|
||||
void String::Erase(size_type index, size_type count)
|
||||
void String::erase(size_type index, size_type count)
|
||||
{
|
||||
ASSERT(index + count <= m_size);
|
||||
memmove(m_data + index, m_data + index + count, m_size - index - count);
|
||||
@@ -120,7 +120,7 @@ namespace BAN
|
||||
m_data[m_size] = '\0';
|
||||
}
|
||||
|
||||
void String::Clear()
|
||||
void String::clear()
|
||||
{
|
||||
m_size = 0;
|
||||
m_data[0] = '\0';
|
||||
@@ -147,9 +147,9 @@ namespace BAN
|
||||
|
||||
bool String::operator==(StringView other) const
|
||||
{
|
||||
if (m_size != other.Size())
|
||||
if (m_size != other.size())
|
||||
return false;
|
||||
return memcmp(m_data, other.Data(), m_size) == 0;
|
||||
return memcmp(m_data, other.data(), m_size) == 0;
|
||||
}
|
||||
|
||||
bool String::operator==(const char* other) const
|
||||
@@ -160,7 +160,7 @@ namespace BAN
|
||||
return true;
|
||||
}
|
||||
|
||||
ErrorOr<void> String::Resize(size_type size, char ch)
|
||||
ErrorOr<void> String::resize(size_type size, char ch)
|
||||
{
|
||||
if (size < m_size)
|
||||
{
|
||||
@@ -169,7 +169,7 @@ namespace BAN
|
||||
}
|
||||
else if (size > m_size)
|
||||
{
|
||||
TRY(EnsureCapasity(size + 1));
|
||||
TRY(ensure_capacity(size + 1));
|
||||
for (size_type i = m_size; i < size; i++)
|
||||
m_data[i] = ch;
|
||||
m_data[size] = '\0';
|
||||
@@ -179,58 +179,58 @@ namespace BAN
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> String::Reserve(size_type size)
|
||||
ErrorOr<void> String::reserve(size_type size)
|
||||
{
|
||||
TRY(EnsureCapasity(size));
|
||||
TRY(ensure_capacity(size));
|
||||
return {};
|
||||
}
|
||||
|
||||
StringView String::SV() const
|
||||
StringView String::sv() const
|
||||
{
|
||||
return StringView(*this);
|
||||
}
|
||||
|
||||
bool String::Empty() const
|
||||
bool String::empty() const
|
||||
{
|
||||
return m_size == 0;
|
||||
}
|
||||
|
||||
String::size_type String::Size() const
|
||||
String::size_type String::size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
String::size_type String::Capasity() const
|
||||
String::size_type String::capacity() const
|
||||
{
|
||||
return m_capasity;
|
||||
return m_capacity;
|
||||
}
|
||||
|
||||
const char* String::Data() const
|
||||
const char* String::data() const
|
||||
{
|
||||
return m_data;
|
||||
}
|
||||
|
||||
ErrorOr<void> String::EnsureCapasity(size_type size)
|
||||
ErrorOr<void> String::ensure_capacity(size_type size)
|
||||
{
|
||||
if (m_capasity >= size)
|
||||
if (m_capacity >= size)
|
||||
return {};
|
||||
size_type new_cap = BAN::Math::max<size_type>(size, m_capasity * 3 / 2);
|
||||
size_type new_cap = BAN::Math::max<size_type>(size, m_capacity * 3 / 2);
|
||||
void* new_data = BAN::allocator(new_cap);
|
||||
if (new_data == nullptr)
|
||||
return Error::FromString("String: Could not allocate memory");
|
||||
return Error::from_string("String: Could not allocate memory");
|
||||
if (m_data)
|
||||
memcpy(new_data, m_data, m_size + 1);
|
||||
BAN::deallocator(m_data);
|
||||
m_data = (char*)new_data;
|
||||
m_capasity = new_cap;
|
||||
m_capacity = new_cap;
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> String::copy_impl(StringView other)
|
||||
{
|
||||
TRY(EnsureCapasity(other.Size() + 1));
|
||||
memcpy(m_data, other.Data(), other.Size());
|
||||
m_size = other.Size();
|
||||
TRY(ensure_capacity(other.size() + 1));
|
||||
memcpy(m_data, other.data(), other.size());
|
||||
m_size = other.size();
|
||||
m_data[m_size] = '\0';
|
||||
return {};
|
||||
}
|
||||
@@ -239,11 +239,11 @@ namespace BAN
|
||||
{
|
||||
m_data = other.m_data;
|
||||
m_size = other.m_size;
|
||||
m_capasity = other.m_capasity;
|
||||
m_capacity = other.m_capacity;
|
||||
|
||||
other.m_data = nullptr;
|
||||
other.m_size = 0;
|
||||
other.m_capasity = 0;
|
||||
other.m_capacity = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace BAN
|
||||
{ }
|
||||
|
||||
StringView::StringView(const String& other)
|
||||
: StringView(other.Data(), other.Size())
|
||||
: StringView(other.data(), other.size())
|
||||
{ }
|
||||
|
||||
StringView::StringView(const char* string, size_type len)
|
||||
@@ -30,9 +30,9 @@ namespace BAN
|
||||
|
||||
bool StringView::operator==(const String& other) const
|
||||
{
|
||||
if (m_size != other.Size())
|
||||
if (m_size != other.size())
|
||||
return false;
|
||||
return memcmp(m_data, other.Data(), m_size) == 0;
|
||||
return memcmp(m_data, other.data(), m_size) == 0;
|
||||
}
|
||||
|
||||
bool StringView::operator==(StringView other) const
|
||||
@@ -49,7 +49,7 @@ namespace BAN
|
||||
return other[m_size] == '\0';
|
||||
}
|
||||
|
||||
StringView StringView::Substring(size_type index, size_type len) const
|
||||
StringView StringView::substring(size_type index, size_type len) const
|
||||
{
|
||||
ASSERT(index <= m_size);
|
||||
if (len == size_type(-1))
|
||||
@@ -61,14 +61,14 @@ namespace BAN
|
||||
return result;
|
||||
}
|
||||
|
||||
ErrorOr<Vector<StringView>> StringView::Split(char delim, bool allow_empties)
|
||||
ErrorOr<Vector<StringView>> StringView::split(char delim, bool allow_empties)
|
||||
{
|
||||
// FIXME: Won't work while multithreading
|
||||
static char s_delim = delim;
|
||||
return Split([](char c){ return c == s_delim; }, allow_empties);
|
||||
return split([](char c){ return c == s_delim; }, allow_empties);
|
||||
}
|
||||
|
||||
ErrorOr<Vector<StringView>> StringView::Split(bool(*comp)(char), bool allow_empties)
|
||||
ErrorOr<Vector<StringView>> StringView::split(bool(*comp)(char), bool allow_empties)
|
||||
{
|
||||
size_type count = 0;
|
||||
{
|
||||
@@ -87,7 +87,7 @@ namespace BAN
|
||||
}
|
||||
|
||||
Vector<StringView> result;
|
||||
TRY(result.Reserve(count));
|
||||
TRY(result.reserve(count));
|
||||
|
||||
size_type start = 0;
|
||||
for (size_type i = 0; i < m_size; i++)
|
||||
@@ -95,28 +95,28 @@ namespace BAN
|
||||
if (comp(m_data[i]))
|
||||
{
|
||||
if (allow_empties || start != i)
|
||||
TRY(result.PushBack(this->Substring(start, i - start)));
|
||||
TRY(result.push_back(this->substring(start, i - start)));
|
||||
start = i + 1;
|
||||
}
|
||||
}
|
||||
if (start != m_size)
|
||||
TRY(result.PushBack(this->Substring(start)));
|
||||
TRY(result.push_back(this->substring(start)));
|
||||
return result;
|
||||
}
|
||||
|
||||
char StringView::Back() const
|
||||
char StringView::back() const
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return m_data[m_size - 1];
|
||||
}
|
||||
|
||||
char StringView::Front() const
|
||||
char StringView::front() const
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return m_data[0];
|
||||
}
|
||||
|
||||
StringView::size_type StringView::Count(char ch) const
|
||||
StringView::size_type StringView::count(char ch) const
|
||||
{
|
||||
size_type result = 0;
|
||||
for (size_type i = 0; i < m_size; i++)
|
||||
@@ -125,17 +125,17 @@ namespace BAN
|
||||
return result;
|
||||
}
|
||||
|
||||
bool StringView::Empty() const
|
||||
bool StringView::empty() const
|
||||
{
|
||||
return m_size == 0;
|
||||
}
|
||||
|
||||
StringView::size_type StringView::Size() const
|
||||
StringView::size_type StringView::size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
const char* StringView::Data() const
|
||||
const char* StringView::data() const
|
||||
{
|
||||
return m_data;
|
||||
}
|
||||
|
||||
@@ -21,12 +21,12 @@ namespace BAN
|
||||
const T& operator[](size_type) const;
|
||||
T& operator[](size_type);
|
||||
|
||||
const T& Back() const;
|
||||
T& Back();
|
||||
const T& Front() const;
|
||||
T& Front();
|
||||
const T& back() const;
|
||||
T& back();
|
||||
const T& front() const;
|
||||
T& front();
|
||||
|
||||
constexpr size_type Size() const;
|
||||
constexpr size_type size() const;
|
||||
|
||||
private:
|
||||
T m_data[S];
|
||||
@@ -61,35 +61,35 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T, size_t S>
|
||||
const T& Array<T, S>::Back() const
|
||||
const T& Array<T, S>::back() const
|
||||
{
|
||||
ASSERT(S != 0);
|
||||
return m_data[S - 1];
|
||||
}
|
||||
|
||||
template<typename T, size_t S>
|
||||
T& Array<T, S>::Back()
|
||||
T& Array<T, S>::back()
|
||||
{
|
||||
ASSERT(S != 0);
|
||||
return m_data[S - 1];
|
||||
}
|
||||
|
||||
template<typename T, size_t S>
|
||||
const T& Array<T, S>::Front() const
|
||||
const T& Array<T, S>::front() const
|
||||
{
|
||||
ASSERT(S != 0);
|
||||
return m_data[0];
|
||||
}
|
||||
|
||||
template<typename T, size_t S>
|
||||
T& Array<T, S>::Front()
|
||||
T& Array<T, S>::front()
|
||||
{
|
||||
ASSERT(S != 0);
|
||||
return m_data[0];
|
||||
}
|
||||
|
||||
template<typename T, size_t S>
|
||||
constexpr typename Array<T, S>::size_type Array<T, S>::Size() const
|
||||
constexpr typename Array<T, S>::size_type Array<T, S>::size() const
|
||||
{
|
||||
return S;
|
||||
}
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
|
||||
#if defined(__is_kernel)
|
||||
#include <kernel/Panic.h>
|
||||
#define MUST(error) ({ auto e = error; if (e.IsError()) Kernel::Panic("{}", e.GetError()); e.Value(); })
|
||||
#define ASSERT(cond) do { if (!(cond)) Kernel::Panic("ASSERT("#cond") failed"); } while(false)
|
||||
#define MUST(error) ({ auto e = error; if (e.is_error()) Kernel::panic("{}", e.get_error()); e.value(); })
|
||||
#define ASSERT(cond) do { if (!(cond)) Kernel::panic("ASSERT("#cond") failed"); } while(false)
|
||||
#else
|
||||
#error "NOT IMPLEMENTED"
|
||||
#endif
|
||||
|
||||
#define TRY(error) ({ auto e = error; if (e.IsError()) return e.GetError(); e.Value(); })
|
||||
#define TRY(error) ({ auto e = error; if (e.is_error()) return e.get_error(); e.value(); })
|
||||
|
||||
namespace BAN
|
||||
{
|
||||
@@ -20,7 +20,7 @@ namespace BAN
|
||||
class Error
|
||||
{
|
||||
public:
|
||||
static Error FromString(const char* message)
|
||||
static Error from_string(const char* message)
|
||||
{
|
||||
Error result;
|
||||
strncpy(result.m_message, message, sizeof(m_message));
|
||||
@@ -29,8 +29,8 @@ namespace BAN
|
||||
return result;
|
||||
}
|
||||
|
||||
uint8_t GetErrorCode() const { return m_error_code; }
|
||||
const char* GetMessage() const { return m_message; }
|
||||
uint8_t get_error_code() const { return m_error_code; }
|
||||
const char* get_message() const { return m_message; }
|
||||
|
||||
private:
|
||||
char m_message[128];
|
||||
@@ -43,12 +43,12 @@ namespace BAN
|
||||
public:
|
||||
ErrorOr(const T& value) : m_has_error(false) { m_data = (void*)new T(value); }
|
||||
ErrorOr(const Error& error) : m_has_error(true) { m_data = (void*)new Error(error); }
|
||||
template<typename S> ErrorOr(const ErrorOr<S>& other) : ErrorOr(other.GetError()) {}
|
||||
~ErrorOr() { IsError() ? (delete reinterpret_cast<Error*>(m_data)) : (delete reinterpret_cast<T*>(m_data)); }
|
||||
template<typename S> ErrorOr(const ErrorOr<S>& other) : ErrorOr(other.get_error()) {}
|
||||
~ErrorOr() { is_error() ? (delete reinterpret_cast<Error*>(m_data)) : (delete reinterpret_cast<T*>(m_data)); }
|
||||
|
||||
bool IsError() const { return m_has_error; }
|
||||
const Error& GetError() const { return *reinterpret_cast<Error*>(m_data); }
|
||||
T& Value() { return *reinterpret_cast<T*>(m_data); }
|
||||
bool is_error() const { return m_has_error; }
|
||||
const Error& get_error() const { return *reinterpret_cast<Error*>(m_data); }
|
||||
T& value() { return *reinterpret_cast<T*>(m_data); }
|
||||
|
||||
private:
|
||||
bool m_has_error = false;
|
||||
@@ -63,9 +63,9 @@ namespace BAN
|
||||
ErrorOr(const Error& error) : m_error(error) { }
|
||||
~ErrorOr() { }
|
||||
|
||||
bool IsError() const { return m_has_error; }
|
||||
const Error& GetError() const { return m_error; }
|
||||
void Value() { }
|
||||
bool is_error() const { return m_has_error; }
|
||||
const Error& get_error() const { return m_error; }
|
||||
void value() { }
|
||||
|
||||
private:
|
||||
Error m_error;
|
||||
@@ -79,9 +79,9 @@ namespace BAN::Formatter
|
||||
template<typename F>
|
||||
void print_argument_impl(F putc, const Error& error, const ValueFormat&)
|
||||
{
|
||||
if (error.GetErrorCode() == 0xFF)
|
||||
print(putc, error.GetMessage());
|
||||
if (error.get_error_code() == 0xFF)
|
||||
print(putc, error.get_message());
|
||||
else
|
||||
print(putc, "{} ({})", error.GetMessage(), error.GetErrorCode());
|
||||
print(putc, "{} ({})", error.get_message(), error.get_error_code());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,5 +13,6 @@ namespace BAN
|
||||
class String;
|
||||
class StringView;
|
||||
template<typename> class Vector;
|
||||
template<typename> class LinkedList;
|
||||
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace BAN
|
||||
Ret operator()(Args... args)
|
||||
{
|
||||
ASSERT(*this);
|
||||
return reinterpret_cast<CallableBase*>(m_storage)->call(Forward<Args>(args)...);
|
||||
return reinterpret_cast<CallableBase*>(m_storage)->call(forward<Args>(args)...);
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
@@ -67,7 +67,7 @@ namespace BAN
|
||||
|
||||
virtual Ret call(Args... args) override
|
||||
{
|
||||
return m_function(Forward<Args>(args)...);
|
||||
return m_function(forward<Args>(args)...);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -84,7 +84,7 @@ namespace BAN
|
||||
|
||||
virtual Ret call(Args... args) override
|
||||
{
|
||||
return (m_owner->*m_function)(Forward<Args>(args)...);
|
||||
return (m_owner->*m_function)(forward<Args>(args)...);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -102,7 +102,7 @@ namespace BAN
|
||||
|
||||
virtual Ret call(Args... args) override
|
||||
{
|
||||
return (m_owner->*m_function)(Forward<Args>(args)...);
|
||||
return (m_owner->*m_function)(forward<Args>(args)...);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -119,7 +119,7 @@ namespace BAN
|
||||
|
||||
virtual Ret call(Args... args) override
|
||||
{
|
||||
return m_lambda(Forward<Args>(args)...);
|
||||
return m_lambda(forward<Args>(args)...);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -28,31 +28,31 @@ namespace BAN
|
||||
LinkedList() = default;
|
||||
~LinkedList();
|
||||
|
||||
[[nodiscard]] ErrorOr<void> PushBack(const T&);
|
||||
[[nodiscard]] ErrorOr<void> PushBack(T&&);
|
||||
[[nodiscard]] ErrorOr<void> Insert(const_iterator, const T&);
|
||||
[[nodiscard]] ErrorOr<void> Insert(const_iterator, T&&);
|
||||
[[nodiscard]] ErrorOr<void> push_back(const T&);
|
||||
[[nodiscard]] ErrorOr<void> push_back(T&&);
|
||||
[[nodiscard]] ErrorOr<void> insert(const_iterator, const T&);
|
||||
[[nodiscard]] ErrorOr<void> insert(const_iterator, T&&);
|
||||
template<typename... Args>
|
||||
[[nodiscard]] ErrorOr<void> EmplaceBack(Args...);
|
||||
[[nodiscard]] ErrorOr<void> emplace_back(Args...);
|
||||
template<typename... Args>
|
||||
[[nodiscard]] ErrorOr<void> Emplace(const_iterator, Args...);
|
||||
[[nodiscard]] ErrorOr<void> emplace(const_iterator, Args...);
|
||||
|
||||
void PopBack();
|
||||
void Remove(const_iterator);
|
||||
void Clear();
|
||||
void pop_back();
|
||||
void remove(const_iterator);
|
||||
void clear();
|
||||
|
||||
iterator begin() { return iterator(m_data, false); }
|
||||
const_iterator begin() const { return const_iterator(m_data, false); }
|
||||
iterator end() { return iterator(m_last, true); }
|
||||
const_iterator end() const { return const_iterator(m_last, true); }
|
||||
|
||||
const T& Back() const;
|
||||
T& Back();
|
||||
const T& Front() const;
|
||||
T& Front();
|
||||
const T& back() const;
|
||||
T& back();
|
||||
const T& front() const;
|
||||
T& front();
|
||||
|
||||
size_type Size() const;
|
||||
bool Empty() const;
|
||||
size_type size() const;
|
||||
bool empty() const;
|
||||
|
||||
private:
|
||||
struct Node
|
||||
@@ -166,34 +166,34 @@ namespace BAN
|
||||
template<typename T>
|
||||
LinkedList<T>::~LinkedList()
|
||||
{
|
||||
Clear();
|
||||
clear();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> LinkedList<T>::PushBack(const T& value)
|
||||
ErrorOr<void> LinkedList<T>::push_back(const T& value)
|
||||
{
|
||||
return PushBack(Move(T(value)));
|
||||
return push_back(Move(T(value)));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> LinkedList<T>::PushBack(T&& value)
|
||||
ErrorOr<void> LinkedList<T>::push_back(T&& value)
|
||||
{
|
||||
return Insert(end(), Move(value));
|
||||
return insert(end(), Move(value));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> LinkedList<T>::Insert(const_iterator iter, const T& value)
|
||||
ErrorOr<void> LinkedList<T>::insert(const_iterator iter, const T& value)
|
||||
{
|
||||
return Insert(iter, Move(T(value)));
|
||||
return insert(iter, Move(T(value)));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> LinkedList<T>::Insert(const_iterator iter, T&& value)
|
||||
ErrorOr<void> LinkedList<T>::insert(const_iterator iter, T&& value)
|
||||
{
|
||||
Node* next = iter.m_past_end ? nullptr : iter.m_current;
|
||||
Node* prev = next ? next->prev : m_last;
|
||||
Node* new_node = TRY(allocate_node());
|
||||
new (&new_node->value) T(Move(value));
|
||||
new (&new_node->value) T(move(value));
|
||||
new_node->next = next;
|
||||
new_node->prev = prev;
|
||||
(prev ? prev->next : m_data) = new_node;
|
||||
@@ -204,19 +204,19 @@ namespace BAN
|
||||
|
||||
template<typename T>
|
||||
template<typename... Args>
|
||||
ErrorOr<void> LinkedList<T>::EmplaceBack(Args... args)
|
||||
ErrorOr<void> LinkedList<T>::emplace_back(Args... args)
|
||||
{
|
||||
return Emplace(end(), Forward<Args>(args)...);
|
||||
return emplace(end(), forward<Args>(args)...);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template<typename... Args>
|
||||
ErrorOr<void> LinkedList<T>::Emplace(const_iterator iter, Args... args)
|
||||
ErrorOr<void> LinkedList<T>::emplace(const_iterator iter, Args... args)
|
||||
{
|
||||
Node* next = iter.m_past_end ? nullptr : iter.m_current;
|
||||
Node* prev = next ? next->prev : m_last;
|
||||
Node* new_node = TRY(allocate_node());
|
||||
new (&new_node->value) T(Forward<Args>(args)...);
|
||||
new (&new_node->value) T(forward<Args>(args)...);
|
||||
new_node->next = next;
|
||||
new_node->prev = prev;
|
||||
(prev ? prev->next : m_data) = new_node;
|
||||
@@ -226,13 +226,13 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void LinkedList<T>::PopBack()
|
||||
void LinkedList<T>::pop_back()
|
||||
{
|
||||
return Remove(m_last);
|
||||
return remove(m_last);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void LinkedList<T>::Remove(const_iterator iter)
|
||||
void LinkedList<T>::remove(const_iterator iter)
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
Node* node = iter.m_current;
|
||||
@@ -246,7 +246,7 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void LinkedList<T>::Clear()
|
||||
void LinkedList<T>::clear()
|
||||
{
|
||||
Node* ptr = m_data;
|
||||
while (ptr)
|
||||
@@ -262,41 +262,41 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T& LinkedList<T>::Back() const
|
||||
const T& LinkedList<T>::back() const
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *const_iterator(m_last);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T& LinkedList<T>::Back()
|
||||
T& LinkedList<T>::back()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *iterator(m_last);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T& LinkedList<T>::Front() const
|
||||
const T& LinkedList<T>::front() const
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *const_iterator(m_data);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T& LinkedList<T>::Front()
|
||||
T& LinkedList<T>::front()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *iterator(m_data);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename LinkedList<T>::size_type LinkedList<T>::Size() const
|
||||
typename LinkedList<T>::size_type LinkedList<T>::size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool LinkedList<T>::Empty() const
|
||||
bool LinkedList<T>::empty() const
|
||||
{
|
||||
return m_size == 0;
|
||||
}
|
||||
@@ -306,7 +306,7 @@ namespace BAN
|
||||
{
|
||||
Node* node = (Node*)BAN::allocator(sizeof(Node));
|
||||
if (node == nullptr)
|
||||
return Error::FromString("LinkedList: Could not allocate memory");
|
||||
return Error::from_string("LinkedList: Could not allocate memory");
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,22 +70,22 @@ namespace BAN
|
||||
}
|
||||
RefCounted(RefCounted<T>&& other)
|
||||
{
|
||||
*this = Move(other);
|
||||
*this = move(other);
|
||||
}
|
||||
~RefCounted()
|
||||
{
|
||||
Reset();
|
||||
reset();
|
||||
}
|
||||
|
||||
template<typename... Args>
|
||||
static RefCounted<T> Create(Args... args)
|
||||
static RefCounted<T> create(Args... args)
|
||||
{
|
||||
return RefCounted<T>(new T(Forward<Args>(args)...), new int32_t(1));
|
||||
return RefCounted<T>(new T(forward<Args>(args)...), new int32_t(1));
|
||||
}
|
||||
|
||||
RefCounted<T>& operator=(const RefCounted<T>& other)
|
||||
{
|
||||
Reset();
|
||||
reset();
|
||||
if (other)
|
||||
{
|
||||
m_pointer = other.m_pointer;
|
||||
@@ -97,13 +97,13 @@ namespace BAN
|
||||
|
||||
RefCounted<T>& operator=(RefCounted<T>&& other)
|
||||
{
|
||||
Reset();
|
||||
reset();
|
||||
m_pointer = other.m_pointer;
|
||||
m_count = other.m_count;
|
||||
other.m_pointer = nullptr;
|
||||
other.m_count = nullptr;
|
||||
if (!(*this))
|
||||
Reset();
|
||||
reset();
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ namespace BAN
|
||||
T* operator->() { return m_pointer; }
|
||||
const T* operator->() const { return m_pointer; }
|
||||
|
||||
void Reset()
|
||||
void reset()
|
||||
{
|
||||
ASSERT(!m_count == !m_pointer);
|
||||
if (!m_count)
|
||||
|
||||
@@ -6,19 +6,19 @@ namespace BAN
|
||||
{
|
||||
|
||||
template<typename T>
|
||||
constexpr remove_reference_t<T>&& Move(T&& arg)
|
||||
constexpr remove_reference_t<T>&& move(T&& arg)
|
||||
{
|
||||
return static_cast<remove_reference_t<T>&&>(arg);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
constexpr T&& Forward(remove_reference_t<T>& arg)
|
||||
constexpr T&& forward(remove_reference_t<T>& arg)
|
||||
{
|
||||
return static_cast<T&&>(arg);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
constexpr T&& Forward(remove_reference_t<T>&& arg)
|
||||
constexpr T&& forward(remove_reference_t<T>&& arg)
|
||||
{
|
||||
static_assert(!is_lvalue_reference_v<T>);
|
||||
return static_cast<T&&>(arg);
|
||||
|
||||
@@ -24,24 +24,24 @@ namespace BAN
|
||||
Queue<T>& operator=(Queue<T>&&);
|
||||
Queue<T>& operator=(const Queue<T>&);
|
||||
|
||||
[[nodiscard]] ErrorOr<void> Push(T&&);
|
||||
[[nodiscard]] ErrorOr<void> Push(const T&);
|
||||
[[nodiscard]] ErrorOr<void> push(T&&);
|
||||
[[nodiscard]] ErrorOr<void> push(const T&);
|
||||
template<typename... Args>
|
||||
[[nodiscard]] ErrorOr<void> Emplace(Args...);
|
||||
[[nodiscard]] ErrorOr<void> emplace(Args...);
|
||||
|
||||
void Pop();
|
||||
void Clear();
|
||||
void pop();
|
||||
void clear();
|
||||
|
||||
bool Empty() const;
|
||||
size_type Size() const;
|
||||
bool empty() const;
|
||||
size_type size() const;
|
||||
|
||||
const T& Front() const;
|
||||
T& Front();
|
||||
const T& front() const;
|
||||
T& front();
|
||||
|
||||
private:
|
||||
[[nodiscard]] ErrorOr<void> EnsureCapacity(size_type size);
|
||||
const T* AddressOf(size_type, void* = nullptr) const;
|
||||
T* AddressOf(size_type, void* = nullptr);
|
||||
[[nodiscard]] ErrorOr<void> ensure_capacity(size_type size);
|
||||
const T* address_of(size_type, void* = nullptr) const;
|
||||
T* address_of(size_type, void* = nullptr);
|
||||
|
||||
private:
|
||||
uint8_t* m_data = nullptr;
|
||||
@@ -64,22 +64,22 @@ namespace BAN
|
||||
template<typename T>
|
||||
Queue<T>::Queue(const Queue<T>& other)
|
||||
{
|
||||
MUST(EnsureCapacity(other.Size()));
|
||||
for (size_type i = 0; i < other.Size(); i++)
|
||||
new (AddressOf(i)) T(*AddressOf(i, other.m_data));
|
||||
MUST(ensure_capacity(other.size()));
|
||||
for (size_type i = 0; i < other.size(); i++)
|
||||
new (address_of(i)) T(*address_of(i, other.m_data));
|
||||
m_size = other.m_size;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Queue<T>::~Queue()
|
||||
{
|
||||
Clear();
|
||||
clear();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Queue<T>& Queue<T>::operator=(Queue<T>&& other)
|
||||
{
|
||||
Clear();
|
||||
clear();
|
||||
|
||||
m_data = other.m_data;
|
||||
m_capacity = other.m_capacity;
|
||||
@@ -95,54 +95,54 @@ namespace BAN
|
||||
template<typename T>
|
||||
Queue<T>& Queue<T>::operator=(const Queue<T>& other)
|
||||
{
|
||||
Clear();
|
||||
MUST(EnsureCapacity(other.Size()));
|
||||
for (size_type i = 0; i < other.Size(); i++)
|
||||
new (AddressOf(i)) T(*AddressOf(i, other.m_data));
|
||||
clear();
|
||||
MUST(ensure_capacity(other.size()));
|
||||
for (size_type i = 0; i < other.size(); i++)
|
||||
new (address_of(i)) T(*address_of(i, other.m_data));
|
||||
m_size = other.m_size;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Queue<T>::Push(T&& value)
|
||||
ErrorOr<void> Queue<T>::push(T&& value)
|
||||
{
|
||||
TRY(EnsureCapacity(m_size + 1));
|
||||
new (AddressOf(m_size)) T(Move(value));
|
||||
TRY(ensure_capacity(m_size + 1));
|
||||
new (address_of(m_size)) T(move(value));
|
||||
m_size++;
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Queue<T>::Push(const T& value)
|
||||
ErrorOr<void> Queue<T>::push(const T& value)
|
||||
{
|
||||
return Push(Move(T(value)));
|
||||
return push(move(T(value)));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template<typename... Args>
|
||||
ErrorOr<void> Queue<T>::Emplace(Args... args)
|
||||
ErrorOr<void> Queue<T>::emplace(Args... args)
|
||||
{
|
||||
TRY(EnsureCapacity(m_size + 1));
|
||||
new (AddressOf(m_size)) T(Forward<Args>(args)...);
|
||||
TRY(ensure_capacity(m_size + 1));
|
||||
new (address_of(m_size)) T(forward<Args>(args)...);
|
||||
m_size++;
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Queue<T>::Pop()
|
||||
void Queue<T>::pop()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
for (size_type i = 0; i < m_size - 1; i++)
|
||||
*AddressOf(i) = Move(*AddressOf(i + 1));
|
||||
AddressOf(m_size - 1)->~T();
|
||||
*address_of(i) = move(*address_of(i + 1));
|
||||
address_of(m_size - 1)->~T();
|
||||
m_size--;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Queue<T>::Clear()
|
||||
void Queue<T>::clear()
|
||||
{
|
||||
for (size_type i = 0; i < m_size; i++)
|
||||
AddressOf(i)->~T();
|
||||
address_of(i)->~T();
|
||||
BAN::deallocator(m_data);
|
||||
m_data = nullptr;
|
||||
m_capacity = 0;
|
||||
@@ -150,44 +150,44 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool Queue<T>::Empty() const
|
||||
bool Queue<T>::empty() const
|
||||
{
|
||||
return m_size == 0;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename Queue<T>::size_type Queue<T>::Size() const
|
||||
typename Queue<T>::size_type Queue<T>::size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T& Queue<T>::Front() const
|
||||
const T& Queue<T>::front() const
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *AddressOf(0);
|
||||
return *address_of(0);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T& Queue<T>::Front()
|
||||
T& Queue<T>::front()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *AddressOf(0);
|
||||
return *address_of(0);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Queue<T>::EnsureCapacity(size_type size)
|
||||
ErrorOr<void> Queue<T>::ensure_capacity(size_type size)
|
||||
{
|
||||
if (m_capacity > size)
|
||||
return {};
|
||||
size_type new_cap = BAN::Math::max<size_type>(size, m_capacity * 3 / 2);
|
||||
uint8_t* new_data = (uint8_t*)BAN::allocator(new_cap * sizeof(T));
|
||||
if (new_data == nullptr)
|
||||
return Error::FromString("Queue: Could not allocate memory");
|
||||
return Error::from_string("Queue: Could not allocate memory");
|
||||
for (size_type i = 0; i < m_size; i++)
|
||||
{
|
||||
new (AddressOf(i, new_data)) T(Move(*AddressOf(i)));
|
||||
AddressOf(i)->~T();
|
||||
new (address_of(i, new_data)) T(move(*address_of(i)));
|
||||
address_of(i)->~T();
|
||||
}
|
||||
BAN::deallocator(m_data);
|
||||
m_data = new_data;
|
||||
@@ -196,7 +196,7 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T* Queue<T>::AddressOf(size_type index, void* base) const
|
||||
const T* Queue<T>::address_of(size_type index, void* base) const
|
||||
{
|
||||
if (base == nullptr)
|
||||
base = m_data;
|
||||
@@ -204,7 +204,7 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T* Queue<T>::AddressOf(size_type index, void* base)
|
||||
T* Queue<T>::address_of(size_type index, void* base)
|
||||
{
|
||||
if (base == nullptr)
|
||||
base = m_data;
|
||||
|
||||
@@ -19,23 +19,23 @@ namespace BAN
|
||||
~String();
|
||||
|
||||
template<typename... Args>
|
||||
static String Formatted(const char* format, const Args&... args);
|
||||
static String formatted(const char* format, const Args&... args);
|
||||
|
||||
String& operator=(const String&);
|
||||
String& operator=(String&&);
|
||||
String& operator=(StringView);
|
||||
|
||||
[[nodiscard]] ErrorOr<void> PushBack(char);
|
||||
[[nodiscard]] ErrorOr<void> Insert(char, size_type);
|
||||
[[nodiscard]] ErrorOr<void> Insert(StringView, size_type);
|
||||
[[nodiscard]] ErrorOr<void> Append(StringView);
|
||||
[[nodiscard]] ErrorOr<void> Append(const String&);
|
||||
[[nodiscard]] ErrorOr<void> push_back(char);
|
||||
[[nodiscard]] ErrorOr<void> insert(char, size_type);
|
||||
[[nodiscard]] ErrorOr<void> insert(StringView, size_type);
|
||||
[[nodiscard]] ErrorOr<void> append(StringView);
|
||||
[[nodiscard]] ErrorOr<void> append(const String&);
|
||||
|
||||
void PopBack();
|
||||
void Remove(size_type);
|
||||
void Erase(size_type, size_type);
|
||||
void pop_back();
|
||||
void remove(size_type);
|
||||
void erase(size_type, size_type);
|
||||
|
||||
void Clear();
|
||||
void clear();
|
||||
|
||||
char operator[](size_type) const;
|
||||
char& operator[](size_type);
|
||||
@@ -44,34 +44,34 @@ namespace BAN
|
||||
bool operator==(StringView) const;
|
||||
bool operator==(const char*) const;
|
||||
|
||||
[[nodiscard]] ErrorOr<void> Resize(size_type, char = '\0');
|
||||
[[nodiscard]] ErrorOr<void> Reserve(size_type);
|
||||
[[nodiscard]] ErrorOr<void> resize(size_type, char = '\0');
|
||||
[[nodiscard]] ErrorOr<void> reserve(size_type);
|
||||
|
||||
StringView SV() const;
|
||||
StringView sv() const;
|
||||
|
||||
bool Empty() const;
|
||||
size_type Size() const;
|
||||
size_type Capasity() const;
|
||||
bool empty() const;
|
||||
size_type size() const;
|
||||
size_type capacity() const;
|
||||
|
||||
const char* Data() const;
|
||||
const char* data() const;
|
||||
|
||||
private:
|
||||
[[nodiscard]] ErrorOr<void> EnsureCapasity(size_type);
|
||||
[[nodiscard]] ErrorOr<void> ensure_capacity(size_type);
|
||||
|
||||
[[nodiscard]] ErrorOr<void> copy_impl(StringView);
|
||||
void move_impl(String&&);
|
||||
|
||||
private:
|
||||
char* m_data = nullptr;
|
||||
size_type m_capasity = 0;
|
||||
size_type m_capacity = 0;
|
||||
size_type m_size = 0;
|
||||
};
|
||||
|
||||
template<typename... Args>
|
||||
String String::Formatted(const char* format, const Args&... args)
|
||||
String String::formatted(const char* format, const Args&... args)
|
||||
{
|
||||
String result;
|
||||
BAN::Formatter::print([&](char c){ result.PushBack(c); }, format, args...);
|
||||
BAN::Formatter::print([&](char c){ result.push_back(c); }, format, args...);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ namespace BAN::Formatter
|
||||
template<typename F>
|
||||
void print_argument_impl(F putc, const String& string, const ValueFormat&)
|
||||
{
|
||||
for (String::size_type i = 0; i < string.Size(); i++)
|
||||
for (String::size_type i = 0; i < string.size(); i++)
|
||||
putc(string[i]);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,20 +22,20 @@ namespace BAN
|
||||
bool operator==(StringView) const;
|
||||
bool operator==(const char*) const;
|
||||
|
||||
StringView Substring(size_type, size_type = -1) const;
|
||||
StringView substring(size_type, size_type = -1) const;
|
||||
|
||||
[[nodiscard]] ErrorOr<Vector<StringView>> Split(char, bool = false);
|
||||
[[nodiscard]] ErrorOr<Vector<StringView>> Split(bool(*comp)(char), bool = false);
|
||||
[[nodiscard]] ErrorOr<Vector<StringView>> split(char, bool = false);
|
||||
[[nodiscard]] ErrorOr<Vector<StringView>> split(bool(*comp)(char), bool = false);
|
||||
|
||||
char Back() const;
|
||||
char Front() const;
|
||||
char back() const;
|
||||
char front() const;
|
||||
|
||||
size_type Count(char) const;
|
||||
size_type count(char) const;
|
||||
|
||||
bool Empty() const;
|
||||
size_type Size() const;
|
||||
bool empty() const;
|
||||
size_type size() const;
|
||||
|
||||
const char* Data() const;
|
||||
const char* data() const;
|
||||
|
||||
private:
|
||||
const char* m_data = nullptr;
|
||||
@@ -52,7 +52,7 @@ namespace BAN::Formatter
|
||||
template<typename F>
|
||||
void print_argument_impl(F putc, const StringView& sv, const ValueFormat&)
|
||||
{
|
||||
for (StringView::size_type i = 0; i < sv.Size(); i++)
|
||||
for (StringView::size_type i = 0; i < sv.size(); i++)
|
||||
putc(sv[i]);
|
||||
}
|
||||
|
||||
|
||||
@@ -70,45 +70,45 @@ namespace BAN
|
||||
Vector<T>& operator=(Vector<T>&&);
|
||||
Vector<T>& operator=(const Vector<T>&);
|
||||
|
||||
[[nodiscard]] ErrorOr<void> PushBack(T&&);
|
||||
[[nodiscard]] ErrorOr<void> PushBack(const T&);
|
||||
[[nodiscard]] ErrorOr<void> push_back(T&&);
|
||||
[[nodiscard]] ErrorOr<void> push_back(const T&);
|
||||
template<typename... Args>
|
||||
[[nodiscard]] ErrorOr<void> EmplaceBack(Args...);
|
||||
[[nodiscard]] ErrorOr<void> emplace_back(Args...);
|
||||
template<typename... Args>
|
||||
[[nodiscard]] ErrorOr<void> Emplace(size_type, Args...);
|
||||
[[nodiscard]] ErrorOr<void> Insert(size_type, T&&);
|
||||
[[nodiscard]] ErrorOr<void> Insert(size_type, const T&);
|
||||
[[nodiscard]] ErrorOr<void> emplace(size_type, Args...);
|
||||
[[nodiscard]] ErrorOr<void> insert(size_type, T&&);
|
||||
[[nodiscard]] ErrorOr<void> insert(size_type, const T&);
|
||||
|
||||
iterator begin();
|
||||
iterator end();
|
||||
const_iterator begin() const;
|
||||
const_iterator end() const;
|
||||
|
||||
void PopBack();
|
||||
void Remove(size_type);
|
||||
void Clear();
|
||||
void pop_back();
|
||||
void remove(size_type);
|
||||
void clear();
|
||||
|
||||
bool Has(const T&) const;
|
||||
bool has(const T&) const;
|
||||
|
||||
const T& operator[](size_type) const;
|
||||
T& operator[](size_type);
|
||||
|
||||
const T& Back() const;
|
||||
T& Back();
|
||||
const T& Front() const;
|
||||
T& Front();
|
||||
const T& back() const;
|
||||
T& back();
|
||||
const T& front() const;
|
||||
T& front();
|
||||
|
||||
[[nodiscard]] ErrorOr<void> Resize(size_type);
|
||||
[[nodiscard]] ErrorOr<void> Reserve(size_type);
|
||||
[[nodiscard]] ErrorOr<void> resize(size_type);
|
||||
[[nodiscard]] ErrorOr<void> reserve(size_type);
|
||||
|
||||
bool Empty() const;
|
||||
size_type Size() const;
|
||||
size_type Capacity() const;
|
||||
bool empty() const;
|
||||
size_type size() const;
|
||||
size_type capacity() const;
|
||||
|
||||
private:
|
||||
[[nodiscard]] ErrorOr<void> EnsureCapasity(size_type);
|
||||
const T* AddressOf(size_type, void* = nullptr) const;
|
||||
T* AddressOf(size_type, void* = nullptr);
|
||||
[[nodiscard]] ErrorOr<void> ensure_capacity(size_type);
|
||||
const T* address_of(size_type, void* = nullptr) const;
|
||||
T* address_of(size_type, void* = nullptr);
|
||||
|
||||
private:
|
||||
uint8_t* m_data = nullptr;
|
||||
@@ -131,22 +131,22 @@ namespace BAN
|
||||
template<typename T>
|
||||
Vector<T>::Vector(const Vector<T>& other)
|
||||
{
|
||||
MUST(EnsureCapasity(other.m_size));
|
||||
MUST(ensure_capacity(other.m_size));
|
||||
for (size_type i = 0; i < other.m_size; i++)
|
||||
new (AddressOf(i)) T(other[i]);
|
||||
new (address_of(i)) T(other[i]);
|
||||
m_size = other.m_size;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Vector<T>::~Vector()
|
||||
{
|
||||
Clear();
|
||||
clear();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Vector<T>& Vector<T>::operator=(Vector<T>&& other)
|
||||
{
|
||||
Clear();
|
||||
clear();
|
||||
|
||||
m_data = other.m_data;
|
||||
m_capacity = other.m_capacity;
|
||||
@@ -162,133 +162,133 @@ namespace BAN
|
||||
template<typename T>
|
||||
Vector<T>& Vector<T>::operator=(const Vector<T>& other)
|
||||
{
|
||||
Clear();
|
||||
MUST(EnsureCapasity(other.Size()));
|
||||
for (size_type i = 0; i < other.Size(); i++)
|
||||
new (AddressOf(i)) T(other[i]);
|
||||
clear();
|
||||
MUST(ensure_capacity(other.size()));
|
||||
for (size_type i = 0; i < other.size(); i++)
|
||||
new (address_of(i)) T(other[i]);
|
||||
m_size = other.m_size;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Vector<T>::PushBack(T&& value)
|
||||
ErrorOr<void> Vector<T>::push_back(T&& value)
|
||||
{
|
||||
TRY(EnsureCapasity(m_size + 1));
|
||||
new (AddressOf(m_size)) T(Move(value));
|
||||
TRY(ensure_capacity(m_size + 1));
|
||||
new (address_of(m_size)) T(move(value));
|
||||
m_size++;
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Vector<T>::PushBack(const T& value)
|
||||
ErrorOr<void> Vector<T>::push_back(const T& value)
|
||||
{
|
||||
return PushBack(Move(T(value)));
|
||||
return push_back(move(T(value)));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template<typename... Args>
|
||||
ErrorOr<void> Vector<T>::EmplaceBack(Args... args)
|
||||
ErrorOr<void> Vector<T>::emplace_back(Args... args)
|
||||
{
|
||||
TRY(EnsureCapasity(m_size + 1));
|
||||
new (AddressOf(m_size)) T(Forward<Args>(args)...);
|
||||
TRY(ensure_capacity(m_size + 1));
|
||||
new (address_of(m_size)) T(forward<Args>(args)...);
|
||||
m_size++;
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template<typename... Args>
|
||||
ErrorOr<void> Vector<T>::Emplace(size_type index, Args... args)
|
||||
ErrorOr<void> Vector<T>::emplace(size_type index, Args... args)
|
||||
{
|
||||
ASSERT(index <= m_size);
|
||||
TRY(EnsureCapasity(m_size + 1));
|
||||
TRY(ensure_capacity(m_size + 1));
|
||||
if (index < m_size)
|
||||
{
|
||||
new (AddressOf(m_size)) T(Move(*AddressOf(m_size - 1)));
|
||||
new (address_of(m_size)) T(move(*address_of(m_size - 1)));
|
||||
for (size_type i = m_size - 1; i > index; i--)
|
||||
*AddressOf(i) = Move(*AddressOf(i - 1));
|
||||
*AddressOf(index) = Move(T(Forward<Args>(args)...));
|
||||
*address_of(i) = move(*address_of(i - 1));
|
||||
*address_of(index) = move(T(forward<Args>(args)...));
|
||||
}
|
||||
else
|
||||
{
|
||||
new (AddressOf(m_size)) T(Forward<Args>(args)...);
|
||||
new (address_of(m_size)) T(forward<Args>(args)...);
|
||||
}
|
||||
m_size++;
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Vector<T>::Insert(size_type index, T&& value)
|
||||
ErrorOr<void> Vector<T>::insert(size_type index, T&& value)
|
||||
{
|
||||
ASSERT(index <= m_size);
|
||||
TRY(EnsureCapasity(m_size + 1));
|
||||
TRY(ensure_capacity(m_size + 1));
|
||||
if (index < m_size)
|
||||
{
|
||||
new (AddressOf(m_size)) T(Move(*AddressOf(m_size - 1)));
|
||||
new (address_of(m_size)) T(move(*address_of(m_size - 1)));
|
||||
for (size_type i = m_size - 1; i > index; i--)
|
||||
*AddressOf(i) = Move(*AddressOf(i - 1));
|
||||
*AddressOf(index) = Move(value);
|
||||
*address_of(i) = move(*address_of(i - 1));
|
||||
*address_of(index) = move(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
new (AddressOf(m_size)) T(Move(value));
|
||||
new (address_of(m_size)) T(move(value));
|
||||
}
|
||||
m_size++;
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Vector<T>::Insert(size_type index, const T& value)
|
||||
ErrorOr<void> Vector<T>::insert(size_type index, const T& value)
|
||||
{
|
||||
return Insert(Move(T(value)), index);
|
||||
return insert(move(T(value)), index);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename Vector<T>::iterator Vector<T>::begin()
|
||||
{
|
||||
return VectorIterator<T>(AddressOf(0));
|
||||
return VectorIterator<T>(address_of(0));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename Vector<T>::iterator Vector<T>::end()
|
||||
{
|
||||
return VectorIterator<T>(AddressOf(m_size));
|
||||
return VectorIterator<T>(address_of(m_size));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename Vector<T>::const_iterator Vector<T>::begin() const
|
||||
{
|
||||
return VectorConstIterator<T>(AddressOf(0));
|
||||
return VectorConstIterator<T>(address_of(0));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename Vector<T>::const_iterator Vector<T>::end() const
|
||||
{
|
||||
return VectorConstIterator<T>(AddressOf(m_size));
|
||||
return VectorConstIterator<T>(address_of(m_size));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Vector<T>::PopBack()
|
||||
void Vector<T>::pop_back()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
AddressOf(m_size - 1)->~T();
|
||||
address_of(m_size - 1)->~T();
|
||||
m_size--;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Vector<T>::Remove(size_type index)
|
||||
void Vector<T>::remove(size_type index)
|
||||
{
|
||||
ASSERT(index < m_size);
|
||||
for (size_type i = index; i < m_size - 1; i++)
|
||||
*AddressOf(i) = Move(*AddressOf(i + 1));
|
||||
AddressOf(m_size - 1)->~T();
|
||||
*address_of(i) = move(*address_of(i + 1));
|
||||
address_of(m_size - 1)->~T();
|
||||
m_size--;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Vector<T>::Clear()
|
||||
void Vector<T>::clear()
|
||||
{
|
||||
for (size_type i = 0; i < m_size; i++)
|
||||
AddressOf(i)->~T();
|
||||
address_of(i)->~T();
|
||||
BAN::deallocator(m_data);
|
||||
m_data = nullptr;
|
||||
m_capacity = 0;
|
||||
@@ -296,10 +296,10 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool Vector<T>::Has(const T& other) const
|
||||
bool Vector<T>::has(const T& other) const
|
||||
{
|
||||
for (size_type i = 0; i < m_size; i++)
|
||||
if (*AddressOf(i) == other)
|
||||
if (*address_of(i) == other)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -308,95 +308,95 @@ namespace BAN
|
||||
const T& Vector<T>::operator[](size_type index) const
|
||||
{
|
||||
ASSERT(index < m_size);
|
||||
return *AddressOf(index);
|
||||
return *address_of(index);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T& Vector<T>::operator[](size_type index)
|
||||
{
|
||||
ASSERT(index < m_size);
|
||||
return *AddressOf(index);
|
||||
return *address_of(index);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T& Vector<T>::Back() const
|
||||
const T& Vector<T>::back() const
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *AddressOf(m_size - 1);
|
||||
return *address_of(m_size - 1);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T& Vector<T>::Back()
|
||||
T& Vector<T>::back()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *AddressOf(m_size - 1);
|
||||
return *address_of(m_size - 1);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T& Vector<T>::Front() const
|
||||
const T& Vector<T>::front() const
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *AddressOf(0);
|
||||
return *address_of(0);
|
||||
}
|
||||
template<typename T>
|
||||
T& Vector<T>::Front()
|
||||
T& Vector<T>::front()
|
||||
{
|
||||
ASSERT(m_size > 0);
|
||||
return *AddressOf(0);
|
||||
return *address_of(0);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Vector<T>::Resize(size_type size)
|
||||
ErrorOr<void> Vector<T>::resize(size_type size)
|
||||
{
|
||||
TRY(EnsureCapasity(size));
|
||||
TRY(ensure_capacity(size));
|
||||
if (size < m_size)
|
||||
for (size_type i = size; i < m_size; i++)
|
||||
AddressOf(i)->~T();
|
||||
address_of(i)->~T();
|
||||
if (size > m_size)
|
||||
for (size_type i = m_size; i < size; i++)
|
||||
new (AddressOf(i)) T();
|
||||
new (address_of(i)) T();
|
||||
m_size = size;
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Vector<T>::Reserve(size_type size)
|
||||
ErrorOr<void> Vector<T>::reserve(size_type size)
|
||||
{
|
||||
TRY(EnsureCapasity(size));
|
||||
TRY(ensure_capacity(size));
|
||||
return {};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool Vector<T>::Empty() const
|
||||
bool Vector<T>::empty() const
|
||||
{
|
||||
return m_size == 0;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename Vector<T>::size_type Vector<T>::Size() const
|
||||
typename Vector<T>::size_type Vector<T>::size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
typename Vector<T>::size_type Vector<T>::Capacity() const
|
||||
typename Vector<T>::size_type Vector<T>::capacity() const
|
||||
{
|
||||
return m_capacity;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<void> Vector<T>::EnsureCapasity(size_type size)
|
||||
ErrorOr<void> Vector<T>::ensure_capacity(size_type size)
|
||||
{
|
||||
if (m_capacity >= size)
|
||||
return {};
|
||||
size_type new_cap = BAN::Math::max<size_type>(size, m_capacity * 3 / 2);
|
||||
uint8_t* new_data = (uint8_t*)BAN::allocator(new_cap * sizeof(T));
|
||||
if (new_data == nullptr)
|
||||
return Error::FromString("Vector: Could not allocate memory");
|
||||
return Error::from_string("Vector: Could not allocate memory");
|
||||
for (size_type i = 0; i < m_size; i++)
|
||||
{
|
||||
new (AddressOf(i, new_data)) T(Move(*AddressOf(i)));
|
||||
AddressOf(i)->~T();
|
||||
new (address_of(i, new_data)) T(move(*address_of(i)));
|
||||
address_of(i)->~T();
|
||||
}
|
||||
BAN::deallocator(m_data);
|
||||
m_data = new_data;
|
||||
@@ -405,7 +405,7 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const T* Vector<T>::AddressOf(size_type index, void* base) const
|
||||
const T* Vector<T>::address_of(size_type index, void* base) const
|
||||
{
|
||||
if (base == nullptr)
|
||||
base = m_data;
|
||||
@@ -413,7 +413,7 @@ namespace BAN
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T* Vector<T>::AddressOf(size_type index, void* base)
|
||||
T* Vector<T>::address_of(size_type index, void* base)
|
||||
{
|
||||
if (base == nullptr)
|
||||
base = m_data;
|
||||
|
||||
Reference in New Issue
Block a user