Program Listing for File directed_graph.hpp

Return to documentation for file (rcppsw/ds/graph/directed_graph.hpp)

#pragma once

/*******************************************************************************
 * Includes
 ******************************************************************************/

#include "rcppsw/ds/graph/graph.hpp"
#include "rcppsw/ds/graph/directed_graph_spec.hpp"
#include "rcppsw/patterns/decorator/decorator.hpp"

/*******************************************************************************
 * Namespaces/Decls
 ******************************************************************************/
namespace rcppsw::ds::graph {

/*******************************************************************************
 * Class Definitions
 ******************************************************************************/
template <typename TSpecType>
class directed_graph : public rpdecorator::decorator<
  typename TSpecType::bgl_impl_type
  > {
 public:
  using spec_type = TSpecType;
  using bgl_impl_type = typename spec_type::bgl_impl_type;

  using decorator_type = typename rpdecorator::decorator<
    bgl_impl_type>::decorator_type;
  using decoratee_type = typename rpdecorator::decorator<
    bgl_impl_type>::decoratee_type;
  using decorator_type::decoratee;

  RCPPSW_DECORATE_DECL(vertex_descriptor);
  RCPPSW_DECORATE_DECL(edge_descriptor);
  RCPPSW_DECORATE_DECL(directed_category);
  RCPPSW_DECORATE_DECL(edge_parallel_category);
  RCPPSW_DECORATE_DECL(traversal_category);
  RCPPSW_DECORATE_DECL(vertex_iterator);

  using vertex_property_type = typename spec_type::vertex_property_type;
  using edge_property_type = typename spec_type::edge_property_type;

  directed_graph(void) = default;
  directed_graph(const directed_graph&) = default;

  RCPPSW_DECORATE_DECLDEF(operator[], const);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, vertices, const);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, find, const);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, adjacent_vertices, const);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, out_edges, const);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, target, const);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, n_vertices, const);

  RCPPSW_DECORATE_DECLDEF(operator[]);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, add_vertex);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, remove_vertex);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, add_edge);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, find);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, vertices);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, adjacent_vertices);
  RCPPSW_DECORATE_DECLDEF_STATIC(rdgraph, target);
};

} /* namespace rcppsw::ds::graph */