/* Represents an undirected graph.
 * Also contains the vertex class
 * These are not quite traditional graph theory graphs, because they also have
 * cartesian coordinates, and can do some math to ensure planarity is preserved
 * (that is, planarity in the existant layout, not being isomorphic to a
 * planar)
 *
 * Each vertex also contains a 'colour' and a 'score', which are just integers
 * but may be useful for various algorithms
 *
 * fixme: this isn't a terribly *efficient* setup - Vertices don't know about
 * their neighbors, because the 'edge' class handles that instead. This makes
 * walking the tree O(n^2) or so, which is crappy. However, this implementation
 * is *simple* and will do well for small-to-medium graphs, I suspect
 */

#ifndef _GRAPH_H_
#define _GRAPH_H_

#include "vertex.h"
#include <list>

using std::list;


class Graph
{
 public:
    Graph(bool planar);
    virtual ~Graph();

    list<Vertex*> get_vertices() const { return vertices; }
    list<Vertex*> get_colour(int colour);

    bool point_in_vertex(int x, int y, int z);
    Vertex * vertex_at(int x, int y, int z);
    virtual bool add_vertex(Vertex* v, Vertex* src=NULL);
    void remove_vertex(Vertex* target);

    bool is_planar() const { return planar; }
    void set_planar(bool planar) { this->planar = planar; }

 protected:
    list<Vertex*> vertices;
    bool crosses_edge(Vertex* a, Vertex* b);
    bool vertex_would_overlap(int x, int y, int z, int r);

 private:
    bool planar;
};

#endif