diff --git a/BAN/include/BAN/Vector.h b/BAN/include/BAN/Vector.h index ca1a56fab..6cd321c09 100644 --- a/BAN/include/BAN/Vector.h +++ b/BAN/include/BAN/Vector.h @@ -72,8 +72,12 @@ namespace BAN [[nodiscard]] ErrorOr PushBack(T&&); [[nodiscard]] ErrorOr PushBack(const T&); - [[nodiscard]] ErrorOr Insert(T&&, size_type); - [[nodiscard]] ErrorOr Insert(const T&, size_type); + template + [[nodiscard]] ErrorOr EmplaceBack(Args...); + template + [[nodiscard]] ErrorOr Emplace(size_type, Args...); + [[nodiscard]] ErrorOr Insert(size_type, T&&); + [[nodiscard]] ErrorOr Insert(size_type, const T&); iterator begin(); iterator end(); @@ -180,7 +184,18 @@ namespace BAN } template - ErrorOr Vector::Insert(T&& value, size_type index) + template + ErrorOr Vector::EmplaceBack(Args... args) + { + TRY(EnsureCapasity(m_size + 1)); + new (AddressOf(m_size)) T(Forward(args)...); + m_size++; + return {}; + } + + template + template + ErrorOr Vector::Emplace(size_type index, Args... args) { ASSERT(index <= m_size); TRY(EnsureCapasity(m_size + 1)); @@ -189,14 +204,38 @@ namespace BAN new (AddressOf(m_size)) T(Move(*AddressOf(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)...)); + } + else + { + new (AddressOf(m_size)) T(Forward(args)...); } - *AddressOf(index) = Move(value); m_size++; return {}; } template - ErrorOr Vector::Insert(const T& value, size_type index) + ErrorOr Vector::Insert(size_type index, T&& value) + { + ASSERT(index <= m_size); + TRY(EnsureCapasity(m_size + 1)); + if (index < m_size) + { + new (AddressOf(m_size)) T(Move(*AddressOf(m_size - 1))); + for (size_type i = m_size - 1; i > index; i--) + *AddressOf(i) = Move(*AddressOf(i - 1)); + *AddressOf(index) = Move(value); + } + else + { + new (AddressOf(m_size)) T(Move(value)); + } + m_size++; + return {}; + } + + template + ErrorOr Vector::Insert(size_type index, const T& value) { return Insert(Move(T(value)), index); }