1

Array: Add size checking

This commit is contained in:
2022-12-08 15:34:34 +01:00
parent 6086e33343
commit 84a3fb86f4

View File

@ -15,12 +15,11 @@ namespace Container {
*/ */
template<typename T, const std::size_t N> template<typename T, const std::size_t N>
class Array { class Array {
static_assert(N > 0, "Invalid size!");
public: public:
using iterator = ContinuousIterator<T>; using iterator = ContinuousIterator<T>;
private:
T buf[N];
public: public:
Array() = default; // If i write default something like Container::Array<int, 10> arr; is not initialized... Array() = default; // If i write default something like Container::Array<int, 10> arr; is not initialized...
@ -57,9 +56,21 @@ public:
iterator end() const { return iterator(&buf[N]); } iterator end() const { return iterator(&buf[N]); }
constexpr T &operator[](std::size_t i) { return buf[i]; } constexpr T &operator[](std::size_t i) {
if (i >= N) {
// TODO: Exception
}
constexpr const T &operator[](std::size_t i) const { return buf[i]; } return buf[i];
}
constexpr const T &operator[](std::size_t i) const {
if (i >= N) {
// TODO: Exception
}
return buf[i];
}
/** /**
* Get a pointer to the stack allocated memory. * Get a pointer to the stack allocated memory.
@ -70,6 +81,11 @@ public:
const T *data() const { return &buf[0]; } const T *data() const { return &buf[0]; }
/**
* Swap the content of two arrays of the same size.
*
* @param other The array to swap with
*/
void swap(Array<T, N> &other) { void swap(Array<T, N> &other) {
for (std::size_t i = 0; i < N; ++i) { for (std::size_t i = 0; i < N; ++i) {
std::swap(buf[i], other[i]); std::swap(buf[i], other[i]);
@ -78,8 +94,16 @@ public:
// Array& other has to have size n: // Array& other has to have size n:
// arr1.swap_n<5>(arr2) => arr2 has size 5, arr1 has size >= 5 // arr1.swap_n<5>(arr2) => arr2 has size 5, arr1 has size >= 5
/**
* Swap the contents of two arrays with different size.
*
* @tparam n The number of elements to swap
* @param other The array to swap with
*/
template<std::size_t n> template<std::size_t n>
void swap_n(Array<T, n> &other) { void swap_n(Array<T, n> &other) {
static_assert(n <= N && n <= other.size(), "Invalid size!");
for (std::size_t i = 0; i < n; ++i) { for (std::size_t i = 0; i < n; ++i) {
std::swap(buf[i], other[i]); std::swap(buf[i], other[i]);
} }
@ -88,6 +112,9 @@ public:
[[nodiscard]] constexpr std::size_t size() const { [[nodiscard]] constexpr std::size_t size() const {
return N; return N;
} }
private:
T buf[N];
}; };
} // namespace Container } // namespace Container