Arbiter
Dependency manager library that supports decentralization
Graph.h
Go to the documentation of this file.
1 #pragma once
2 
3 #ifndef __cplusplus
4 #error "This file must be compiled as C++."
5 #endif
6 
7 #include <arbiter/Graph.h>
8 
9 #include "Dependency.h"
10 #include "Optional.h"
11 #include "Types.h"
12 
13 #include <memory>
14 #include <ostream>
15 #include <unordered_map>
16 #include <vector>
17 
18 struct ArbiterResolvedDependencyGraph final : public Arbiter::Base
19 {
20  public:
21  struct NodeValue final
22  {
23  public:
24  const ArbiterSelectedVersion _version;
25 
26  NodeValue (ArbiterSelectedVersion version, const ArbiterRequirement &requirement);
27 
28  const ArbiterRequirement &requirement () const
29  {
30  return *_requirement;
31  }
32 
33  bool operator== (const NodeValue &other) const;
34 
35  private:
37 
38  std::shared_ptr<ArbiterRequirement> _requirement;
39 
40  void setRequirement (const ArbiterRequirement &requirement);
41  void setRequirement (std::unique_ptr<ArbiterRequirement> requirement);
42  };
43 
44  using NodeKey = ArbiterProjectIdentifier;
45  using NodeMap = std::unordered_map<NodeKey, NodeValue>;
46  using EdgeMap = std::unordered_map<NodeKey, std::set<NodeKey>>;
47 
48  /**
49  * Attempts to add the given node into the graph, as a dependency of
50  * `dependent` if specified.
51  *
52  * If the given node refers to a project which already exists in the graph,
53  * this method will attempt to intersect the version requirements of both.
54  *
55  * Throws an exception if this addition would make the graph inconsistent.
56  */
57  void addNode (ArbiterResolvedDependency node, const ArbiterRequirement &initialRequirement, const Arbiter::Optional<ArbiterProjectIdentifier> &dependent) noexcept(false);
58 
59  const NodeMap &nodes () const
60  {
61  return _nodes;
62  }
63 
64  const EdgeMap &edges () const
65  {
66  return _edges;
67  }
68 
69  static ArbiterResolvedDependency resolveNode (const NodeMap::value_type &node);
70  ArbiterResolvedDependency resolveNode (const NodeMap::key_type &key) const;
71 
72  ArbiterResolvedDependencyInstaller createInstaller () const;
73 
74  std::unique_ptr<Arbiter::Base> clone () const override;
75  std::ostream &describe (std::ostream &os) const override;
76  bool operator== (const Arbiter::Base &other) const override;
77 
78  private:
79  EdgeMap _edges;
80  NodeMap _nodes;
81 };
82 
83 struct ArbiterResolvedDependencyInstaller final : public Arbiter::Base
84 {
85  public:
86  using SortedEdgesMap = std::unordered_map<ArbiterProjectIdentifier, std::vector<ArbiterProjectIdentifier>>;
87  using PhaseSet = std::set<ArbiterResolvedDependency>;
88 
89  std::vector<PhaseSet> _phases;
90  SortedEdgesMap _edges;
91 
93 
94  size_t countInPhase (size_t phaseIndex) const;
95 
96  bool contains (const ArbiterResolvedDependency &node) const;
97 
98  std::unique_ptr<Arbiter::Base> clone () const override;
99  std::ostream &describe (std::ostream &os) const override;
100  bool operator== (const Arbiter::Base &other) const override;
101 };
const ArbiterSelectedVersion _version
Definition: Graph.h:24
bool contains(const ArbiterResolvedDependency &node) const
auto makeIteratorRange(const Collection &collection)
Creates an IteratorRange encompassing the entirety of the given read-only collection.
Definition: Iterator.h:45
const NodeMap & nodes() const
Definition: Graph.h:59
ArbiterResolvedDependency resolveNode(const NodeMap::key_type &key) const
bool operator==(const NodeValue &other) const
const EdgeMap & edges() const
Definition: Graph.h:64
std::ostream & describe(std::ostream &os) const override
ArbiterResolvedDependencyInstaller createInstaller() const
std::unique_ptr< Arbiter::Base > clone() const override
const ArbiterRequirement & requirement() const
Definition: Graph.h:28
bool operator==(const Arbiter::Base &other) const override
size_t countInPhase(size_t phaseIndex) const
std::ostream & describe(std::ostream &os) const override
std::vector< PhaseSet > _phases
Definition: Graph.h:89
static ArbiterResolvedDependency resolveNode(const NodeMap::value_type &node)
std::unique_ptr< Arbiter::Base > clone() const override
bool operator==(const Arbiter::Base &other) const override
friend struct ArbiterResolvedDependencyGraph
Definition: Graph.h:36
NodeValue(ArbiterSelectedVersion version, const ArbiterRequirement &requirement)
void addNode(ArbiterResolvedDependency node, const ArbiterRequirement &initialRequirement, const Arbiter::Optional< ArbiterProjectIdentifier > &dependent) noexcept(false)
Attempts to add the given node into the graph, as a dependency of dependent if specified.
virtual std::unique_ptr< Base > clone() const =0