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