#include <vcg/traced_vector.h>
#include <vcg/simple_temporary_data.h>


#include<vcg/space/point3.h>
#include<vcg/space/color4.h>
using namespace vcg;
#include <vcg/simplex/vertexplus/base.h>
#include<vcg/math/base.h>


class EdgeProto{};
class Vertex0   : public VertexSimp1< Vertex0,EdgeProto,vcg::vert::Coord3fOpt>{};

typedef TVector<Vertex0> TVect;
int main(){
int i;
	
// partial test for CORE DATA ***********
	// put some vertex in a vector
	TVector<Vertex0> c1;

	for( i = 0; i < 10; i++)
		c1.push_back(Vertex0());

	c1.EnableAttribute<Vertex0::CoordType>();	

	// put some more vertex inthe vector
	for( i= 0; i < 10; i++)
		c1.push_back(Vertex0());

	c1[2].P()=Point3f(1.0,2,3);
	Point3f p = c1[2].P();

	// drop  the attributes
	c1.DisableAttribute<Vertex0::CoordType>();	
// *****************************************


// USER DATA
// si puo' fare in 2 modi: Se il container e'di tipo TVector (traced vector)
// si puo'usare 
//(1)	c.NewTempData<TIPO_ATTRIBUTO>(); che  si occupa di resizare
// i container di dati temporanei (cioe' riflette tutte le push_back,reserve,resize 
// eventualemnte fatte sul vettore). NewTempoData resituisce una handle per accedere
// al dato.

// (2) si usa SimpleTempData che e' come uno tranne che non supporta automaticamente
//	le variazioni di dimensione
//	del vettore (si puo' fare a mano pero')...s

// partial test for USER DATA ***********
// modo (1)

	for( i = 0; i < 10; i++)
		c1.push_back(Vertex0());

	CATEntry<TVect,EntryCATMulti<TVect> >::Insert(c1); // questa riga sparira'

	TempData<TVect,int> handle =  c1.NewTempData<int>();
	handle[&c1[3]] = 71;
	// put some more vertex inthe vector
	for( i = 0; i < 10; i++)
		c1.push_back(Vertex0());
	int h = handle[&c1[3]];
	c1.DeleteTempData(handle);
// *****************************************


// partial test for USER DATA ***********
// modo (2)

	std::vector<Vertex0> c;
	for( i = 0; i < 10; i++)
		c.push_back(Vertex0());

	SimpleTempData<std::vector<Vertex0>,int> tmp(c);
	tmp.Start();
	tmp[&c[1]] = 22;
	int hh = tmp[&c[1]];
	tmp.Stop();
// **************************************


	}