#ifndef SEQ2D_H
#define SEQ2D_H

#include "PointADT.h"
#include "LineADT.h"
#include "PathADT.h"
#include "MapTypes.h"

#include <vector>

template <class T>
class Seq2D
{
  private: 
    std::vector<std::vector<T>> s;
    double scale;
    nat nRow;
    nat nCol;   

    bool validRow(nat i) const;
    bool validCol(nat j) const;
    bool validPoint(PointT p) const;
    bool validLine(LineT l) const;
    bool validPath(PathT pth) const;
    std::vector<PointT> pointsInLine(LineT l) const;
    std::vector<PointT> pointsInPath(PathT pth) const;
  
  public:
    Seq2D(std::vector<std::vector<T>> s, double scale);
    void set(PointT p, T v);
    T get(PointT p) const;
    nat getNumRow() const;
    nat getNumCol() const;
    double getScale() const;
    nat count(T t) const;
    nat count(LineT l, T t) const;
    nat count(PathT pth, T t) const;
    double length(PathT pth) const;
    bool connected(PointT p1, PointT p2) const;
};

#endif