|
@@ -8,6 +8,7 @@
|
|
|
* [Introduction](#introduction)
|
|
* [Introduction](#introduction)
|
|
|
* [Data structures](#data-structures)
|
|
* [Data structures](#data-structures)
|
|
|
* [Adjacency matrix](#adjacency-matrix)
|
|
* [Adjacency matrix](#adjacency-matrix)
|
|
|
|
|
+ * [Dot](#dot)
|
|
|
* [Flow builder](#flow-builder)
|
|
* [Flow builder](#flow-builder)
|
|
|
* [Tasks and resources](#tasks-and-resources)
|
|
* [Tasks and resources](#tasks-and-resources)
|
|
|
* [Fake resources and order of execution](#fake-resources-and-order-of-execution)
|
|
* [Fake resources and order of execution](#fake-resources-and-order-of-execution)
|
|
@@ -37,7 +38,15 @@ development and support of some tools which are also part of the same submodule.
|
|
|
|
|
|
|
|
## Adjacency matrix
|
|
## Adjacency matrix
|
|
|
|
|
|
|
|
-The adjacency matrix is (for now) designed to represent a directed graph.<br/>
|
|
|
|
|
|
|
+The adjacency matrix is designed to represent either a directed or an undirected
|
|
|
|
|
+graph:
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+entt::adjacency_matrix<entt::directed_tag> adjacency_matrix{};
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+The `directed_tag` type _creates_ the graph as directed. There is also an
|
|
|
|
|
+`undirected_tag` counterpart which creates it as undirected.<br/>
|
|
|
The interface deviates slightly from the typical double indexing of C and offers
|
|
The interface deviates slightly from the typical double indexing of C and offers
|
|
|
an API that is perhaps more familiar to a C++ programmer. Therefore, the access
|
|
an API that is perhaps more familiar to a C++ programmer. Therefore, the access
|
|
|
and modification of an element will take place via the `contains`, `insert` and
|
|
and modification of an element will take place via the `contains`, `insert` and
|
|
@@ -61,7 +70,7 @@ An adjacency matrix must be initialized with the number of elements (vertices)
|
|
|
when constructing it but can also be resized later using the `resize` function:
|
|
when constructing it but can also be resized later using the `resize` function:
|
|
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
|
-entt::adjacency_matrix adjacency_matrix{3u};
|
|
|
|
|
|
|
+entt::adjacency_matrix<entt::directed_tag> adjacency_matrix{3u};
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
To visit all vertices, the class offers a function named `vertices` that returns
|
|
To visit all vertices, the class offers a function named `vertices` that returns
|
|
@@ -108,6 +117,32 @@ Finally, the adjacency matrix is an allocator-aware container and offers most of
|
|
|
the functionality one would expect from this type of containers, such as `clear`
|
|
the functionality one would expect from this type of containers, such as `clear`
|
|
|
or 'get_allocator` and so on.
|
|
or 'get_allocator` and so on.
|
|
|
|
|
|
|
|
|
|
+## Dot
|
|
|
|
|
+
|
|
|
|
|
+As it's one of the most popular formats, the library offers minimal support for
|
|
|
|
|
+converting a graph to a dot plot.<br/>
|
|
|
|
|
+The simplest way is to pass both an output stream and a graph to the `dot`
|
|
|
|
|
+function:
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+std::ostringstream output{};
|
|
|
|
|
+entt::dot(output, adjacency_matrix);
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+However, there is also the option of providing a callback to which the vertices
|
|
|
|
|
+are passed and which can be used to add (dot) properties to the output from time
|
|
|
|
|
+to time:
|
|
|
|
|
+
|
|
|
|
|
+```cpp
|
|
|
|
|
+std::ostringstream output{};
|
|
|
|
|
+entt::dot(output, adjacency_matrix, [](auto &output, auto vertex) {
|
|
|
|
|
+ out << "label=\"v\"" << vertex << ",shape=\"box\"";
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+This second mode is particularly convenient when the user wants to associate
|
|
|
|
|
+data managed externally to the graph being converted.
|
|
|
|
|
+
|
|
|
# Flow builder
|
|
# Flow builder
|
|
|
|
|
|
|
|
A flow builder is used to create execution graphs from tasks and resources.<br/>
|
|
A flow builder is used to create execution graphs from tasks and resources.<br/>
|