#pragma once

#include <span>
#include <utility>

struct buffer {
    std::span<std::byte> data;

    buffer() = default;
    buffer(std::span<std::byte> d) : data(d) {}

    static buffer make(size_t size) {
        return buffer({new std::byte[size], size});
    }

    buffer(buffer& other) = delete;
    buffer& operator=(buffer& other) = delete;

    buffer(buffer&& other) : data(std::exchange(other.data, {})) {}
    buffer& operator=(buffer&& other) {
        data = std::exchange(other.data, {});
        return *this;
    }

    ~buffer() {
        if (data.data()) {
            delete[] data.data();
        };
    }
};