#include "tri.h"
#include <map>

#ifndef _quad_include
#define _quad_include

class Quad
{
  private:
    int v[4];
    Quad *qadj[4];
    Triangle *tadj[4];
    int opp[4];
  public:
    Quad(int v0, int v1, int v2, int v3)
    {
      v[0] = v0;
      v[1] = v1;
      v[2] = v2;
      v[3] = v3;
      qadj[0] = qadj[1] = qadj[2] = qadj[3] = NULL;
      tadj[0] = tadj[1] = tadj[2] = tadj[3] = NULL;
      opp[0] = opp[1] = opp[2] = opp[3] = -1;
    }
    inline int get_vertex(int i)
    {
      return v[i];
    }
    inline void set_adj(int i, Quad *q, Triangle *t, int edge)
    {
      if (q)
      {
	qadj[i] = q;
	opp[i] = edge;
	return;
      }
      
      if (t)
      {
	tadj[i] = t;
	opp[i] = edge;
	return;
      }      
    }
    inline void get_adj(int i, Quad *&q, Triangle *&t)
    {
      q = qadj[i];
      t = tadj[i];
    }
    inline int get_opp(int i)
    {
      return opp[i];
    }
};

class QuadMesh
{
private:  
    Triangulation *_tri;
    
    std::multimap<double, std::pair<Triangle*, int> > _edge_map;
    std::multimap<double, std::pair<Triangle*, int> >::iterator _item;
    std::vector<Quad*> _quad_list;
    std::vector<Triangle*> _tri_list;
  
public:
  QuadMesh(Triangulation *tri);  
  void add_edge(Triangle *t, int edge);
  void export_vtk();
};

#endif