#pragma once

#include <vector>
#include <array>
#include <boost/geometry.hpp>

#include <boost/units/systems/si.hpp>
#include <boost/units/systems/si/io.hpp>
#include <boost/units/systems/si/plane_angle.hpp>
#include <boost/units/systems/si/prefixes.hpp>
#include <boost/units/systems/angle/degrees.hpp>


namespace bg = boost::geometry;
namespace bu = boost::units;
namespace snake {

typedef bg::model::point<double, 2, bg::cs::cartesian>  BoostPoint;
//typedef std::vector<BoostPoint>                        BoostPointList;
typedef bg::model::polygon<BoostPoint>                  BoostPolygon;
typedef bg::model::linestring<BoostPoint>               BoostLineString;
typedef std::vector<std::vector<int64_t>>               Int64Matrix;
typedef bg::model::box<BoostPoint>                      BoostBox;

typedef bu::quantity<bu::si::length> Length;
typedef bu::quantity<bu::si::area> Area;
typedef bu::quantity<bu::si::plane_angle> Angle;

}

namespace boost{
namespace geometry{
namespace model {
bool operator==(snake::BoostPoint p1, snake::BoostPoint p2){
    return (p1.get<0>() == p2.get<0>()) && (p1.get<1>() == p2.get<1>());
}
bool operator!=(snake::BoostPoint p1, snake::BoostPoint p2){
    return !(p1 == p2);
}
} // namespace model
} // namespace geometry
} // namespace boost
