#pragma once

#ifndef CartoBaseTopologyManager_H
#define CartoBaseTopologyManager_H
#include "base_head.h"
#include "garray_ord.h"
#include "CartoBase.h"
#include "th.h"
class UTILES_EXPORT CartoBaseTopologyManager
{
	CartoBase* cad;
	CartoLine linebuff;
	std::map<int, Cgarray_ord<int, int>*> correcciones;
	
	long ncorrecciones;
	Clock lcorreccines;
public:
	std::map<int, int> referencias;
	long nthread;
	double tolerancia;
	bool terminado;
	bool conErrores;
	char error[128];
	static int comint(int* i1, int* i2)
	{
		return *i1 - *i2;
	}

	CartoBaseTopologyManager(void);
	~CartoBaseTopologyManager(void);

	//funciones topologicas--------------------
	bool revisaTopologia(CartoBase* carto, int nthread);
	 
	
	//funciones topologicas aux--------------------------------------------
	bool DivideLineVirtual(int ie, int ipun);
	bool DivideLine(int ie, int ipun);
	bool RevisaTopo(int ini, int fin);
	bool revisa(CartoBaseInfoEntity* ent);

	bool AddCorreccion(int ie, int pto);

	void AplicaCorrecciones();
};

class UTILES_EXPORT CthRevisaTopologia : public Cth
{
public:
	CartoBaseTopologyManager* topo;
	int ini, fin;
	bool resul;
	virtual void run()
	{
		resul=topo->RevisaTopo(ini, fin);
		if (!lck_sum_atm(&topo->nthread, -1))
		{
			//finalizada revision, toca aplicar correccion
			topo->AplicaCorrecciones();
			topo->terminado = true;
		}
		
	}
};
#endif
