joque
task orchestration library
dag.hpp
Go to the documentation of this file.
1 #pragma once
23 
24 #include "joque/bits/list.hpp"
25 
26 namespace joque::bits
27 {
28 
30 {
31  static auto& get( auto& n )
32  {
33  return n.lheader_;
34  }
35 };
36 
38 {
39  static auto& get( auto& n )
40  {
41  return n.lrheader_;
42  }
43 };
44 
45 template < typename T >
46 class gedge
47 {
48 public:
53 
54  gedge( const gedge& other ) = delete;
55  gedge( gedge&& other ) = delete;
56  gedge& operator=( const gedge& other ) = delete;
57  gedge& operator=( gedge&& other ) = delete;
58 
59  template < typename... Args >
60  gedge( Args&&... args )
61  : content_( std::forward< Args >( args )... )
62  {
63  }
64 
66  {
67  return &content_;
68  }
69 
70  const T* operator->() const
71  {
72  return &content_;
73  }
74 
75  T& operator*()
76  {
77  return content_;
78  }
79 
80  const T& operator*() const
81  {
82  return content_;
83  }
84 
85 private:
86  friend lheader_accessor;
87  friend lrheader_accessor;
88 
89  T content_;
90 
91  lheader_type lheader_;
92  lrheader_type lrheader_;
93 };
94 
95 template < typename T, typename EdgeType >
96 class gnode
97 {
98 public:
99  using edge_type = EdgeType;
101  using edge_list = typename edge_type::list_type;
102  using edge_rlist = typename edge_type::rlist_type;
103 
105 
106  gnode() = default;
107 
108  gnode( const gnode& other ) = delete;
109  gnode( gnode&& other ) = delete;
110  gnode& operator=( const gnode& other ) = delete;
111  gnode& operator=( gnode&& other ) = delete;
112 
113  template < typename... Args >
114  gnode( Args&&... args )
115  : content_( std::forward< Args >( args )... )
116  {
117  }
118 
120  {
121  return &content_;
122  }
123 
124  const T* operator->() const
125  {
126  return &content_;
127  }
128 
130  {
131  return content_;
132  }
133 
134  const T& operator*() const
135  {
136  return content_;
137  }
138 
139  [[nodiscard]] edge_list& out_edges()
140  {
141  return out_edges_;
142  }
143 
144  [[nodiscard]] const edge_list& out_edges() const
145  {
146  return out_edges_;
147  }
148 
149  [[nodiscard]] edge_rlist& in_edges()
150  {
151  return in_edges_;
152  }
153 
154  [[nodiscard]] const edge_rlist& in_edges() const
155  {
156  return in_edges_;
157  }
158 
159 private:
160  friend lheader_accessor;
161 
162  T content_;
163 
164  edge_list out_edges_;
165  edge_rlist in_edges_;
166 
167  lheader_type lheader_;
168 };
169 
170 template < typename NodeType >
171 class graph
172 {
173 public:
174  using node_type = NodeType;
175  using edge_type = typename node_type::edge_type;
176  using node_list = typename node_type::list_type;
177 
178  constexpr graph() noexcept = default;
179  graph( const graph& other ) = delete;
180  graph( graph&& other ) = default;
181  graph& operator=( const graph& other ) = delete;
182  graph& operator=( graph&& other ) = default;
183 
184  auto begin()
185  {
186  return nodes_.begin();
187  }
188 
189  [[nodiscard]] auto begin() const
190  {
191  return nodes_.begin();
192  }
193 
194  auto end()
195  {
196  return nodes_.end();
197  }
198 
199  [[nodiscard]] auto end() const
200  {
201  return nodes_.end();
202  }
203 
204  void clear_if( auto&& f )
205  {
206  nodes_.clear_if( f );
207  }
208 
209  template < typename... Ts >
210  node_type& emplace( Ts&&... args )
211  {
212  return nodes_.emplace_front( std::forward< Ts >( args )... );
213  }
214 
215 private:
216  node_list nodes_;
217 };
218 
219 } // namespace joque::bits
Definition: dag.hpp:47
T * operator->()
Definition: dag.hpp:65
const T * operator->() const
Definition: dag.hpp:70
list_header< gedge, lrheader_accessor > lrheader_type
Definition: dag.hpp:50
const T & operator*() const
Definition: dag.hpp:80
gedge & operator=(const gedge &other)=delete
gedge(const gedge &other)=delete
gedge(Args &&... args)
Definition: dag.hpp:60
list_header< gedge, lheader_accessor > lheader_type
Definition: dag.hpp:49
T & operator*()
Definition: dag.hpp:75
gedge & operator=(gedge &&other)=delete
gedge(gedge &&other)=delete
Definition: dag.hpp:97
gnode(gnode &&other)=delete
T * operator->()
Definition: dag.hpp:119
typename edge_type::list_type edge_list
Definition: dag.hpp:101
gnode & operator=(const gnode &other)=delete
list_header< gnode, lheader_accessor > lheader_type
Definition: dag.hpp:100
gnode(const gnode &other)=delete
EdgeType edge_type
Definition: dag.hpp:99
typename edge_type::rlist_type edge_rlist
Definition: dag.hpp:102
const edge_rlist & in_edges() const
Definition: dag.hpp:154
edge_rlist & in_edges()
Definition: dag.hpp:149
T & operator*()
Definition: dag.hpp:129
const edge_list & out_edges() const
Definition: dag.hpp:144
const T & operator*() const
Definition: dag.hpp:134
const T * operator->() const
Definition: dag.hpp:124
edge_list & out_edges()
Definition: dag.hpp:139
gnode(Args &&... args)
Definition: dag.hpp:114
gnode & operator=(gnode &&other)=delete
Definition: dag.hpp:172
typename node_type::list_type node_list
Definition: dag.hpp:176
typename node_type::edge_type edge_type
Definition: dag.hpp:175
constexpr graph() noexcept=default
auto begin()
Definition: dag.hpp:184
auto end() const
Definition: dag.hpp:199
auto begin() const
Definition: dag.hpp:189
node_type & emplace(Ts &&... args)
Definition: dag.hpp:210
NodeType node_type
Definition: dag.hpp:174
auto end()
Definition: dag.hpp:194
void clear_if(auto &&f)
Definition: dag.hpp:204
Definition: list.hpp:152
MIT License.
Definition: dag.hpp:27
Fun && f
Definition: task.hpp:93
Definition: dag.hpp:30
static auto & get(auto &n)
Definition: dag.hpp:31
Definition: dag.hpp:38
static auto & get(auto &n)
Definition: dag.hpp:39