svf-tools 1.0.619 → 1.0.621

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +2 -2
  2. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +8 -8
  3. package/SVF-doxygen/html/html/Andersen_8h_source.html +4 -3
  4. package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +9 -4
  5. package/SVF-doxygen/html/html/CFLAlias_8h.html +4 -0
  6. package/SVF-doxygen/html/html/CFLAlias_8h_source.html +19 -10
  7. package/SVF-doxygen/html/html/CFLBase_8cpp_source.html +5 -5
  8. package/SVF-doxygen/html/html/CFLBase_8h_source.html +1 -1
  9. package/SVF-doxygen/html/html/CFLDataBuilder_8h.html +96 -0
  10. package/SVF-doxygen/html/html/CFLDataBuilder_8h_source.html +99 -0
  11. package/SVF-doxygen/html/html/CFLData_8h.html +106 -0
  12. package/SVF-doxygen/html/html/CFLData_8h_source.html +136 -0
  13. package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +2 -2
  14. package/SVF-doxygen/html/html/CFLSolver_8cpp_source.html +7 -7
  15. package/SVF-doxygen/html/html/CFLSolver_8h.html +4 -0
  16. package/SVF-doxygen/html/html/CFLSolver_8h_source.html +22 -16
  17. package/SVF-doxygen/html/html/CFLVF_8cpp_source.html +4 -4
  18. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +2 -2
  19. package/SVF-doxygen/html/html/CommandLine_8h.html +129 -0
  20. package/SVF-doxygen/html/html/CommandLine_8h_source.html +132 -0
  21. package/SVF-doxygen/html/html/ConsGNode_8h_source.html +5 -5
  22. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +4 -4
  23. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
  24. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +2 -2
  25. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +20 -19
  26. package/SVF-doxygen/html/html/DDAPass_8h_source.html +9 -9
  27. package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +2 -2
  28. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +6 -6
  29. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
  30. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +7 -7
  31. package/SVF-doxygen/html/html/GraphWriter_8cpp_source.html +2 -1
  32. package/SVF-doxygen/html/html/GraphWriter_8h_source.html +2 -1
  33. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +1 -1
  34. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +2 -2
  35. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +2 -2
  36. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +2 -2
  37. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +21 -20
  38. package/SVF-doxygen/html/html/LLVMModule_8h_source.html +17 -17
  39. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
  40. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +2 -2
  41. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +2 -2
  42. package/SVF-doxygen/html/html/MHP_8cpp_source.html +2 -2
  43. package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +3 -3
  44. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +2 -2
  45. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +2 -2
  46. package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
  47. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +2 -2
  48. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +3 -3
  49. package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +6 -6
  50. package/SVF-doxygen/html/html/Options_8cpp.html +1 -0
  51. package/SVF-doxygen/html/html/Options_8cpp_source.html +124 -119
  52. package/SVF-doxygen/html/html/Options_8h.html +1 -1
  53. package/SVF-doxygen/html/html/Options_8h_source.html +125 -120
  54. package/SVF-doxygen/html/html/PCG_8cpp.html +2 -1
  55. package/SVF-doxygen/html/html/PCG_8cpp_source.html +13 -12
  56. package/SVF-doxygen/html/html/PCG_8h_source.html +12 -12
  57. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +4 -4
  58. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +13 -13
  59. package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +1 -1
  60. package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +5 -5
  61. package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +5 -5
  62. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +4 -4
  63. package/SVF-doxygen/html/html/SVFIR2ItvExeState_8cpp_source.html +2 -2
  64. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +4 -3
  65. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +1 -1
  66. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +5 -4
  67. package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +3 -3
  68. package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +2 -2
  69. package/SVF-doxygen/html/html/SVFType_8h.html +2 -2
  70. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +2 -2
  71. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +2 -2
  72. package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +2 -2
  73. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +5 -5
  74. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +7 -7
  75. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +4 -4
  76. package/SVF-doxygen/html/html/TCT_8cpp_source.html +2 -2
  77. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +2 -2
  78. package/SVF-doxygen/html/html/VFG_8cpp_source.html +2 -2
  79. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +4 -4
  80. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +10 -9
  81. package/SVF-doxygen/html/html/WPAPass_8h_source.html +4 -4
  82. package/SVF-doxygen/html/html/Z3Expr_8cpp_source.html +2 -2
  83. package/SVF-doxygen/html/html/annotated.html +363 -353
  84. package/SVF-doxygen/html/html/cfl_8cpp.html +3 -85
  85. package/SVF-doxygen/html/html/cfl_8cpp_source.html +3 -5
  86. package/SVF-doxygen/html/html/classOption-members.html +99 -0
  87. package/SVF-doxygen/html/html/classOption.html +567 -0
  88. package/SVF-doxygen/html/html/classOption.png +0 -0
  89. package/SVF-doxygen/html/html/classOptionBase-members.html +95 -0
  90. package/SVF-doxygen/html/html/classOptionBase.html +823 -0
  91. package/SVF-doxygen/html/html/classOptionBase.png +0 -0
  92. package/SVF-doxygen/html/html/classOptionMap-members.html +97 -0
  93. package/SVF-doxygen/html/html/classOptionMap.html +428 -0
  94. package/SVF-doxygen/html/html/classOptionMap.png +0 -0
  95. package/SVF-doxygen/html/html/classOptionMultiple-members.html +97 -0
  96. package/SVF-doxygen/html/html/classOptionMultiple.html +460 -0
  97. package/SVF-doxygen/html/html/classOptionMultiple.png +0 -0
  98. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +2 -2
  99. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +16 -15
  100. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +9 -9
  101. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +6 -6
  102. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +7 -6
  103. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.png +0 -0
  104. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +2 -2
  105. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +2 -2
  106. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +33 -30
  107. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.png +0 -0
  108. package/SVF-doxygen/html/html/classSVF_1_1CFLBase.html +9 -8
  109. package/SVF-doxygen/html/html/classSVF_1_1CFLBase.png +0 -0
  110. package/SVF-doxygen/html/html/classSVF_1_1CFLData-members.html +110 -0
  111. package/SVF-doxygen/html/html/classSVF_1_1CFLData.html +1126 -0
  112. package/SVF-doxygen/html/html/classSVF_1_1CFLDataBuilder-members.html +88 -0
  113. package/SVF-doxygen/html/html/classSVF_1_1CFLDataBuilder.html +380 -0
  114. package/SVF-doxygen/html/html/classSVF_1_1CFLGraphBuilder.html +2 -2
  115. package/SVF-doxygen/html/html/classSVF_1_1CFLNode.html +4 -4
  116. package/SVF-doxygen/html/html/classSVF_1_1CFLSolver.html +48 -39
  117. package/SVF-doxygen/html/html/classSVF_1_1CFLSolver.png +0 -0
  118. package/SVF-doxygen/html/html/classSVF_1_1CFLVF.html +6 -6
  119. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +2 -2
  120. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +2 -2
  121. package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +2 -2
  122. package/SVF-doxygen/html/html/classSVF_1_1CondStdSet.html +2 -2
  123. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode-members.html +26 -26
  124. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +72 -72
  125. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +2 -2
  126. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +2 -2
  127. package/SVF-doxygen/html/html/classSVF_1_1CoreBitVector.html +8 -8
  128. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +2 -2
  129. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +36 -35
  130. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +2 -2
  131. package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +4 -4
  132. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +2 -2
  133. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +2 -2
  134. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +11 -11
  135. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +22 -8
  136. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
  137. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +2 -2
  138. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +2 -2
  139. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +2 -2
  140. package/SVF-doxygen/html/html/classSVF_1_1GraphWriter.html +3 -2
  141. package/SVF-doxygen/html/html/classSVF_1_1HybridData-members.html +89 -0
  142. package/SVF-doxygen/html/html/classSVF_1_1HybridData.html +449 -0
  143. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +2 -2
  144. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +1 -1
  145. package/SVF-doxygen/html/html/classSVF_1_1IntervalExeState.html +8 -8
  146. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +2 -2
  147. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +73 -72
  148. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +2 -2
  149. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +2 -2
  150. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +2 -2
  151. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +2 -2
  152. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +2 -2
  153. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +1 -1
  154. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +10 -10
  155. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +6 -6
  156. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +12 -12
  157. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +2 -2
  158. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +4 -4
  159. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator.html +2 -2
  160. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +8 -8
  161. package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +2 -2
  162. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +2 -2
  163. package/SVF-doxygen/html/html/classSVF_1_1Options-members.html +121 -120
  164. package/SVF-doxygen/html/html/classSVF_1_1Options.html +641 -615
  165. package/SVF-doxygen/html/html/classSVF_1_1PCG.html +28 -28
  166. package/SVF-doxygen/html/html/classSVF_1_1POCRAlias-members.html +281 -0
  167. package/SVF-doxygen/html/html/classSVF_1_1POCRAlias.html +828 -0
  168. package/SVF-doxygen/html/html/classSVF_1_1POCRAlias.png +0 -0
  169. package/SVF-doxygen/html/html/classSVF_1_1POCRSolver-members.html +98 -0
  170. package/SVF-doxygen/html/html/classSVF_1_1POCRSolver.html +245 -0
  171. package/SVF-doxygen/html/html/classSVF_1_1POCRSolver.png +0 -0
  172. package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +2 -2
  173. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +20 -19
  174. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.png +0 -0
  175. package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +2 -2
  176. package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +2 -2
  177. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +2 -2
  178. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +3 -3
  179. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +7 -7
  180. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +9 -9
  181. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +9 -8
  182. package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState.html +2 -2
  183. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +18 -18
  184. package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +6 -6
  185. package/SVF-doxygen/html/html/classSVF_1_1SVFType.html +1 -1
  186. package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +3 -3
  187. package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +2 -2
  188. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +9 -9
  189. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +2 -2
  190. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +11 -11
  191. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +10 -10
  192. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +4 -4
  193. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +2 -2
  194. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +2 -2
  195. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
  196. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +2 -2
  197. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +8 -8
  198. package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +2 -2
  199. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +6 -6
  200. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +27 -26
  201. package/SVF-doxygen/html/html/classSVF_1_1Z3Expr.html +6 -6
  202. package/SVF-doxygen/html/html/classes.html +110 -108
  203. package/SVF-doxygen/html/html/dda_8cpp.html +51 -248
  204. package/SVF-doxygen/html/html/dda_8cpp_source.html +9 -10
  205. package/SVF-doxygen/html/html/dir_95e22971b5dbae2382075a3453e365b4.html +2 -0
  206. package/SVF-doxygen/html/html/dir_ae8aa099e368efaa962140c6624142bc.html +4 -0
  207. package/SVF-doxygen/html/html/files.html +27 -24
  208. package/SVF-doxygen/html/html/functions.html +7 -1
  209. package/SVF-doxygen/html/html/functions_0x7e.html +18 -0
  210. package/SVF-doxygen/html/html/functions_a.html +45 -21
  211. package/SVF-doxygen/html/html/functions_b.html +15 -7
  212. package/SVF-doxygen/html/html/functions_c.html +72 -49
  213. package/SVF-doxygen/html/html/functions_d.html +25 -16
  214. package/SVF-doxygen/html/html/functions_e.html +11 -4
  215. package/SVF-doxygen/html/html/functions_f.html +19 -16
  216. package/SVF-doxygen/html/html/functions_func.html +35 -11
  217. package/SVF-doxygen/html/html/functions_func_0x7e.html +18 -0
  218. package/SVF-doxygen/html/html/functions_func_b.html +11 -3
  219. package/SVF-doxygen/html/html/functions_func_c.html +55 -34
  220. package/SVF-doxygen/html/html/functions_func_e.html +5 -1
  221. package/SVF-doxygen/html/html/functions_func_f.html +4 -1
  222. package/SVF-doxygen/html/html/functions_func_g.html +26 -7
  223. package/SVF-doxygen/html/html/functions_func_h.html +10 -3
  224. package/SVF-doxygen/html/html/functions_func_i.html +25 -10
  225. package/SVF-doxygen/html/html/functions_func_m.html +3 -2
  226. package/SVF-doxygen/html/html/functions_func_n.html +4 -1
  227. package/SVF-doxygen/html/html/functions_func_o.html +23 -6
  228. package/SVF-doxygen/html/html/functions_func_p.html +15 -3
  229. package/SVF-doxygen/html/html/functions_func_s.html +20 -19
  230. package/SVF-doxygen/html/html/functions_func_t.html +3 -0
  231. package/SVF-doxygen/html/html/functions_func_u.html +3 -0
  232. package/SVF-doxygen/html/html/functions_g.html +28 -9
  233. package/SVF-doxygen/html/html/functions_h.html +13 -6
  234. package/SVF-doxygen/html/html/functions_i.html +44 -20
  235. package/SVF-doxygen/html/html/functions_k.html +1 -1
  236. package/SVF-doxygen/html/html/functions_l.html +4 -4
  237. package/SVF-doxygen/html/html/functions_m.html +14 -13
  238. package/SVF-doxygen/html/html/functions_n.html +9 -5
  239. package/SVF-doxygen/html/html/functions_o.html +48 -25
  240. package/SVF-doxygen/html/html/functions_p.html +65 -34
  241. package/SVF-doxygen/html/html/functions_r.html +7 -9
  242. package/SVF-doxygen/html/html/functions_s.html +34 -32
  243. package/SVF-doxygen/html/html/functions_t.html +17 -8
  244. package/SVF-doxygen/html/html/functions_type_c.html +2 -1
  245. package/SVF-doxygen/html/html/functions_type_d.html +3 -0
  246. package/SVF-doxygen/html/html/functions_type_i.html +2 -1
  247. package/SVF-doxygen/html/html/functions_type_o.html +7 -0
  248. package/SVF-doxygen/html/html/functions_type_p.html +6 -0
  249. package/SVF-doxygen/html/html/functions_type_t.html +3 -0
  250. package/SVF-doxygen/html/html/functions_u.html +6 -3
  251. package/SVF-doxygen/html/html/functions_v.html +7 -5
  252. package/SVF-doxygen/html/html/functions_vars.html +7 -1
  253. package/SVF-doxygen/html/html/functions_vars_a.html +7 -7
  254. package/SVF-doxygen/html/html/functions_vars_b.html +1 -1
  255. package/SVF-doxygen/html/html/functions_vars_c.html +15 -12
  256. package/SVF-doxygen/html/html/functions_vars_d.html +21 -15
  257. package/SVF-doxygen/html/html/functions_vars_e.html +5 -2
  258. package/SVF-doxygen/html/html/functions_vars_f.html +6 -6
  259. package/SVF-doxygen/html/html/functions_vars_g.html +2 -2
  260. package/SVF-doxygen/html/html/functions_vars_h.html +1 -1
  261. package/SVF-doxygen/html/html/functions_vars_i.html +14 -6
  262. package/SVF-doxygen/html/html/functions_vars_k.html +1 -1
  263. package/SVF-doxygen/html/html/functions_vars_l.html +4 -4
  264. package/SVF-doxygen/html/html/functions_vars_m.html +11 -11
  265. package/SVF-doxygen/html/html/functions_vars_n.html +3 -2
  266. package/SVF-doxygen/html/html/functions_vars_o.html +5 -2
  267. package/SVF-doxygen/html/html/functions_vars_p.html +34 -21
  268. package/SVF-doxygen/html/html/functions_vars_r.html +5 -5
  269. package/SVF-doxygen/html/html/functions_vars_s.html +13 -10
  270. package/SVF-doxygen/html/html/functions_vars_t.html +7 -4
  271. package/SVF-doxygen/html/html/functions_vars_u.html +3 -3
  272. package/SVF-doxygen/html/html/functions_vars_v.html +6 -4
  273. package/SVF-doxygen/html/html/functions_vars_w.html +3 -3
  274. package/SVF-doxygen/html/html/functions_w.html +11 -7
  275. package/SVF-doxygen/html/html/globals_d.html +4 -4
  276. package/SVF-doxygen/html/html/globals_e.html +6 -6
  277. package/SVF-doxygen/html/html/globals_f.html +2 -2
  278. package/SVF-doxygen/html/html/globals_func.html +6 -58
  279. package/SVF-doxygen/html/html/globals_i.html +4 -12
  280. package/SVF-doxygen/html/html/globals_l.html +2 -2
  281. package/SVF-doxygen/html/html/globals_r.html +4 -4
  282. package/SVF-doxygen/html/html/globals_s.html +0 -4
  283. package/SVF-doxygen/html/html/globals_type.html +3 -0
  284. package/SVF-doxygen/html/html/globals_u.html +3 -0
  285. package/SVF-doxygen/html/html/globals_vars.html +43 -12
  286. package/SVF-doxygen/html/html/hierarchy.html +517 -496
  287. package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +1 -1
  288. package/SVF-doxygen/html/html/menudata.js +1 -2
  289. package/SVF-doxygen/html/html/mta_8cpp.html +4 -47
  290. package/SVF-doxygen/html/html/mta_8cpp_source.html +4 -4
  291. package/SVF-doxygen/html/html/namespaceSVF.html +29 -0
  292. package/SVF-doxygen/html/html/namespaceSVF_1_1DOT.html +3 -2
  293. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +1 -1
  294. package/SVF-doxygen/html/html/namespacemembers_l.html +3 -0
  295. package/SVF-doxygen/html/html/namespacemembers_type_l.html +3 -0
  296. package/SVF-doxygen/html/html/saber_8cpp.html +38 -136
  297. package/SVF-doxygen/html/html/saber_8cpp_source.html +8 -7
  298. package/SVF-doxygen/html/html/search/all_0.js +2 -1
  299. package/SVF-doxygen/html/html/search/all_1.js +15 -8
  300. package/SVF-doxygen/html/html/search/all_10.js +33 -25
  301. package/SVF-doxygen/html/html/search/all_11.js +9 -9
  302. package/SVF-doxygen/html/html/search/all_12.js +22 -22
  303. package/SVF-doxygen/html/html/search/all_13.js +14 -11
  304. package/SVF-doxygen/html/html/search/all_14.js +5 -4
  305. package/SVF-doxygen/html/html/search/all_15.js +5 -5
  306. package/SVF-doxygen/html/html/search/all_16.js +4 -4
  307. package/SVF-doxygen/html/html/search/all_19.js +6 -0
  308. package/SVF-doxygen/html/html/search/all_2.js +5 -3
  309. package/SVF-doxygen/html/html/search/all_3.js +25 -18
  310. package/SVF-doxygen/html/html/search/all_4.js +20 -18
  311. package/SVF-doxygen/html/html/search/all_5.js +8 -6
  312. package/SVF-doxygen/html/html/search/all_6.js +9 -8
  313. package/SVF-doxygen/html/html/search/all_7.js +9 -3
  314. package/SVF-doxygen/html/html/search/all_8.js +5 -3
  315. package/SVF-doxygen/html/html/search/all_9.js +16 -11
  316. package/SVF-doxygen/html/html/search/all_b.js +2 -2
  317. package/SVF-doxygen/html/html/search/all_c.js +7 -6
  318. package/SVF-doxygen/html/html/search/all_d.js +13 -13
  319. package/SVF-doxygen/html/html/search/all_e.js +4 -3
  320. package/SVF-doxygen/html/html/search/all_f.js +24 -6
  321. package/SVF-doxygen/html/html/search/classes_10.js +1 -0
  322. package/SVF-doxygen/html/html/search/classes_2.js +2 -0
  323. package/SVF-doxygen/html/html/search/classes_7.js +2 -1
  324. package/SVF-doxygen/html/html/search/classes_c.js +15 -0
  325. package/SVF-doxygen/html/html/search/classes_d.js +2 -0
  326. package/SVF-doxygen/html/html/search/files_2.js +3 -0
  327. package/SVF-doxygen/html/html/search/functions_0.js +8 -1
  328. package/SVF-doxygen/html/html/search/functions_1.js +4 -2
  329. package/SVF-doxygen/html/html/search/functions_10.js +0 -2
  330. package/SVF-doxygen/html/html/search/functions_11.js +2 -3
  331. package/SVF-doxygen/html/html/search/functions_12.js +1 -0
  332. package/SVF-doxygen/html/html/search/functions_13.js +1 -0
  333. package/SVF-doxygen/html/html/search/functions_17.js +6 -0
  334. package/SVF-doxygen/html/html/search/functions_2.js +5 -1
  335. package/SVF-doxygen/html/html/search/functions_3.js +0 -2
  336. package/SVF-doxygen/html/html/search/functions_4.js +2 -4
  337. package/SVF-doxygen/html/html/search/functions_5.js +2 -1
  338. package/SVF-doxygen/html/html/search/functions_6.js +7 -1
  339. package/SVF-doxygen/html/html/search/functions_7.js +4 -2
  340. package/SVF-doxygen/html/html/search/functions_8.js +6 -3
  341. package/SVF-doxygen/html/html/search/functions_b.js +1 -1
  342. package/SVF-doxygen/html/html/search/functions_c.js +1 -1
  343. package/SVF-doxygen/html/html/search/functions_d.js +1 -0
  344. package/SVF-doxygen/html/html/search/functions_e.js +7 -3
  345. package/SVF-doxygen/html/html/search/functions_f.js +3 -0
  346. package/SVF-doxygen/html/html/search/typedefs_11.js +2 -1
  347. package/SVF-doxygen/html/html/search/typedefs_12.js +1 -1
  348. package/SVF-doxygen/html/html/search/typedefs_2.js +1 -1
  349. package/SVF-doxygen/html/html/search/typedefs_3.js +1 -0
  350. package/SVF-doxygen/html/html/search/typedefs_7.js +1 -1
  351. package/SVF-doxygen/html/html/search/typedefs_a.js +1 -0
  352. package/SVF-doxygen/html/html/search/typedefs_d.js +2 -0
  353. package/SVF-doxygen/html/html/search/typedefs_e.js +2 -0
  354. package/SVF-doxygen/html/html/search/variables_0.js +2 -1
  355. package/SVF-doxygen/html/html/search/variables_1.js +7 -7
  356. package/SVF-doxygen/html/html/search/variables_10.js +25 -21
  357. package/SVF-doxygen/html/html/search/variables_11.js +7 -5
  358. package/SVF-doxygen/html/html/search/variables_12.js +11 -10
  359. package/SVF-doxygen/html/html/search/variables_13.js +9 -8
  360. package/SVF-doxygen/html/html/search/variables_14.js +3 -3
  361. package/SVF-doxygen/html/html/search/variables_15.js +4 -4
  362. package/SVF-doxygen/html/html/search/variables_16.js +3 -3
  363. package/SVF-doxygen/html/html/search/variables_2.js +1 -1
  364. package/SVF-doxygen/html/html/search/variables_3.js +13 -12
  365. package/SVF-doxygen/html/html/search/variables_4.js +19 -15
  366. package/SVF-doxygen/html/html/search/variables_5.js +6 -2
  367. package/SVF-doxygen/html/html/search/variables_6.js +7 -6
  368. package/SVF-doxygen/html/html/search/variables_7.js +2 -2
  369. package/SVF-doxygen/html/html/search/variables_8.js +1 -1
  370. package/SVF-doxygen/html/html/search/variables_9.js +9 -7
  371. package/SVF-doxygen/html/html/search/variables_b.js +1 -1
  372. package/SVF-doxygen/html/html/search/variables_c.js +5 -4
  373. package/SVF-doxygen/html/html/search/variables_d.js +11 -11
  374. package/SVF-doxygen/html/html/search/variables_e.js +2 -2
  375. package/SVF-doxygen/html/html/search/variables_f.js +3 -2
  376. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +4 -4
  377. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +1 -1
  378. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +2 -2
  379. package/SVF-doxygen/html/html/structSVF_1_1GrammarBase_1_1Symbol.html +4 -4
  380. package/SVF-doxygen/html/html/structSVF_1_1HybridData_1_1TreeNode-members.html +86 -0
  381. package/SVF-doxygen/html/html/structSVF_1_1HybridData_1_1TreeNode.html +255 -0
  382. package/SVF-doxygen/html/html/svf-ex_8cpp.html +12 -55
  383. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +8 -8
  384. package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +1 -1
  385. package/SVF-doxygen/html/html/wpa_8cpp.html +4 -47
  386. package/SVF-doxygen/html/html/wpa_8cpp_source.html +4 -4
  387. package/include/CFL/CFLAlias.h +34 -0
  388. package/include/CFL/CFLData.h +316 -0
  389. package/include/CFL/CFLDataBuilder.h +91 -0
  390. package/include/CFL/CFLSolver.h +21 -0
  391. package/include/Util/CommandLine.h +527 -0
  392. package/include/Util/Options.h +125 -124
  393. package/include/WPA/Andersen.h +5 -5
  394. package/lib/AbstractExecution/SVFIR2ItvExeState.cpp +2 -2
  395. package/lib/CFL/CFLAlias.cpp +40 -4
  396. package/lib/CFL/CFLBase.cpp +4 -4
  397. package/lib/CFL/CFLGraphBuilder.cpp +2 -2
  398. package/lib/CFL/CFLVF.cpp +5 -5
  399. package/lib/DDA/ContextDDA.cpp +1 -1
  400. package/lib/DDA/DDAPass.cpp +14 -13
  401. package/lib/DDA/FlowDDA.cpp +1 -1
  402. package/lib/Graphs/ConsG.cpp +10 -10
  403. package/lib/Graphs/ICFG.cpp +1 -1
  404. package/lib/Graphs/IRGraph.cpp +2 -2
  405. package/lib/Graphs/SVFG.cpp +5 -5
  406. package/lib/Graphs/SVFGOPT.cpp +5 -5
  407. package/lib/Graphs/VFG.cpp +1 -1
  408. package/lib/MSSA/MemRegion.cpp +2 -2
  409. package/lib/MSSA/MemSSA.cpp +4 -4
  410. package/lib/MSSA/SVFGBuilder.cpp +4 -4
  411. package/lib/MTA/FSMPTA.cpp +13 -13
  412. package/lib/MTA/MHP.cpp +1 -1
  413. package/lib/MTA/MTA.cpp +2 -2
  414. package/lib/MTA/MTAStat.cpp +1 -1
  415. package/lib/MTA/PCG.cpp +8 -2
  416. package/lib/MTA/TCT.cpp +2 -2
  417. package/lib/MemoryModel/PointerAnalysis.cpp +13 -13
  418. package/lib/MemoryModel/PointerAnalysisImpl.cpp +13 -13
  419. package/lib/MemoryModel/PointsTo.cpp +1 -1
  420. package/lib/SABER/DoubleFreeChecker.cpp +1 -1
  421. package/lib/SABER/LeakChecker.cpp +1 -1
  422. package/lib/SABER/SaberCondAllocator.cpp +1 -1
  423. package/lib/SABER/SrcSnkDDA.cpp +5 -5
  424. package/lib/SVF-LLVM/CHGBuilder.cpp +1 -1
  425. package/lib/SVF-LLVM/DCHG.cpp +1 -1
  426. package/lib/SVF-LLVM/LLVMLoopAnalysis.cpp +2 -2
  427. package/lib/SVF-LLVM/LLVMModule.cpp +10 -4
  428. package/lib/SVF-LLVM/SVFIRBuilder.cpp +8 -8
  429. package/lib/SVF-LLVM/SymbolTableBuilder.cpp +5 -5
  430. package/lib/SVFIR/SVFIR.cpp +4 -4
  431. package/lib/SVFIR/SVFStatements.cpp +16 -16
  432. package/lib/SVFIR/SVFVariables.cpp +5 -5
  433. package/lib/SVFIR/SymbolTableInfo.cpp +6 -6
  434. package/lib/Util/NodeIDAllocator.cpp +9 -9
  435. package/lib/Util/Options.cpp +431 -412
  436. package/lib/Util/SVFStat.cpp +5 -5
  437. package/lib/Util/SVFUtil.cpp +1 -1
  438. package/lib/Util/Z3Expr.cpp +2 -2
  439. package/lib/WPA/Andersen.cpp +13 -13
  440. package/lib/WPA/AndersenSCD.cpp +3 -3
  441. package/lib/WPA/FlowSensitive.cpp +8 -8
  442. package/lib/WPA/TypeAnalysis.cpp +1 -1
  443. package/lib/WPA/VersionedFlowSensitive.cpp +4 -4
  444. package/lib/WPA/WPAPass.cpp +10 -9
  445. package/package.json +1 -1
  446. package/tools/CFL/cfl.cpp +8 -14
  447. package/tools/DDA/dda.cpp +39 -29
  448. package/tools/Example/svf-ex.cpp +5 -8
  449. package/tools/MTA/LockResultValidator.cpp +2 -2
  450. package/tools/MTA/MTAAnnotator.cpp +5 -5
  451. package/tools/MTA/MTAResultValidator.cpp +8 -8
  452. package/tools/MTA/mta.cpp +5 -8
  453. package/tools/SABER/saber.cpp +23 -17
  454. package/tools/WPA/wpa.cpp +6 -9
