/**
 * @file vertex_imp.hpp
 *
 * CopyRight F. J. Madrid-Cuevas <fjmadrid@uco.es>
 *
 * Sólo se permite el uso de este código en la docencia de las asignaturas sobre
 * Estructuras de Datos de la Universidad de Córdoba.
 *
 * Está prohibido su uso para cualquier otro objetivo.
 */
#pragma once
#include <cassert>
#include <vertex.hpp>
#include <graph.hpp>

template <class T>
bool Vertex<T>::is_valid() const
{
    bool ret_v = (graph_ != nullptr && label_ < graph_->order());
    assert(!ret_v || (graph_ != nullptr && label_ < graph_->order()));
    return ret_v;
}

template <class T>
Vertex<T>::Vertex()
{
    label_ = 0;
    graph_ = nullptr;
    assert(!is_valid());
}

template <class T>
Vertex<T>::Vertex(size_t l, WGraph<T> *graph)
{
    assert(graph != nullptr);
    label_ = l;
    graph_ = graph;
    assert(!is_valid() || graph->item(l) == item());
}

template <class T>
const T &Vertex<T>::item() const
{
    assert(is_valid());
    return graph_->item(label_);
}

template <class T>
size_t Vertex<T>::label() const
{
    assert(is_valid());
    return label_;
}

template <class T>
bool Vertex<T>::is_visited() const
{
    assert(is_valid());
    return graph_->is_visited(label_);
}

template <class T>
void Vertex<T>::set_item(T const &v)
{
    assert(is_valid());
    graph_->set_item(label_, v);
    assert(item() == v);
}

template <class T>
void Vertex<T>::set_visited(bool new_st)
{
    assert(is_valid());
    graph_->set_visited(label_, new_st);
    assert(new_st || !is_visited());
    assert(!new_st || is_visited());
}

template <class T>
bool Vertex<T>::operator==(const Vertex<T> &other) const
{
    return graph_ == other.graph_ && label_ == other.label_;
}
