#ifndef ATS_LINE_H
#define ATS_LINE_H

#include "ats_point.h"
#include <list>

/*******************************************************
* template<class T> class line
* 注意: 直線でなく、線分。
*******************************************************/

namespace ats
{
	template<class T>
	class Line3d
	{
	private:
		Line3d(){}

	public:
		Line3d(Point3d<T> & p, Point3d<T> & v)
			: pnt(p), vec(v) {}
		Line3d(const Line3d<T>& a)
			: pnt(a.pnt), vec(a.vec) {}
		virtual ~Line3d(){}

		Point3d<T> pnt;
		Point3d<T> vec;
	};

	typedef Line3d<double> Line3dd;
	typedef Line3d<float> Line3df;
	typedef Line3d<int> Line3di;

/********************************************************
* template<class T> Polyline
* 概要: list + polylineの開閉を保持するbool
********************************************************/

	template<class T>
	class Polyline3d
	: public std::list< Point3d<T> >
	{
	private:
		Polyline3d(){}

	public:
		Polyline3d(Line3d<T>& a, bool b=false)
			: close(b)
		{
			push(a.pnt);
			push(a.vec);
		}
		Polyline3d(const Polyline3d<T>& a)
			: std::list< Point3d<T> >(a.begin(), a.end()), close(a.close) {}
		virtual ~Polyline3d() {}
		bool close;
	};

	typedef Polyline3d<double> Polyline3dd;
	typedef Polyline3d<float> Polyline3df;
	typedef Polyline3d<int> Polyline3di;
}

#endif // ATS_LINE_H
