Program Listing for File element_visitor.hpp

Return to documentation for file (include/eat/utilities/element_visitor.hpp)

#pragma once
#include <adm/document.hpp>
#include <any>
#include <functional>
#include <memory>

namespace eat::utilities::element_visitor {

class Visitable;
using VisitablePtr = std::shared_ptr<Visitable>;

using Path = std::vector<VisitablePtr>;

class Visitable {
 public:
  virtual ~Visitable() {}

  virtual bool visit(const std::string &desc, const std::function<void(VisitablePtr)> &) {
    (void)desc;
    return false;
  }

  virtual std::any as_any() = 0;

  template <typename T>
  auto as_t() {
    return std::any_cast<T>(as_any());
  }

  virtual std::string get_description() { return ""; };
};

void visit(const VisitablePtr &start, const std::vector<std::string> &desc,
           const std::function<void(const Path &path)> &cb);

void visit(std::shared_ptr<adm::Document> document, const std::vector<std::string> &desc,
           const std::function<void(const Path &path)> &cb);

void visit(std::shared_ptr<const adm::Document> document, const std::vector<std::string> &desc,
           const std::function<void(const Path &path)> &cb);

std::vector<std::string> path_to_strings(const Path &path);

std::string dotted_path(const std::vector<std::string> &desc);

std::string format_path(const std::vector<std::string> &path);

}  // namespace eat::utilities::element_visitor