21 std::cout <<
"Warning: variable " << it_p->
name() <<
"has already been entered\n";
22 std::cout <<
"Overwriting with new value\n";
33 for(
auto& val : deps){
35 g.pointsto.push_back(val);
40 for(
auto& node :
nodes){
41 graphnode& g = node.second;
51 constexpr
char maybe_dep =
'!';
52 constexpr
char exist_dep =
'#';
53 std::list<std::string> gets_removed;
56 if(val[0] == maybe_dep){
58 if(!nodes.count(val)){
59 gets_removed.push_back(val);
63 nodes[val].pointedat.push_back(g.
p->name());
67 else if(val[0] == exist_dep){
68 if(!nodes.count(val)){
70 std::cout<<g.
p->name()<<
" depends on "<<val<<
", which has not been inserted\n";
73 gets_removed.push_back(val);
76 if(!nodes.count(val)){
77 std::cout<<g.
p->name()<<
" depends on "<<val<<
", which has not been inserted\n";
80 nodes[val].pointedat.push_back(g.
p->name());
84 for(
const auto& val : gets_removed){
89 std::list<item_wrapper >
graph::sort(
const std::list<item_wrapper >&
l){
90 std::list<item_wrapper > outlist;
91 std::list<const graphnode*> queuelist;
92 for(
const auto& val: l){
97 for(
const auto& node : nodes){
98 const graphnode& g = node.second;
99 if(g.pointedat.empty()){
100 queuelist.push_back(&g);
104 while(!queuelist.empty()){
105 const graphnode& g = *queuelist.front();
106 queuelist.pop_front();
107 outlist.push_front(g.p);
108 for(
const auto& val : g.pointsto){
109 graphnode& gn = nodes[val];
111 if(gn.pointedat.empty()){
112 queuelist.push_back(&gn);
117 if(l.size() != outlist.size()){
118 err(
"Topological sort has failed, check for cyclical input dependencies",