@@ -66,7 +66,7 @@ $(function() {
66
66
  <div class="title">GraphWriter.h</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="GraphWriter_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- Graphs/GraphWriter.h - Write graph to a .dot file --*- C++ -*-===//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// From the LLVM Project with some modifications, under the Apache License v2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// with LLVM Exceptions. See https://llvm.org/LICENSE.txt for license information.</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// This file defines a simple interface that can be used to print out generic</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// LLVM graphs to &quot;.dot&quot; files. &quot;dot&quot; is a tool that is part of the AT&amp;T</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// graphviz package (http://www.research.att.com/sw/tools/graphviz/) which can</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// be used to turn the files output by this interface into a variety of</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// different graphics formats.</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// Graphs do not need to implement any interface past what is already required</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// by the GraphTraits template, but they can choose to implement specializations</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">// of the DOTGraphTraits template if they want to customize the graphs output in</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// any way.</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#ifndef GRAPHS_GRAPHWRITER_H</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#define GRAPHS_GRAPHWRITER_H</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="GraphTraits_8h.html">Graphs/GraphTraits.h</a>&quot;</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="DOTGraphTraits_8h.html">Graphs/DOTGraphTraits.h</a>&quot;</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &lt;cstddef&gt;</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &lt;iterator&gt;</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &lt;type_traits&gt;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &lt;fstream&gt;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;{</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1DOT.html"> 40</a></span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c">DOT</a> <span class="comment">// Private functions...</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;{</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">EscapeStr</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Label);</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;} <span class="comment">// end namespace DOT</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html"> 47</a></span>&#160;<span class="keyword">namespace </span>GraphProgram</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;{</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;</div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37"> 50</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37">Name</a></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;{</div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c"> 52</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c">DOT</a>,</div><div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac3a20ad67d8b23a37a2c81ef793323a9"> 53</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac3a20ad67d8b23a37a2c81ef793323a9">FDP</a>,</div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a280cacd79d09366b6832ebc6e54b5a9c"> 54</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a280cacd79d09366b6832ebc6e54b5a9c">NEATO</a>,</div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac6a6eaaa34322cf54953ba390895f0c5"> 55</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac6a6eaaa34322cf54953ba390895f0c5">TWOPI</a>,</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a88732178df8f5804ab976cc48e584674"> 56</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a88732178df8f5804ab976cc48e584674">CIRCO</a></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;};</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;} <span class="comment">// end namespace GraphProgram</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html"> 62</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1GraphWriter.html">GraphWriter</a></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;{</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a2e882c9af39ffd3c4a4bac9212e0e82d"> 64</a></span>&#160; std::ofstream &amp;<a class="code" href="classSVF_1_1GraphWriter.html#a2e882c9af39ffd3c4a4bac9212e0e82d">O</a>;</div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a0ac109f9b3c3b3fe3cb61bbef09e0d29"> 65</a></span>&#160; <span class="keyword">const</span> GraphType &amp;<a class="code" href="classSVF_1_1GraphWriter.html#a0ac109f9b3c3b3fe3cb61bbef09e0d29">G</a>;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a245d85f8c907a409533ab151e9e3d9a2"> 67</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTTraits</a> = <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTGraphTraits&lt;GraphType&gt;</a>;</div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a65144f9ff432d21ad2751287a7237b3f"> 68</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1GenericGraphTraits.html">GTraits</a> = <a class="code" href="structSVF_1_1GenericGraphTraits.html">GenericGraphTraits&lt;GraphType&gt;</a>;</div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6"> 69</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1GenericGraphTraits.html#a05654ab9615d75bc8e5f8c5cf9297205">GTraits::NodeRef</a>;</div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ab7ac9f47cedfc1f7c4cc3b16f5349427"> 70</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1GraphWriter.html#ab7ac9f47cedfc1f7c4cc3b16f5349427">node_iterator</a> = <span class="keyword">typename</span> GTraits::nodes_iterator;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56"> 71</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> = <span class="keyword">typename</span> GTraits::ChildIteratorType;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a36f1ca2744fae2f45400e82f39e4fcd8"> 72</a></span>&#160; <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTTraits</a> <a class="code" href="classSVF_1_1GraphWriter.html#a36f1ca2744fae2f45400e82f39e4fcd8">DTraits</a>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; static_assert(std::is_pointer&lt;NodeRef&gt;::value,</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="stringliteral">&quot;FIXME: Currently GraphWriter requires the NodeRef type to be &quot;</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="stringliteral">&quot;a pointer.\nThe pointer usage should be moved to &quot;</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="stringliteral">&quot;DOTGraphTraits, and removed from GraphWriter itself.&quot;</span>);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="comment">// Writes the edge labels of the node to O and returns true if there are any</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">// edge labels not equal to the empty string &quot;&quot;.</span></div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#aa2d0fada900a8e08af0539498905a74f"> 81</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1GraphWriter.html#aa2d0fada900a8e08af0539498905a74f">getEdgeSourceLabels</a>(std::stringstream &amp;O2, <a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node)</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EI = GTraits::child_begin(Node);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EE = GTraits::child_end(Node);</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordtype">bool</span> hasEdgeSourceLabels = <span class="keyword">false</span>;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; EI != EE &amp;&amp; i != 64; ++EI, ++i)</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; {</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> label = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a66f5994cdef8fa307c9ff69ca90a1d6c">getEdgeSourceLabel</a>(Node, EI);</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">if</span> (label.empty())</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; hasEdgeSourceLabels = <span class="keyword">true</span>;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordflow">if</span> (i)</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; O2 &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; O2 &lt;&lt; <span class="stringliteral">&quot;&lt;s&quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(label);</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">if</span> (EI != EE &amp;&amp; hasEdgeSourceLabels)</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; O2 &lt;&lt; <span class="stringliteral">&quot;|&lt;s64&gt;truncated...&quot;</span>;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keywordflow">return</span> hasEdgeSourceLabels;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; }</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#afd8fec784307b919d1cb89b49533600e"> 109</a></span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#afd8fec784307b919d1cb89b49533600e">GraphWriter</a>(std::ofstream &amp;o, <span class="keyword">const</span> GraphType &amp;g, <span class="keywordtype">bool</span> SN) : O(o), G(g)</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; DTraits = <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTTraits</a>(SN);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; }</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ae414407f483b60c9fa49e2f3ae62de30"> 114</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#ae414407f483b60c9fa49e2f3ae62de30">writeGraph</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Title = <span class="stringliteral">&quot;&quot;</span>)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="comment">// Output the header for the graph...</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; writeHeader(Title);</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="comment">// Emit all of the nodes in the graph...</span></div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; writeNodes();</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="comment">// Output any customizations on the graph</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a47ee60dc78e3f869ce4e808e73437ddf">DOTGraphTraits&lt;GraphType&gt;::addCustomGraphFeatures</a>(G, *<span class="keyword">this</span>);</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="comment">// Output the end of the graph</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; writeFooter();</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; }</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#abd376959cc889e1e387523f38674650f"> 129</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#abd376959cc889e1e387523f38674650f">writeHeader</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Title)</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> GraphName(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a41effe5697618840e0d5ea10c26781fe">getGraphName</a>(G));</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">if</span> (!Title.empty())</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;digraph \&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Title) &lt;&lt; <span class="stringliteral">&quot;\&quot; {\n&quot;</span>;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!GraphName.empty())</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;digraph \&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(GraphName) &lt;&lt; <span class="stringliteral">&quot;\&quot; {\n&quot;</span>;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;digraph unnamed {\n&quot;</span>;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>())</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\trankdir=\&quot;BT\&quot;;\n&quot;</span>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">if</span> (!Title.empty())</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tlabel=\&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Title) &lt;&lt; <span class="stringliteral">&quot;\&quot;;\n&quot;</span>;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!GraphName.empty())</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tlabel=\&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(GraphName) &lt;&lt; <span class="stringliteral">&quot;\&quot;;\n&quot;</span>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; O &lt;&lt; DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#afe384157441d5ef0b3aafdfb6cd3028a">getGraphProperties</a>(G);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; }</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a5c3ce0eba24c71f847676b23b855e44c"> 151</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a5c3ce0eba24c71f847676b23b855e44c">writeFooter</a>()</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="comment">// Finish off the graph</span></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}\n&quot;</span>;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ada2363727dc20c2183b8252f3bdf3a04"> 157</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#ada2363727dc20c2183b8252f3bdf3a04">writeNodes</a>()</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="comment">// Loop over the graph, printing it out...</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> Node : nodes&lt;GraphType&gt;(G))</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordflow">if</span> (!isNodeHidden(Node))</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; writeNode(Node);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; }</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a8b1d80caf226c3a619c5fb03f8724f74"> 165</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1GraphWriter.html#a8b1d80caf226c3a619c5fb03f8724f74">isNodeHidden</a>(<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node)</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ae73ba55d72d5df1f70a2bfa2e12958f3">isNodeHidden</a>(Node, G);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a18c579b53feccbb3b521982c6161f555"> 170</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a18c579b53feccbb3b521982c6161f555">writeNode</a>(<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node)</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> NodeAttributes = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a3438f5f1ed763f2f7818535f212ff43b">getNodeAttributes</a>(Node, G);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tNode&quot;</span> &lt;&lt; <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(Node) &lt;&lt; <span class="stringliteral">&quot; [shape=record,&quot;</span>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span> (!NodeAttributes.empty()) O &lt;&lt; NodeAttributes &lt;&lt; <span class="stringliteral">&quot;,&quot;</span>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;label=\&quot;{&quot;</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>())</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a07487bbf691110420c680250994a6eba">getNodeLabel</a>(Node, G));</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="comment">// If we should include the address of the node in the label, do so now.</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> Id = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a0f81b82658f62589ec429c601538f6e9">getNodeIdentifierLabel</a>(Node, G);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">if</span> (!Id.empty())</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Id);</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> NodeDesc = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#af5800f2d8efa24fee85f03871c07df21">getNodeDescription</a>(Node, G);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">if</span> (!NodeDesc.empty())</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(NodeDesc);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; }</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> edgeSourceLabels;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; std::stringstream EdgeSourceLabels(edgeSourceLabels);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordtype">bool</span> hasEdgeSourceLabels = getEdgeSourceLabels(EdgeSourceLabels, Node);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordflow">if</span> (hasEdgeSourceLabels)</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>()) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;{&quot;</span> &lt;&lt; EdgeSourceLabels.str() &lt;&lt; <span class="stringliteral">&quot;}&quot;</span>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>()) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>())</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; {</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a07487bbf691110420c680250994a6eba">getNodeLabel</a>(Node, G));</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// If we should include the address of the node in the label, do so now.</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> Id = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a0f81b82658f62589ec429c601538f6e9">getNodeIdentifierLabel</a>(Node, G);</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">if</span> (!Id.empty())</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Id);</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> NodeDesc = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#af5800f2d8efa24fee85f03871c07df21">getNodeDescription</a>(Node, G);</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="keywordflow">if</span> (!NodeDesc.empty())</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(NodeDesc);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a87d7b47985a849c7c4ff1c328a59c623">hasEdgeDestLabels</a>())</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|{&quot;</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordtype">unsigned</span> i = 0, e = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a94f582264d3020f36a2ca3bdfbdaf81b">numEdgeDestLabels</a>(Node);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">for</span> (; i != e &amp;&amp; i != 64; ++i)</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">if</span> (i) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;&lt;d&quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span></div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a5e560e93632e0ed1934d4c4508ca1884">getEdgeDestLabel</a>(Node, i));</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; }</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">if</span> (i != e)</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&lt;d64&gt;truncated...&quot;</span>;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}&quot;</span>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}\&quot;];\n&quot;</span>; <span class="comment">// Finish printing the &quot;node&quot; line</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="comment">// Output all of the edges now</span></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EI = GTraits::child_begin(Node);</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EE = GTraits::child_end(Node);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; EI != EE &amp;&amp; i != 64; ++EI, ++i)</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ae73ba55d72d5df1f70a2bfa2e12958f3">isNodeHidden</a>(*EI, G))</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; writeEdge(Node, i, EI);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">for</span> (; EI != EE; ++EI)</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ae73ba55d72d5df1f70a2bfa2e12958f3">isNodeHidden</a>(*EI, G))</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; writeEdge(Node, 64, EI);</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; }</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a6133d0033363b0e9db156c354da7d7e6"> 249</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a6133d0033363b0e9db156c354da7d7e6">writeEdge</a>(<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node, <span class="keywordtype">unsigned</span> edgeidx, <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EI)</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; {</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> TargetNode = *EI)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordtype">int</span> DestPort = -1;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a78c40f9b1af839116b88519fca154396">edgeTargetsEdgeSource</a>(Node, EI))</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> TargetIt = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#acfab6216e24999e92b2354e4f15b96b6">getEdgeTarget</a>(Node, EI);</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// Figure out which edge this targets...</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="keywordtype">unsigned</span> Offset =</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; (unsigned)std::distance(GTraits::child_begin(TargetNode), TargetIt);</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; DestPort = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(Offset);</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; }</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a66f5994cdef8fa307c9ff69ca90a1d6c">getEdgeSourceLabel</a>(Node, EI).empty())</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; edgeidx = -1;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; emitEdge(static_cast&lt;const void*&gt;(Node), edgeidx,</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; static_cast&lt;const void*&gt;(TargetNode), DestPort,</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ad84c95525cf15f90848c2558fd28f43b">getEdgeAttributes</a>(Node, EI, G));</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; }</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; }</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;</div><div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a0feff91ed80b997dd4550fae16382768"> 274</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a0feff91ed80b997dd4550fae16382768">emitSimpleNode</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *ID, <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Attr,</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Label, <span class="keywordtype">unsigned</span> NumEdgeSources = 0,</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="keyword">const</span> std::vector&lt;std::string&gt; *EdgeSourceLabels = <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; {</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tNode&quot;</span> &lt;&lt; ID &lt;&lt; <span class="stringliteral">&quot;[ &quot;</span>;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">if</span> (!Attr.empty())</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; O &lt;&lt; Attr &lt;&lt; <span class="stringliteral">&quot;,&quot;</span>;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; O &lt;&lt; <span class="stringliteral">&quot; label =\&quot;&quot;</span>;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">if</span> (NumEdgeSources) O &lt;&lt; <span class="stringliteral">&quot;{&quot;</span>;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Label);</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keywordflow">if</span> (NumEdgeSources)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|{&quot;</span>;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i != NumEdgeSources; ++i)</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; {</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="keywordflow">if</span> (i) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;&lt;s&quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span>;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keywordflow">if</span> (EdgeSourceLabels) O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>((*EdgeSourceLabels)[i]);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}}&quot;</span>;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\&quot;];\n&quot;</span>;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a320577b81479578a8e6021380f9c07a7"> 300</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a320577b81479578a8e6021380f9c07a7">emitEdge</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *SrcNodeID, <span class="keywordtype">int</span> SrcNodePort,</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keyword">const</span> <span class="keywordtype">void</span> *DestNodeID, <span class="keywordtype">int</span> DestNodePort,</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Attrs)</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; {</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">if</span> (SrcNodePort &gt; 64) <span class="keywordflow">return</span>; <span class="comment">// Eminating from truncated part?</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">if</span> (DestNodePort &gt; 64) DestNodePort = 64; <span class="comment">// Targeting the truncated part?</span></div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tNode&quot;</span> &lt;&lt; SrcNodeID;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="keywordflow">if</span> (SrcNodePort &gt;= 0)</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;:s&quot;</span> &lt;&lt; SrcNodePort;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; O &lt;&lt; <span class="stringliteral">&quot; -&gt; Node&quot;</span> &lt;&lt; DestNodeID;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordflow">if</span> (DestNodePort &gt;= 0 &amp;&amp; DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a87d7b47985a849c7c4ff1c328a59c623">hasEdgeDestLabels</a>())</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;:d&quot;</span> &lt;&lt; DestNodePort;</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">if</span> (!Attrs.empty())</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; Attrs &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;;\n&quot;</span>;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; }</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#afa5d94effc56067e44eba9a11afd5284"> 321</a></span>&#160; std::ofstream &amp;<a class="code" href="classSVF_1_1GraphWriter.html#afa5d94effc56067e44eba9a11afd5284">getOStream</a>()</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordflow">return</span> O;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; }</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160;};</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00328"></a><span class="lineno"><a class="line" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd"> 328</a></span>&#160;std::ofstream &amp;<a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">WriteGraph</a>(std::ofstream &amp;O, <span class="keyword">const</span> GraphType &amp;G,</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordtype">bool</span> ShortNames = <span class="keyword">false</span>)</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;{</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="comment">// Start the graph emission process...</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html">GraphWriter&lt;GraphType&gt;</a> W(O, G, ShortNames);</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="comment">// Emit the graph.</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; W.<a class="code" href="classSVF_1_1GraphWriter.html#ae414407f483b60c9fa49e2f3ae62de30">writeGraph</a>(<span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keywordflow">return</span> O;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;}</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00345"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a587614f74cb00a35a423559265239798"> 345</a></span>&#160;<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">WriteGraph</a>(<span class="keyword">const</span> GraphType &amp;G,</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordtype">bool</span> ShortNames = <span class="keyword">false</span>,</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> Filename = <span class="stringliteral">&quot;&quot;</span>)</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160;{</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; std::ofstream O(Filename);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (O.fail())</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; std::cerr &lt;&lt; <span class="stringliteral">&quot;error opening file &#39;&quot;</span> &lt;&lt; Filename &lt;&lt; <span class="stringliteral">&quot;&#39; for writing!\n&quot;</span>;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; O.close();</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">SVF::WriteGraph</a>(O, G, ShortNames);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; O.close();</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; std::cerr &lt;&lt; <span class="stringliteral">&quot; done. \n&quot;</span>;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">return</span> Filename;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160;}</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00371"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a4582a7d33a5631a5a38973f50035327e"> 371</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceSVF.html#a4582a7d33a5631a5a38973f50035327e">ViewGraph</a>(<span class="keyword">const</span> GraphType &amp;G,<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>&amp; <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>,</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="keywordtype">bool</span> ShortNames = <span class="keyword">false</span>,</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37">GraphProgram::Name</a> Program = <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c">GraphProgram::DOT</a>)</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160;{</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">SVF::WriteGraph</a>(G, ShortNames);</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;}</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160;</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160;} <span class="comment">// end namespace llvm</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160;<span class="preprocessor">#endif // LLVM_SUPPORT_GRAPHWRITER_H</span></div><div class="ttc" id="classSVF_1_1GraphWriter_html_a18c579b53feccbb3b521982c6161f555"><div class="ttname"><a href="classSVF_1_1GraphWriter.html#a18c579b53feccbb3b521982c6161f555">SVF::GraphWriter::writeNode</a></div><div class="ttdeci">void writeNode(NodeRef Node)</div><div class="ttdef"><b>Definition:</b> <a href="GraphWriter_8h_source.html#l00170">GraphWriter.h:170</a></div></div>
69
+ <a href="GraphWriter_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- Graphs/GraphWriter.h - Write graph to a .dot file --*- C++ -*-===//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// From the LLVM Project with some modifications, under the Apache License v2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// with LLVM Exceptions. See https://llvm.org/LICENSE.txt for license information.</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// This file defines a simple interface that can be used to print out generic</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// LLVM graphs to &quot;.dot&quot; files. &quot;dot&quot; is a tool that is part of the AT&amp;T</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// graphviz package (http://www.research.att.com/sw/tools/graphviz/) which can</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// be used to turn the files output by this interface into a variety of</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// different graphics formats.</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// Graphs do not need to implement any interface past what is already required</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// by the GraphTraits template, but they can choose to implement specializations</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">// of the DOTGraphTraits template if they want to customize the graphs output in</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// any way.</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#ifndef GRAPHS_GRAPHWRITER_H</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#define GRAPHS_GRAPHWRITER_H</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="GraphTraits_8h.html">Graphs/GraphTraits.h</a>&quot;</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="DOTGraphTraits_8h.html">Graphs/DOTGraphTraits.h</a>&quot;</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &lt;cstddef&gt;</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &lt;iterator&gt;</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &lt;type_traits&gt;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &lt;fstream&gt;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;{</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1DOT.html"> 40</a></span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c">DOT</a> <span class="comment">// Private functions...</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;{</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">EscapeStr</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;<a class="code" href="structSVF_1_1GrammarBase_1_1Symbol.html">Label</a>);</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;} <span class="comment">// end namespace DOT</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html"> 47</a></span>&#160;<span class="keyword">namespace </span>GraphProgram</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;{</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;</div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37"> 50</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37">Name</a></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;{</div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c"> 52</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c">DOT</a>,</div><div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac3a20ad67d8b23a37a2c81ef793323a9"> 53</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac3a20ad67d8b23a37a2c81ef793323a9">FDP</a>,</div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a280cacd79d09366b6832ebc6e54b5a9c"> 54</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a280cacd79d09366b6832ebc6e54b5a9c">NEATO</a>,</div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac6a6eaaa34322cf54953ba390895f0c5"> 55</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ac6a6eaaa34322cf54953ba390895f0c5">TWOPI</a>,</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a88732178df8f5804ab976cc48e584674"> 56</a></span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37a88732178df8f5804ab976cc48e584674">CIRCO</a></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;};</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;} <span class="comment">// end namespace GraphProgram</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html"> 62</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1GraphWriter.html">GraphWriter</a></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;{</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a2e882c9af39ffd3c4a4bac9212e0e82d"> 64</a></span>&#160; std::ofstream &amp;<a class="code" href="classSVF_1_1GraphWriter.html#a2e882c9af39ffd3c4a4bac9212e0e82d">O</a>;</div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a0ac109f9b3c3b3fe3cb61bbef09e0d29"> 65</a></span>&#160; <span class="keyword">const</span> GraphType &amp;<a class="code" href="classSVF_1_1GraphWriter.html#a0ac109f9b3c3b3fe3cb61bbef09e0d29">G</a>;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a245d85f8c907a409533ab151e9e3d9a2"> 67</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTTraits</a> = <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTGraphTraits&lt;GraphType&gt;</a>;</div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a65144f9ff432d21ad2751287a7237b3f"> 68</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1GenericGraphTraits.html">GTraits</a> = <a class="code" href="structSVF_1_1GenericGraphTraits.html">GenericGraphTraits&lt;GraphType&gt;</a>;</div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6"> 69</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1GenericGraphTraits.html#a05654ab9615d75bc8e5f8c5cf9297205">GTraits::NodeRef</a>;</div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ab7ac9f47cedfc1f7c4cc3b16f5349427"> 70</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1GraphWriter.html#ab7ac9f47cedfc1f7c4cc3b16f5349427">node_iterator</a> = <span class="keyword">typename</span> GTraits::nodes_iterator;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56"> 71</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> = <span class="keyword">typename</span> GTraits::ChildIteratorType;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a36f1ca2744fae2f45400e82f39e4fcd8"> 72</a></span>&#160; <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTTraits</a> <a class="code" href="classSVF_1_1GraphWriter.html#a36f1ca2744fae2f45400e82f39e4fcd8">DTraits</a>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; static_assert(std::is_pointer&lt;NodeRef&gt;::value,</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="stringliteral">&quot;FIXME: Currently GraphWriter requires the NodeRef type to be &quot;</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="stringliteral">&quot;a pointer.\nThe pointer usage should be moved to &quot;</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="stringliteral">&quot;DOTGraphTraits, and removed from GraphWriter itself.&quot;</span>);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="comment">// Writes the edge labels of the node to O and returns true if there are any</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">// edge labels not equal to the empty string &quot;&quot;.</span></div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#aa2d0fada900a8e08af0539498905a74f"> 81</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1GraphWriter.html#aa2d0fada900a8e08af0539498905a74f">getEdgeSourceLabels</a>(std::stringstream &amp;O2, <a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node)</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EI = GTraits::child_begin(Node);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EE = GTraits::child_end(Node);</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordtype">bool</span> hasEdgeSourceLabels = <span class="keyword">false</span>;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; EI != EE &amp;&amp; i != 64; ++EI, ++i)</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; {</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> label = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a66f5994cdef8fa307c9ff69ca90a1d6c">getEdgeSourceLabel</a>(Node, EI);</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">if</span> (label.empty())</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; hasEdgeSourceLabels = <span class="keyword">true</span>;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordflow">if</span> (i)</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; O2 &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; O2 &lt;&lt; <span class="stringliteral">&quot;&lt;s&quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(label);</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">if</span> (EI != EE &amp;&amp; hasEdgeSourceLabels)</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; O2 &lt;&lt; <span class="stringliteral">&quot;|&lt;s64&gt;truncated...&quot;</span>;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keywordflow">return</span> hasEdgeSourceLabels;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; }</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#afd8fec784307b919d1cb89b49533600e"> 109</a></span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#afd8fec784307b919d1cb89b49533600e">GraphWriter</a>(std::ofstream &amp;o, <span class="keyword">const</span> GraphType &amp;g, <span class="keywordtype">bool</span> SN) : O(o), G(g)</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; DTraits = <a class="code" href="structSVF_1_1DOTGraphTraits.html">DOTTraits</a>(SN);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; }</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ae414407f483b60c9fa49e2f3ae62de30"> 114</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#ae414407f483b60c9fa49e2f3ae62de30">writeGraph</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Title = <span class="stringliteral">&quot;&quot;</span>)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="comment">// Output the header for the graph...</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; writeHeader(Title);</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="comment">// Emit all of the nodes in the graph...</span></div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; writeNodes();</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="comment">// Output any customizations on the graph</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a47ee60dc78e3f869ce4e808e73437ddf">DOTGraphTraits&lt;GraphType&gt;::addCustomGraphFeatures</a>(G, *<span class="keyword">this</span>);</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="comment">// Output the end of the graph</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; writeFooter();</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; }</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#abd376959cc889e1e387523f38674650f"> 129</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#abd376959cc889e1e387523f38674650f">writeHeader</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Title)</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> GraphName(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a41effe5697618840e0d5ea10c26781fe">getGraphName</a>(G));</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">if</span> (!Title.empty())</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;digraph \&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Title) &lt;&lt; <span class="stringliteral">&quot;\&quot; {\n&quot;</span>;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!GraphName.empty())</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;digraph \&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(GraphName) &lt;&lt; <span class="stringliteral">&quot;\&quot; {\n&quot;</span>;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;digraph unnamed {\n&quot;</span>;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>())</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\trankdir=\&quot;BT\&quot;;\n&quot;</span>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">if</span> (!Title.empty())</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tlabel=\&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Title) &lt;&lt; <span class="stringliteral">&quot;\&quot;;\n&quot;</span>;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!GraphName.empty())</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tlabel=\&quot;&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(GraphName) &lt;&lt; <span class="stringliteral">&quot;\&quot;;\n&quot;</span>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; O &lt;&lt; DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#afe384157441d5ef0b3aafdfb6cd3028a">getGraphProperties</a>(G);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; }</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a5c3ce0eba24c71f847676b23b855e44c"> 151</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a5c3ce0eba24c71f847676b23b855e44c">writeFooter</a>()</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="comment">// Finish off the graph</span></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}\n&quot;</span>;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#ada2363727dc20c2183b8252f3bdf3a04"> 157</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#ada2363727dc20c2183b8252f3bdf3a04">writeNodes</a>()</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="comment">// Loop over the graph, printing it out...</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> Node : nodes&lt;GraphType&gt;(G))</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordflow">if</span> (!isNodeHidden(Node))</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; writeNode(Node);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; }</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a8b1d80caf226c3a619c5fb03f8724f74"> 165</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1GraphWriter.html#a8b1d80caf226c3a619c5fb03f8724f74">isNodeHidden</a>(<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node)</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ae73ba55d72d5df1f70a2bfa2e12958f3">isNodeHidden</a>(Node, G);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a18c579b53feccbb3b521982c6161f555"> 170</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a18c579b53feccbb3b521982c6161f555">writeNode</a>(<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node)</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> NodeAttributes = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a3438f5f1ed763f2f7818535f212ff43b">getNodeAttributes</a>(Node, G);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tNode&quot;</span> &lt;&lt; <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(Node) &lt;&lt; <span class="stringliteral">&quot; [shape=record,&quot;</span>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span> (!NodeAttributes.empty()) O &lt;&lt; NodeAttributes &lt;&lt; <span class="stringliteral">&quot;,&quot;</span>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;label=\&quot;{&quot;</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>())</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a07487bbf691110420c680250994a6eba">getNodeLabel</a>(Node, G));</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="comment">// If we should include the address of the node in the label, do so now.</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> Id = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a0f81b82658f62589ec429c601538f6e9">getNodeIdentifierLabel</a>(Node, G);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">if</span> (!Id.empty())</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Id);</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> NodeDesc = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#af5800f2d8efa24fee85f03871c07df21">getNodeDescription</a>(Node, G);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">if</span> (!NodeDesc.empty())</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(NodeDesc);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; }</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> edgeSourceLabels;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; std::stringstream EdgeSourceLabels(edgeSourceLabels);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordtype">bool</span> hasEdgeSourceLabels = getEdgeSourceLabels(EdgeSourceLabels, Node);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordflow">if</span> (hasEdgeSourceLabels)</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>()) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;{&quot;</span> &lt;&lt; EdgeSourceLabels.str() &lt;&lt; <span class="stringliteral">&quot;}&quot;</span>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>()) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">renderGraphFromBottomUp</a>())</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; {</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a07487bbf691110420c680250994a6eba">getNodeLabel</a>(Node, G));</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// If we should include the address of the node in the label, do so now.</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> Id = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a0f81b82658f62589ec429c601538f6e9">getNodeIdentifierLabel</a>(Node, G);</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">if</span> (!Id.empty())</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Id);</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> NodeDesc = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#af5800f2d8efa24fee85f03871c07df21">getNodeDescription</a>(Node, G);</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="keywordflow">if</span> (!NodeDesc.empty())</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(NodeDesc);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a87d7b47985a849c7c4ff1c328a59c623">hasEdgeDestLabels</a>())</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|{&quot;</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordtype">unsigned</span> i = 0, e = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a94f582264d3020f36a2ca3bdfbdaf81b">numEdgeDestLabels</a>(Node);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">for</span> (; i != e &amp;&amp; i != 64; ++i)</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">if</span> (i) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;&lt;d&quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span></div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a5e560e93632e0ed1934d4c4508ca1884">getEdgeDestLabel</a>(Node, i));</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; }</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">if</span> (i != e)</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|&lt;d64&gt;truncated...&quot;</span>;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}&quot;</span>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}\&quot;];\n&quot;</span>; <span class="comment">// Finish printing the &quot;node&quot; line</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="comment">// Output all of the edges now</span></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EI = GTraits::child_begin(Node);</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EE = GTraits::child_end(Node);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; EI != EE &amp;&amp; i != 64; ++EI, ++i)</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ae73ba55d72d5df1f70a2bfa2e12958f3">isNodeHidden</a>(*EI, G))</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; writeEdge(Node, i, EI);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">for</span> (; EI != EE; ++EI)</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">if</span> (!DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ae73ba55d72d5df1f70a2bfa2e12958f3">isNodeHidden</a>(*EI, G))</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; writeEdge(Node, 64, EI);</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; }</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a6133d0033363b0e9db156c354da7d7e6"> 249</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a6133d0033363b0e9db156c354da7d7e6">writeEdge</a>(<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> Node, <span class="keywordtype">unsigned</span> edgeidx, <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> EI)</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; {</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GraphWriter.html#ac2141c33c4075610f8253287ee4ff0c6">NodeRef</a> TargetNode = *EI)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordtype">int</span> DestPort = -1;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a78c40f9b1af839116b88519fca154396">edgeTargetsEdgeSource</a>(Node, EI))</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html#ad41e952ca114bba64b87478f469b6d56">child_iterator</a> TargetIt = DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#acfab6216e24999e92b2354e4f15b96b6">getEdgeTarget</a>(Node, EI);</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// Figure out which edge this targets...</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="keywordtype">unsigned</span> Offset =</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; (unsigned)std::distance(GTraits::child_begin(TargetNode), TargetIt);</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; DestPort = <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(Offset);</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; }</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keywordflow">if</span> (DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a66f5994cdef8fa307c9ff69ca90a1d6c">getEdgeSourceLabel</a>(Node, EI).empty())</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; edgeidx = -1;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; emitEdge(static_cast&lt;const void*&gt;(Node), edgeidx,</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; static_cast&lt;const void*&gt;(TargetNode), DestPort,</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#ad84c95525cf15f90848c2558fd28f43b">getEdgeAttributes</a>(Node, EI, G));</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; }</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; }</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;</div><div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a0feff91ed80b997dd4550fae16382768"> 274</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a0feff91ed80b997dd4550fae16382768">emitSimpleNode</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *ID, <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Attr,</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;<a class="code" href="structSVF_1_1GrammarBase_1_1Symbol.html">Label</a>, <span class="keywordtype">unsigned</span> NumEdgeSources = 0,</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="keyword">const</span> std::vector&lt;std::string&gt; *EdgeSourceLabels = <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; {</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tNode&quot;</span> &lt;&lt; ID &lt;&lt; <span class="stringliteral">&quot;[ &quot;</span>;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">if</span> (!Attr.empty())</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; O &lt;&lt; Attr &lt;&lt; <span class="stringliteral">&quot;,&quot;</span>;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; O &lt;&lt; <span class="stringliteral">&quot; label =\&quot;&quot;</span>;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">if</span> (NumEdgeSources) O &lt;&lt; <span class="stringliteral">&quot;{&quot;</span>;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>(Label);</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keywordflow">if</span> (NumEdgeSources)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;|{&quot;</span>;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i != NumEdgeSources; ++i)</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; {</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="keywordflow">if</span> (i) O &lt;&lt; <span class="stringliteral">&quot;|&quot;</span>;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;&lt;s&quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span>;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keywordflow">if</span> (EdgeSourceLabels) O &lt;&lt; <a class="code" href="namespaceSVF_1_1DOT.html#a9e3127c2bbedaec1f20d4437bea9e2f7">DOT::EscapeStr</a>((*EdgeSourceLabels)[i]);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;}}&quot;</span>;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\&quot;];\n&quot;</span>;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#a320577b81479578a8e6021380f9c07a7"> 300</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1GraphWriter.html#a320577b81479578a8e6021380f9c07a7">emitEdge</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *SrcNodeID, <span class="keywordtype">int</span> SrcNodePort,</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keyword">const</span> <span class="keywordtype">void</span> *DestNodeID, <span class="keywordtype">int</span> DestNodePort,</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;Attrs)</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; {</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">if</span> (SrcNodePort &gt; 64) <span class="keywordflow">return</span>; <span class="comment">// Eminating from truncated part?</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">if</span> (DestNodePort &gt; 64) DestNodePort = 64; <span class="comment">// Targeting the truncated part?</span></div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\tNode&quot;</span> &lt;&lt; SrcNodeID;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="keywordflow">if</span> (SrcNodePort &gt;= 0)</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;:s&quot;</span> &lt;&lt; SrcNodePort;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; O &lt;&lt; <span class="stringliteral">&quot; -&gt; Node&quot;</span> &lt;&lt; DestNodeID;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordflow">if</span> (DestNodePort &gt;= 0 &amp;&amp; DTraits.<a class="code" href="structSVF_1_1DefaultDOTGraphTraits.html#a87d7b47985a849c7c4ff1c328a59c623">hasEdgeDestLabels</a>())</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;:d&quot;</span> &lt;&lt; DestNodePort;</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">if</span> (!Attrs.empty())</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; Attrs &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;;\n&quot;</span>;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; }</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="classSVF_1_1GraphWriter.html#afa5d94effc56067e44eba9a11afd5284"> 321</a></span>&#160; std::ofstream &amp;<a class="code" href="classSVF_1_1GraphWriter.html#afa5d94effc56067e44eba9a11afd5284">getOStream</a>()</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordflow">return</span> O;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; }</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160;};</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00328"></a><span class="lineno"><a class="line" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd"> 328</a></span>&#160;std::ofstream &amp;<a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">WriteGraph</a>(std::ofstream &amp;O, <span class="keyword">const</span> GraphType &amp;G,</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordtype">bool</span> ShortNames = <span class="keyword">false</span>)</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;{</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="comment">// Start the graph emission process...</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="code" href="classSVF_1_1GraphWriter.html">GraphWriter&lt;GraphType&gt;</a> W(O, G, ShortNames);</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="comment">// Emit the graph.</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; W.<a class="code" href="classSVF_1_1GraphWriter.html#ae414407f483b60c9fa49e2f3ae62de30">writeGraph</a>(<span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keywordflow">return</span> O;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;}</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00345"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a587614f74cb00a35a423559265239798"> 345</a></span>&#160;<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">WriteGraph</a>(<span class="keyword">const</span> GraphType &amp;G,</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordtype">bool</span> ShortNames = <span class="keyword">false</span>,</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> Filename = <span class="stringliteral">&quot;&quot;</span>)</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160;{</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; std::ofstream O(Filename);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (O.fail())</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; std::cerr &lt;&lt; <span class="stringliteral">&quot;error opening file &#39;&quot;</span> &lt;&lt; Filename &lt;&lt; <span class="stringliteral">&quot;&#39; for writing!\n&quot;</span>;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; O.close();</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">SVF::WriteGraph</a>(O, G, ShortNames);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; O.close();</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; std::cerr &lt;&lt; <span class="stringliteral">&quot; done. \n&quot;</span>;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">return</span> Filename;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160;}</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> GraphType&gt;</div><div class="line"><a name="l00371"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a4582a7d33a5631a5a38973f50035327e"> 371</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceSVF.html#a4582a7d33a5631a5a38973f50035327e">ViewGraph</a>(<span class="keyword">const</span> GraphType &amp;G,<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>&amp; <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>,</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="keywordtype">bool</span> ShortNames = <span class="keyword">false</span>,</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37">GraphProgram::Name</a> Program = <a class="code" href="namespaceSVF_1_1GraphProgram.html#a10f45758abb5c1ef51b0ba38d18efd37ae09e3feb3996d73e682cf2a5077c090c">GraphProgram::DOT</a>)</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160;{</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <a class="code" href="namespaceSVF.html#ae27267f89add1338fd5afe3a38f61ebd">SVF::WriteGraph</a>(G, ShortNames);</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;}</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160;</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160;} <span class="comment">// end namespace llvm</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160;<span class="preprocessor">#endif // LLVM_SUPPORT_GRAPHWRITER_H</span></div><div class="ttc" id="classSVF_1_1GraphWriter_html_a18c579b53feccbb3b521982c6161f555"><div class="ttname"><a href="classSVF_1_1GraphWriter.html#a18c579b53feccbb3b521982c6161f555">SVF::GraphWriter::writeNode</a></div><div class="ttdeci">void writeNode(NodeRef Node)</div><div class="ttdef"><b>Definition:</b> <a href="GraphWriter_8h_source.html#l00170">GraphWriter.h:170</a></div></div>
70
70
  <div class="ttc" id="structSVF_1_1DefaultDOTGraphTraits_html_acfab6216e24999e92b2354e4f15b96b6"><div class="ttname"><a href="structSVF_1_1DefaultDOTGraphTraits.html#acfab6216e24999e92b2354e4f15b96b6">SVF::DefaultDOTGraphTraits::getEdgeTarget</a></div><div class="ttdeci">static EdgeIter getEdgeTarget(const void *, EdgeIter I)</div><div class="ttdef"><b>Definition:</b> <a href="DOTGraphTraits_8h_source.html#l00139">DOTGraphTraits.h:139</a></div></div>
71
71
  <div class="ttc" id="classSVF_1_1GraphWriter_html_afa5d94effc56067e44eba9a11afd5284"><div class="ttname"><a href="classSVF_1_1GraphWriter.html#afa5d94effc56067e44eba9a11afd5284">SVF::GraphWriter::getOStream</a></div><div class="ttdeci">std::ofstream &amp; getOStream()</div><div class="ttdef"><b>Definition:</b> <a href="GraphWriter_8h_source.html#l00321">GraphWriter.h:321</a></div></div>
72
72
  <div class="ttc" id="structSVF_1_1DefaultDOTGraphTraits_html_aeb5908ad6424c0636b698e5ea0a587c0"><div class="ttname"><a href="structSVF_1_1DefaultDOTGraphTraits.html#aeb5908ad6424c0636b698e5ea0a587c0">SVF::DefaultDOTGraphTraits::renderGraphFromBottomUp</a></div><div class="ttdeci">static bool renderGraphFromBottomUp()</div><div class="ttdef"><b>Definition:</b> <a href="DOTGraphTraits_8h_source.html#l00064">DOTGraphTraits.h:64</a></div></div>
@@ -103,6 +103,7 @@ $(function() {
103
103
  <div class="ttc" id="structSVF_1_1DefaultDOTGraphTraits_html_af5800f2d8efa24fee85f03871c07df21"><div class="ttname"><a href="structSVF_1_1DefaultDOTGraphTraits.html#af5800f2d8efa24fee85f03871c07df21">SVF::DefaultDOTGraphTraits::getNodeDescription</a></div><div class="ttdeci">static std::string getNodeDescription(const void *, const GraphType &amp;)</div><div class="ttdef"><b>Definition:</b> <a href="DOTGraphTraits_8h_source.html#l00095">DOTGraphTraits.h:95</a></div></div>
104
104
  <div class="ttc" id="structSVF_1_1DefaultDOTGraphTraits_html_afe384157441d5ef0b3aafdfb6cd3028a"><div class="ttname"><a href="structSVF_1_1DefaultDOTGraphTraits.html#afe384157441d5ef0b3aafdfb6cd3028a">SVF::DefaultDOTGraphTraits::getGraphProperties</a></div><div class="ttdeci">static std::string getGraphProperties(const GraphType &amp;)</div><div class="ttdef"><b>Definition:</b> <a href="DOTGraphTraits_8h_source.html#l00056">DOTGraphTraits.h:56</a></div></div>
105
105
  <div class="ttc" id="classSVF_1_1GraphWriter_html_a320577b81479578a8e6021380f9c07a7"><div class="ttname"><a href="classSVF_1_1GraphWriter.html#a320577b81479578a8e6021380f9c07a7">SVF::GraphWriter::emitEdge</a></div><div class="ttdeci">void emitEdge(const void *SrcNodeID, int SrcNodePort, const void *DestNodeID, int DestNodePort, const std::string &amp;Attrs)</div><div class="ttdoc">emitEdge - Output an edge from a simple node into the graph... </div><div class="ttdef"><b>Definition:</b> <a href="GraphWriter_8h_source.html#l00300">GraphWriter.h:300</a></div></div>
106
+ <div class="ttc" id="structSVF_1_1GrammarBase_1_1Symbol_html"><div class="ttname"><a href="structSVF_1_1GrammarBase_1_1Symbol.html">SVF::GrammarBase::Symbol</a></div><div class="ttdef"><b>Definition:</b> <a href="CFLGrammar_8h_source.html#l00042">CFLGrammar.h:42</a></div></div>
106
107
  <div class="ttc" id="structSVF_1_1DefaultDOTGraphTraits_html_a5e560e93632e0ed1934d4c4508ca1884"><div class="ttname"><a href="structSVF_1_1DefaultDOTGraphTraits.html#a5e560e93632e0ed1934d4c4508ca1884">SVF::DefaultDOTGraphTraits::getEdgeDestLabel</a></div><div class="ttdeci">static std::string getEdgeDestLabel(const void *, unsigned)</div><div class="ttdef"><b>Definition:</b> <a href="DOTGraphTraits_8h_source.html#l00160">DOTGraphTraits.h:160</a></div></div>
107
108
  <div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="AbstractValue_8h_source.html#l00037">AbstractValue.h:37</a></div></div>
108
109
  <div class="ttc" id="structSVF_1_1DefaultDOTGraphTraits_html_a47ee60dc78e3f869ce4e808e73437ddf"><div class="ttname"><a href="structSVF_1_1DefaultDOTGraphTraits.html#a47ee60dc78e3f869ce4e808e73437ddf">SVF::DefaultDOTGraphTraits::addCustomGraphFeatures</a></div><div class="ttdeci">static void addCustomGraphFeatures(const GraphType &amp;, GraphWriter &amp;)</div><div class="ttdef"><b>Definition:</b> <a href="DOTGraphTraits_8h_source.html#l00172">DOTGraphTraits.h:172</a></div></div>
@@ -115,7 +115,7 @@ $(function() {
115
115
  <div class="ttc" id="classSVF_1_1SVFInstruction_html_a454f676881eecf4b7399649a81180b5d"><div class="ttname"><a href="classSVF_1_1SVFInstruction.html#a454f676881eecf4b7399649a81180b5d">SVF::SVFInstruction::isRetInst</a></div><div class="ttdeci">bool isRetInst() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00629">SVFValue.h:629</a></div></div>
116
116
  <div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a3b2ca48c72fba877c6cb3d52e23704e3"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a3b2ca48c72fba877c6cb3d52e23704e3">SVF::LLVMUtil::getNextInsts</a></div><div class="ttdeci">void getNextInsts(const Instruction *curInst, std::vector&lt; const SVFInstruction *&gt; &amp;instList)</div><div class="ttdoc">Get the next instructions following control flow. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00271">LLVMUtil.cpp:271</a></div></div>
117
117
  <div class="ttc" id="classSVF_1_1SVFBasicBlock_html"><div class="ttname"><a href="classSVF_1_1SVFBasicBlock.html">SVF::SVFBasicBlock</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00471">SVFValue.h:471</a></div></div>
118
- <div class="ttc" id="classSVF_1_1LLVMModuleSet_html_afdd77bc1fca91f70b2ec362f1dacd392"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">SVF::LLVMModuleSet::getSVFValue</a></div><div class="ttdeci">SVFValue * getSVFValue(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00932">LLVMModule.cpp:932</a></div></div>
118
+ <div class="ttc" id="classSVF_1_1LLVMModuleSet_html_afdd77bc1fca91f70b2ec362f1dacd392"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">SVF::LLVMModuleSet::getSVFValue</a></div><div class="ttdeci">SVFValue * getSVFValue(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00938">LLVMModule.cpp:938</a></div></div>
119
119
  <div class="ttc" id="classSVF_1_1GlobalICFGNode_html"><div class="ttname"><a href="classSVF_1_1GlobalICFGNode.html">SVF::GlobalICFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00142">ICFGNode.h:142</a></div></div>
120
120
  <div class="ttc" id="SVFType_8h_html_a173ce1b9b505fdadf5613b663749d3b0"><div class="ttname"><a href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a></div><div class="ttdeci">#define DBOUT(TYPE, X)</div><div class="ttdoc">LLVM debug macros, define type of your DEBUG model of each pass. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00417">SVFType.h:417</a></div></div>
121
121
  <div class="ttc" id="classSVF_1_1ICFGBuilder_html_a5d7c24a1bf3300f784741ed8dba5a683"><div class="ttname"><a href="classSVF_1_1ICFGBuilder.html#a5d7c24a1bf3300f784741ed8dba5a683">SVF::ICFGBuilder::getOrAddInterBlockICFGNode</a></div><div class="ttdeci">InterICFGNode * getOrAddInterBlockICFGNode(const SVFInstruction *inst)</div><div class="ttdoc">Add/Get an inter block ICFGNode. </div><div class="ttdef"><b>Definition:</b> <a href="ICFGBuilder_8cpp_source.html#l00180">ICFGBuilder.cpp:180</a></div></div>