Unravel Engine C++ Reference
Loading...
Searching...
No Matches
transform_path.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_TRANSFORMPATH_HPP
2#define GENERATOR_TRANSFORMPATH_HPP
3
4#include <functional>
5
6#include "path_vertex.hpp"
7#include "utils.hpp"
8
9namespace generator
10{
11
13template<typename path_t>
15{
16private:
17 using impl_t = path_t;
18 impl_t path_;
19
20public:
22 {
23 public:
25 {
26 auto vertex = vertices_.generate();
27 path_->mutate_(vertex);
28 return vertex;
29 }
30
31 bool done() const noexcept
32 {
33 return vertices_.done();
34 }
35
36 void next()
37 {
38 vertices_.next();
39 }
40
41 private:
42 explicit vertices_t(const transform_path_t& path) : path_{&path}, vertices_{path.path_.vertices()}
43 {
44 }
45
46 const transform_path_t* path_;
47
48 typename vertex_generator_type<path_t>::type vertices_;
49
50 friend class transform_path_t;
51 };
52
55 transform_path_t(path_t path, const std::function<void(path_vertex_t&)>& mutate)
56 : path_{std::move(path)}
57 , mutate_{mutate}
58 {
59 }
60
61 vertices_t vertices() const noexcept
62 {
63 return vertices_t{*this};
64 }
65
66 using edges_t = typename impl_t::edges_t;
67
68 edges_t edges() const noexcept
69 {
70 return path_.edges();
71 }
72
73private:
74 std::function<void(path_vertex_t&)> mutate_;
75};
76
77template<typename path_t>
78transform_path_t<path_t> transform_path(path_t path, const std::function<void(path_vertex_t&)>& mutate)
79{
80 return transform_path_t<path_t>{std::move(path), std::move(mutate)};
81}
82} // namespace generator
83
84#endif
Apply a mutator function to each vertex.
vertices_t vertices() const noexcept
typename impl_t::edges_t edges_t
edges_t edges() const noexcept
transform_path_t(path_t path, const std::function< void(path_vertex_t &)> &mutate)
transform_path_t< path_t > transform_path(path_t path, const std::function< void(path_vertex_t &)> &mutate)