#include "int_buffer.h"

#include <cassert>
#include <utility>

IntBuffer::IntBuffer(std::size_t size)
    : data_(size == 0 ? nullptr : new int[size]()), size_(size) {}

IntBuffer::~IntBuffer() {
    delete[] data_;
}

IntBuffer::IntBuffer(const IntBuffer& other) : IntBuffer(other.size_) {
    for (std::size_t i = 0; i < size_; i++) {
        data_[i] = other.data_[i];
    }
}

IntBuffer& IntBuffer::operator=(const IntBuffer& other) {
    IntBuffer copy(other);
    swap(copy);
    return *this;
}

IntBuffer::IntBuffer(IntBuffer&& other) noexcept
    : data_(other.data_), size_(other.size_) {
    other.data_ = nullptr;
    other.size_ = 0;
}

IntBuffer& IntBuffer::operator=(IntBuffer&& other) noexcept {
    IntBuffer taken(std::move(other));
    swap(taken);
    return *this;
}

std::size_t IntBuffer::size() const {
    return size_;
}

int& IntBuffer::at(std::size_t index) {
    assert(index < size_);
    return data_[index];
}

int IntBuffer::at(std::size_t index) const {
    assert(index < size_);
    return data_[index];
}

void IntBuffer::swap(IntBuffer& other) noexcept {
    std::swap(data_, other.data_);
    std::swap(size_, other.size_);
}

void IntBuffer::check_invariants() const {
    assert((data_ == nullptr) == (size_ == 0));
}
