MongoDB C++ Driver
legacy-1.1.2
|
Representation of a dependency graph of "initialization operations.". More...
#include <initializer_dependency_graph.h>
Public Member Functions | |
Status | addInitializer (const std::string &name, const InitializerFunction &fn, const std::vector< std::string > &prerequisites, const std::vector< std::string > &dependents) |
Add a new initializer node, named "name", to the dependency graph, with the given behavior, "fn", and the given "prerequisites" (input dependencies) and "dependents" (output dependencies). More... | |
InitializerFunction | getInitializerFunction (const std::string &name) const |
Given a dependency operation node named "name", return its behavior function. More... | |
Status | topSort (std::vector< std::string > *sortedNames) const |
Construct a topological sort of the dependency graph, and store that order into "sortedNames". More... | |
Representation of a dependency graph of "initialization operations.".
Each operation has a unique name, a function object implementing the operation's behavior, and a set of prerequisite operations, which may be empty. A legal graph contains no cycles.
Instances of this class are used in two phases. In the first phase, the graph is constructed by repeated calls to addInitializer(). In the second phase, a user calls the topSort() method to produce an initialization order that respects the dependencies among operations, and then uses the getInitializerFunction() to get the behavior function for each operation, in turn.
Concurrency Notes: The user is responsible for synchronization. Multiple threads may simultaneously call the const functions, getInitializerFunction and topSort, on the same instance of InitializerDependencyGraph. However, no thread may call addInitializer while any thread is executing those functions or addInitializer on the same instance.
Status mongo::InitializerDependencyGraph::addInitializer | ( | const std::string & | name, |
const InitializerFunction & | fn, | ||
const std::vector< std::string > & | prerequisites, | ||
const std::vector< std::string > & | dependents | ||
) |
Add a new initializer node, named "name", to the dependency graph, with the given behavior, "fn", and the given "prerequisites" (input dependencies) and "dependents" (output dependencies).
If "!fn" (fn is NULL in function pointer parlance), returns status with code ErrorCodes::badValue. If "name" is a duplicate of a name already present in the graph, returns "ErrorCodes::duplicateKey". Otherwise, returns Status::OK() and adds the new node to the graph. Note that cycles in the dependency graph are not discovered in this phase. Rather, they're discovered by topSort, below.
InitializerFunction mongo::InitializerDependencyGraph::getInitializerFunction | ( | const std::string & | name | ) | const |
Given a dependency operation node named "name", return its behavior function.
Returns a value that evaluates to "false" in boolean context, otherwise.
Status mongo::InitializerDependencyGraph::topSort | ( | std::vector< std::string > * | sortedNames | ) | const |
Construct a topological sort of the dependency graph, and store that order into "sortedNames".
Returns Status::OK() on success.
If the graph contains a cycle, returns ErrorCodes::graphContainsCycle, and "sortedNames" is an ordered sequence of nodes involved in a cycle. In this case, the first and last element of "sortedNames" will be equal.
If any node in the graph names a prerequisite that was never added to the graph via addInitializer, this function will return ErrorCodes::badValue.
Any other return value indicates an internal error, and should not occur.