#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
