/**********************************************************
 * class Group3D
 *
 * 概要: CompositeパターンのComposite。
 * Compornentの保持にはSTLのlistを使用。
 *
 **********************************************************/

#ifndef ATS_COMPOSITE_H
#define ATS_COMPOSITE_H

#include <list>
#include "ats_point.h"
#include "ats_component.h"

namespace ats
{
	template<class TFLOAT>
	class Group3D : public Obj3D<TFLOAT>
	{
	protected:
		std::list<Obj3D<TFLOAT>* > m_list;

	public:
		Group3D();
		virtual ~Group3D();
		// 移動
		/*virtual void translate(Point<TFLOAT>&);
		// 回転(軸, 角度)
		virtual void rotate(Point<TFLOAT>&, TFLOAT);
		// スケール
		virtual void scale(Point<TFLOAT>&);
		// スライス
		*/

		virtual void Draw();
		virtual void Add(Obj3D<TFLOAT>*);
		virtual void Remove(std::list<Obj3D<TFLOAT>*>::iterator);
		virtual std::list<Obj3D<TFLOAT>*>::iterator Begin();
		virtual std::list<Obj3D<TFLOAT>*>::iterator End();
		virtual int Size() const;
	};

	typedef Group3D<double> Group3DD;

	// コンストラクタ・デストラクタ ----------------------------------------
	template<class TFLOAT>
	Group3D<TFLOAT>::Group3D()
	{

	}
	template<class TFLOAT>
	Group3D<TFLOAT>::~Group3D()
	{
		/*using namespace std;
		typedef list<Obj3D<TFLOAT>*>::iterator ObjectItr;
		// 保持するポインタをすべて開放。
		for(ObjectItr i = m_list.begin(); i != m_list.end(); i++){
			delete *i;
		}*/
	}

	/*

	template<class TFLOAT>
	void Group3D<TFLOAT>::translate(Point<TFLOAT>& a)
	{
		std::list<Obj3D<TFLOAT>*>::iterator i;
		for(i = m_list.begin(); i != m_list.end(); i++){
			(*i)->translate(a);
		}
	}

	template<class TFLOAT>
	void Group3D<TFLOAT>::rotate(Point<TFLOAT>& vec, TFLOAT a)
	{
		std::list<Obj3D<TFLOAT>*>::iterator i;
		for(i = m_list.begin(); i != m_list.end(); i++){
			(*i)->rotate(vec, a);
		}
	}

	template<class TFLOAT>
	void Group3D<TFLOAT>::scale(Point<TFLOAT>& a)
	{
		std::list<Obj3D<TFLOAT>*>::iterator i;
		for(i = m_list.begin(); i == m_list.end(); i++){
			(*i)->scale(a);
		}
	}
	*/

	template<class TFLOAT>
	void Group3D<TFLOAT>::Draw()
	{
		std::list<Obj3D<TFLOAT>*>::iterator i;
		for(i = m_list.begin(); i != m_list.end(); i++){
			(*i)->Draw();
		}
	}

	template<class TFLOAT>
	void Group3D<TFLOAT>::Add(Obj3D<TFLOAT>* obj)
	{
		m_list.push_back(obj);
	}

	template<class TFLOAT>
	void Group3D<TFLOAT>::Remove(std::list<Obj3D<TFLOAT>*>::iterator a)
	{
		m_list.erase(a);
	}

	template<class TFLOAT>
	std::list<Obj3D<TFLOAT>*>::iterator Group3D<TFLOAT>::Begin()
	{
		return m_list.begin();
	}

	template<class TFLOAT>
	std::list<Obj3D<TFLOAT>*>::iterator Group3D<TFLOAT>::End()
	{
		return m_list.end();
	}

	template<class TFLOAT>
	int Group3D<TFLOAT>::Size() const
	{
		return m_list.size();
	}
}

#endif // #ifndef ATS_COMPOSITE_H
