-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathgenerate_node_list
More file actions
executable file
·102 lines (94 loc) · 5.35 KB
/
generate_node_list
File metadata and controls
executable file
·102 lines (94 loc) · 5.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/bash
set -e
echo '#include "src/graph_factory.hpp"'
echo '#include "src/node_create_function.hpp"'
# load type lists from central registry
EDGE_TYPES=()
RAW_TYPES=()
if [ -f src/edge_types.hpp ]; then
# extract EDGE_DATA_TYPES
while IFS= read -r line; do
t="$(printf '%s\n' "$line" | sed -E 's/^.*X\(([^)]*)\).*/\1/')" ; t="${t//[[:space:]]/}"
if [ -n "$t" ]; then EDGE_TYPES+=("$t"); fi
done < <(awk '/^#define EDGE_DATA_TYPES\(X\)/{flag=1;next} flag&&/^#define/{exit} flag{gsub(/\\/, ""); print}' src/edge_types.hpp | grep -E 'X\(')
# extract EDGE_RAW_DATA_TYPES
while IFS= read -r line; do
t="$(printf '%s\n' "$line" | sed -E 's/^.*X\(([^)]*)\).*/\1/')" ; t="${t//[[:space:]]/}"
if [ -n "$t" ]; then RAW_TYPES+=("$t"); fi
done < <(awk '/^#define EDGE_RAW_DATA_TYPES\(X\)/{flag=1;next} flag&&/^#define/{exit} flag{gsub(/\\/, ""); print}' src/edge_types.hpp | grep -E 'X\(')
fi
for fn in $*; do
sed -e 's/^DECLNODE(\([^, ]\+\), *\([^) ]\+\)).*/class \2;/; t; d' < $fn
sed -e 's/^DECLNODE_ATD\(_RAW\)\{0,1\}\(_ALIAS\)\{0,1\}(\([^, ]\+\), *\([^) ]\+\)).*/std::shared_ptr<Node> createNodeATD_\4(NodeCreationInfo\&);\ntemplate<typename> class \4;/; t; d' < $fn
sed -e 's/^DECLNODE_ATD_TYPES\(_ALIAS\)\{0,1\}(\([^, ]\+\), *\([^) ,]\+\)\(.*\)).*/std::shared_ptr<Node> createNodeATD_\3(NodeCreationInfo\&);\ntemplate<typename> class \3;/; t; d' < $fn
done
echo 'void initFactories(std::unordered_map<std::string, NodeFactoryFunction> &factories) {'
et() { # explicit type specification
t="$1"
echo '\n factories["$+{node}<'$t'>"] = \&createNode<$+{class}<'$t'>>;'
}
for fn in $*; do
perl -ne 's/^DECLNODE(_ALIAS)?\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/ factories["$+{node}"] = \&createNode<$+{class}>;/ && print' < $fn
# DECLNODE_ATD over all EDGE_TYPES
if grep -qE '^DECLNODE_ATD\(' "$fn"; then
perl -ne 's/^DECLNODE_ATD\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/ factories["$+{node}"] = \&createNodeATD_$+{class};/ && print' < "$fn"
for t in "${EDGE_TYPES[@]}"; do
node="$(perl -ne "s/^DECLNODE_ATD\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{node}/ && print" < "$fn")"
class="$(perl -ne "s/^DECLNODE_ATD\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{class}/ && print" < "$fn")"
if [ -n "$node" ] && [ -n "$class" ]; then
echo " factories[\"$node<$t>\"] = &createNode<$class<$t>>;"
fi
done
fi
if grep -qE '^DECLNODE_ATD_ALIAS\(' "$fn"; then
perl -ne 's/^DECLNODE_ATD_ALIAS\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/ factories["$+{node}"] = \&createNodeATD_$+{class};/ && print' < "$fn"
for t in "${EDGE_TYPES[@]}"; do
node="$(perl -ne "s/^DECLNODE_ATD_ALIAS\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{node}/ && print" < "$fn")"
class="$(perl -ne "s/^DECLNODE_ATD_ALIAS\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{class}/ && print" < "$fn")"
if [ -n "$node" ] && [ -n "$class" ]; then
echo " factories[\"$node<$t>\"] = &createNode<$class<$t>>;"
fi
done
fi
# DECLNODE_ATD_RAW over RAW_TYPES
if grep -qE '^DECLNODE_ATD_RAW\(' "$fn"; then
perl -ne 's/^DECLNODE_ATD_RAW\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/ factories["$+{node}"] = \&createNodeATD_$+{class};/ && print' < "$fn"
for t in "${RAW_TYPES[@]}"; do
node="$(perl -ne "s/^DECLNODE_ATD_RAW\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{node}/ && print" < "$fn")"
class="$(perl -ne "s/^DECLNODE_ATD_RAW\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{class}/ && print" < "$fn")"
if [ -n "$node" ] && [ -n "$class" ]; then
echo " factories[\"$node<$t>\"] = &createNode<$class<$t>>;"
fi
done
fi
if grep -qE '^DECLNODE_ATD_RAW_ALIAS\(' "$fn"; then
perl -ne 's/^DECLNODE_ATD_RAW_ALIAS\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/ factories["$+{node}"] = \&createNodeATD_$+{class};/ && print' < "$fn"
for t in "${RAW_TYPES[@]}"; do
node="$(perl -ne "s/^DECLNODE_ATD_RAW_ALIAS\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{node}/ && print" < "$fn")"
class="$(perl -ne "s/^DECLNODE_ATD_RAW_ALIAS\((?<node>[^, ]+), *(?<class>[^) ]+)\).*/\$+{class}/ && print" < "$fn")"
if [ -n "$node" ] && [ -n "$class" ]; then
echo " factories[\"$node<$t>\"] = &createNode<$class<$t>>;"
fi
done
fi
# DECLNODE_ATD_TYPES explicit list
perl -ne '
if (s/^DECLNODE_ATD_TYPES\((?<node>[^, ]+), *(?<class>[^, )]+), *(?<types>[^)]+)\).*/\1/) {
$node=$+{node}; $class=$+{class}; $types=$+{types};
print " factories[\"$node\"] = &createNodeATD_$class;\n";
for $t (split(/,/, $types)) {
$t =~ s/^\s+|\s+$//g;
print " factories[\"$node<$t>\"] = &createNode<$class<$t>>;\n";
}
}' < "$fn"
perl -ne '
if (s/^DECLNODE_ATD_TYPES_ALIAS\((?<node>[^, ]+), *(?<class>[^, )]+), *(?<types>[^)]+)\).*/\1/) {
$node=$+{node}; $class=$+{class}; $types=$+{types};
print " factories[\"$node\"] = &createNodeATD_$class;\n";
for $t (split(/,/, $types)) {
$t =~ s/^\s+|\s+$//g;
print " factories[\"$node<$t>\"] = &createNode<$class<$t>>;\n";
}
}' < "$fn"
done
echo '}'