#ifndef ROW_H
#define ROW_H

#include <iostream>
#include <cstdint>
#include <cstdlib>

template<typename T>
class row {
private:
    T* p;
    uint32_t n;

public:
    row(T* data, uint32_t size);
    row(const row& other);
    row& operator=(const row& other);
    ~row();

    uint32_t size() const;

    T& operator[](uint32_t index);
    const T& operator[](uint32_t index) const;

    T& at(uint32_t index);
    const T& at(uint32_t index) const;

    template<typename U>
    friend std::ostream& operator<<(std::ostream& os, const row<U>& obj);

    template<typename U>
    friend std::istream& operator>>(std::istream& is, row<U>& obj);
};

#endif
