svf-tools 1.0.595 → 1.0.597

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 (980) hide show
  1. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +4 -4
  2. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +2 -2
  3. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +7 -7
  4. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +11 -11
  5. package/SVF-doxygen/html/html/Andersen_8h_source.html +5 -5
  6. package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +7 -7
  7. package/SVF-doxygen/html/html/CFLAlias_8h_source.html +5 -5
  8. package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +8 -8
  9. package/SVF-doxygen/html/html/CFLGraphBuilder_8h_source.html +4 -4
  10. package/SVF-doxygen/html/html/CFLGraph_8cpp.html +3 -2
  11. package/SVF-doxygen/html/html/CFLGraph_8cpp_source.html +15 -13
  12. package/SVF-doxygen/html/html/CFLGraph_8h.html +4 -6
  13. package/SVF-doxygen/html/html/CFLGraph_8h_source.html +19 -18
  14. package/SVF-doxygen/html/html/CFLSolver_8cpp_source.html +4 -4
  15. package/SVF-doxygen/html/html/CFLStat_8cpp_source.html +1 -1
  16. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +8 -8
  17. package/SVF-doxygen/html/html/CHG_8cpp.html +6 -5
  18. package/SVF-doxygen/html/html/CHG_8cpp_source.html +26 -24
  19. package/SVF-doxygen/html/html/CHG_8h.html +4 -6
  20. package/SVF-doxygen/html/html/CHG_8h_source.html +13 -12
  21. package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +3 -3
  22. package/SVF-doxygen/html/html/ConsGEdge_8h_source.html +3 -3
  23. package/SVF-doxygen/html/html/ConsGNode_8h_source.html +7 -7
  24. package/SVF-doxygen/html/html/ConsG_8cpp.html +3 -2
  25. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +27 -26
  26. package/SVF-doxygen/html/html/ConsG_8h.html +4 -6
  27. package/SVF-doxygen/html/html/ConsG_8h_source.html +10 -9
  28. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +7 -7
  29. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +3 -3
  30. package/SVF-doxygen/html/html/CxtStmt_8h_source.html +4 -4
  31. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +21 -19
  32. package/SVF-doxygen/html/html/DCHG_8h.html +4 -6
  33. package/SVF-doxygen/html/html/DCHG_8h_source.html +15 -14
  34. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
  35. package/SVF-doxygen/html/html/DDAClient_8h_source.html +1 -1
  36. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +9 -9
  37. package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
  38. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +8 -8
  39. package/SVF-doxygen/html/html/DOTGraphTraits_8h.html +97 -0
  40. package/SVF-doxygen/html/html/DOTGraphTraits_8h_source.html +102 -0
  41. package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +4 -4
  42. package/SVF-doxygen/html/html/DoubleFreeChecker_8h_source.html +1 -1
  43. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +5 -5
  44. package/SVF-doxygen/html/html/ExtAPI_8h_source.html +1 -1
  45. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +12 -12
  46. package/SVF-doxygen/html/html/FileChecker_8cpp_source.html +1 -1
  47. package/SVF-doxygen/html/html/FileChecker_8h_source.html +1 -1
  48. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +3 -3
  49. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +1 -1
  50. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +8 -8
  51. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +6 -6
  52. package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +1 -1
  53. package/SVF-doxygen/html/html/GEPTypeBridgeIterator_8h_source.html +2 -2
  54. package/SVF-doxygen/html/html/GenericGraph_8h.html +15 -6
  55. package/SVF-doxygen/html/html/GenericGraph_8h_source.html +128 -115
  56. package/SVF-doxygen/html/html/GraphPrinter_8h.html +5 -6
  57. package/SVF-doxygen/html/html/GraphPrinter_8h_source.html +8 -5
  58. package/SVF-doxygen/html/html/GraphReachSolver_8h_source.html +4 -3
  59. package/SVF-doxygen/html/html/GraphTraits_8h.html +118 -0
  60. package/SVF-doxygen/html/html/GraphTraits_8h_source.html +91 -0
  61. package/SVF-doxygen/html/html/GraphWriter_8cpp.html +81 -0
  62. package/SVF-doxygen/html/html/GraphWriter_8cpp_source.html +80 -0
  63. package/SVF-doxygen/html/html/GraphWriter_8h.html +138 -0
  64. package/SVF-doxygen/html/html/GraphWriter_8h_source.html +129 -0
  65. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +7 -7
  66. package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +2 -2
  67. package/SVF-doxygen/html/html/ICFGEdge_8h_source.html +7 -7
  68. package/SVF-doxygen/html/html/ICFGNode_8h_source.html +7 -7
  69. package/SVF-doxygen/html/html/ICFGStat_8h_source.html +3 -3
  70. package/SVF-doxygen/html/html/ICFG_8cpp.html +3 -2
  71. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +27 -26
  72. package/SVF-doxygen/html/html/ICFG_8h.html +4 -6
  73. package/SVF-doxygen/html/html/ICFG_8h_source.html +14 -13
  74. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +2 -2
  75. package/SVF-doxygen/html/html/IRGraph_8cpp.html +3 -2
  76. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +20 -18
  77. package/SVF-doxygen/html/html/IRGraph_8h.html +4 -6
  78. package/SVF-doxygen/html/html/IRGraph_8h_source.html +9 -8
  79. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +7 -6
  80. package/SVF-doxygen/html/html/LLVMModule_8cpp.html +4 -3
  81. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +57 -58
  82. package/SVF-doxygen/html/html/LLVMModule_8h_source.html +36 -36
  83. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +16 -9
  84. package/SVF-doxygen/html/html/LLVMUtil_8h.html +6 -0
  85. package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +6 -4
  86. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +6 -6
  87. package/SVF-doxygen/html/html/LeakChecker_8h_source.html +1 -1
  88. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +3 -3
  89. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +23 -23
  90. package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +3 -3
  91. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +6 -6
  92. package/SVF-doxygen/html/html/LockResultValidator_8h_source.html +3 -3
  93. package/SVF-doxygen/html/html/MHP_8cpp_source.html +23 -23
  94. package/SVF-doxygen/html/html/MHP_8h_source.html +4 -4
  95. package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +3 -3
  96. package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +5 -5
  97. package/SVF-doxygen/html/html/MTAAnnotator_8h_source.html +3 -3
  98. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +3 -3
  99. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +8 -8
  100. package/SVF-doxygen/html/html/MTA_8cpp_source.html +3 -3
  101. package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +1 -1
  102. package/SVF-doxygen/html/html/MemPartition_8h_source.html +1 -1
  103. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +18 -18
  104. package/SVF-doxygen/html/html/MemRegion_8h_source.html +2 -2
  105. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +21 -21
  106. package/SVF-doxygen/html/html/MemSSA_8h_source.html +2 -2
  107. package/SVF-doxygen/html/html/PCG_8cpp_source.html +18 -18
  108. package/SVF-doxygen/html/html/PCG_8h_source.html +3 -3
  109. package/SVF-doxygen/html/html/PTACallGraph_8cpp.html +3 -2
  110. package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +27 -25
  111. package/SVF-doxygen/html/html/PTACallGraph_8h.html +4 -6
  112. package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +17 -16
  113. package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +6 -6
  114. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +6 -6
  115. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +3 -3
  116. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +18 -18
  117. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +3 -3
  118. package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +7 -7
  119. package/SVF-doxygen/html/html/ProgSlice_8h_source.html +1 -1
  120. package/SVF-doxygen/html/html/SCC_8h_source.html +4 -2
  121. package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +1 -1
  122. package/SVF-doxygen/html/html/SVFGEdge_8h_source.html +3 -3
  123. package/SVF-doxygen/html/html/SVFGNode_8h_source.html +3 -3
  124. package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +14 -14
  125. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +9 -9
  126. package/SVF-doxygen/html/html/SVFGReadWrite_8cpp_source.html +3 -3
  127. package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +7 -7
  128. package/SVF-doxygen/html/html/SVFG_8cpp.html +3 -2
  129. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +23 -23
  130. package/SVF-doxygen/html/html/SVFG_8h.html +1 -3
  131. package/SVF-doxygen/html/html/SVFG_8h_source.html +13 -13
  132. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +15 -14
  133. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +4 -4
  134. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +8 -8
  135. package/SVF-doxygen/html/html/SVFIR_8h_source.html +4 -4
  136. package/SVF-doxygen/html/html/SVFModule_8cpp_source.html +2 -2
  137. package/SVF-doxygen/html/html/SVFModule_8h_source.html +4 -4
  138. package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +9 -9
  139. package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +9 -9
  140. package/SVF-doxygen/html/html/SVFStatements_8h_source.html +12 -12
  141. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +4 -4
  142. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +9 -9
  143. package/SVF-doxygen/html/html/SVFValue_8cpp_source.html +16 -19
  144. package/SVF-doxygen/html/html/SVFValue_8h.html +3 -3
  145. package/SVF-doxygen/html/html/SVFValue_8h_source.html +210 -213
  146. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +7 -7
  147. package/SVF-doxygen/html/html/SVFVariables_8h_source.html +13 -14
  148. package/SVF-doxygen/html/html/SaberCheckerAPI_8h_source.html +3 -3
  149. package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +17 -17
  150. package/SVF-doxygen/html/html/SaberCondAllocator_8h_source.html +6 -6
  151. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +8 -8
  152. package/SVF-doxygen/html/html/SparseBitVector_8h_source.html +1 -1
  153. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +7 -7
  154. package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +1 -1
  155. package/SVF-doxygen/html/html/SrcSnkSolver_8h_source.html +3 -3
  156. package/SVF-doxygen/html/html/Steensgaard_8cpp_source.html +3 -3
  157. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +7 -10
  158. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +3 -4
  159. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +4 -4
  160. package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +2 -2
  161. package/SVF-doxygen/html/html/TCT_8cpp.html +3 -2
  162. package/SVF-doxygen/html/html/TCT_8cpp_source.html +38 -37
  163. package/SVF-doxygen/html/html/TCT_8h.html +4 -6
  164. package/SVF-doxygen/html/html/TCT_8h_source.html +27 -26
  165. package/SVF-doxygen/html/html/ThreadAPI_8cpp_source.html +10 -10
  166. package/SVF-doxygen/html/html/ThreadAPI_8h_source.html +6 -6
  167. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
  168. package/SVF-doxygen/html/html/ThreadCallGraph_8h_source.html +7 -7
  169. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +8 -8
  170. package/SVF-doxygen/html/html/VFGEdge_8h_source.html +6 -6
  171. package/SVF-doxygen/html/html/VFGNode_8h_source.html +8 -8
  172. package/SVF-doxygen/html/html/VFG_8cpp.html +3 -2
  173. package/SVF-doxygen/html/html/VFG_8cpp_source.html +20 -19
  174. package/SVF-doxygen/html/html/VFG_8h.html +4 -6
  175. package/SVF-doxygen/html/html/VFG_8h_source.html +14 -13
  176. package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +4 -4
  177. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +10 -10
  178. package/SVF-doxygen/html/html/WPAFSSolver_8h_source.html +3 -2
  179. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +8 -8
  180. package/SVF-doxygen/html/html/WPAPass_8h_source.html +1 -1
  181. package/SVF-doxygen/html/html/WPASolver_8h_source.html +4 -2
  182. package/SVF-doxygen/html/html/annotated.html +291 -278
  183. package/SVF-doxygen/html/html/cfl_8cpp_source.html +1 -1
  184. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +4 -4
  185. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +4 -4
  186. package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +3 -3
  187. package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +3 -3
  188. package/SVF-doxygen/html/html/classSVF_1_1AddrCGEdge.html +2 -2
  189. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +1 -1
  190. package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +1 -1
  191. package/SVF-doxygen/html/html/classSVF_1_1AliasCFLGraphBuilder.html +1 -1
  192. package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +3 -3
  193. package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +1 -1
  194. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +33 -33
  195. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +1 -1
  196. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +7 -7
  197. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +1 -1
  198. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +10 -10
  199. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +1 -1
  200. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +7 -7
  201. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +17 -17
  202. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +1 -1
  203. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +4 -4
  204. package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +1 -1
  205. package/SVF-doxygen/html/html/classSVF_1_1AssignStmt.html +4 -4
  206. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +12 -12
  207. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +1 -1
  208. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -3
  209. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +4 -4
  210. package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +1 -1
  211. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +11 -11
  212. package/SVF-doxygen/html/html/classSVF_1_1CFLEdge.html +4 -4
  213. package/SVF-doxygen/html/html/classSVF_1_1CFLGraph.html +5 -4
  214. package/SVF-doxygen/html/html/classSVF_1_1CFLNode-members.html +45 -44
  215. package/SVF-doxygen/html/html/classSVF_1_1CFLNode.html +29 -29
  216. package/SVF-doxygen/html/html/classSVF_1_1CFLSolver.html +4 -4
  217. package/SVF-doxygen/html/html/classSVF_1_1CFLStat.html +1 -1
  218. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +16 -16
  219. package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +18 -17
  220. package/SVF-doxygen/html/html/classSVF_1_1CallCFGEdge.html +3 -3
  221. package/SVF-doxygen/html/html/classSVF_1_1CallCHI.html +1 -1
  222. package/SVF-doxygen/html/html/classSVF_1_1CallDirSVFGEdge.html +2 -2
  223. package/SVF-doxygen/html/html/classSVF_1_1CallGraphBuilder.html +3 -3
  224. package/SVF-doxygen/html/html/classSVF_1_1CallICFGNode.html +7 -7
  225. package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge.html +2 -2
  226. package/SVF-doxygen/html/html/classSVF_1_1CallMU.html +1 -1
  227. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +1 -1
  228. package/SVF-doxygen/html/html/classSVF_1_1CallSite.html +56 -56
  229. package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +1 -1
  230. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -3
  231. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +1 -1
  232. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +31 -30
  233. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode-members.html +26 -26
  234. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +43 -43
  235. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +12 -12
  236. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +1 -1
  237. package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +1 -1
  238. package/SVF-doxygen/html/html/classSVF_1_1CxtProc.html +1 -1
  239. package/SVF-doxygen/html/html/classSVF_1_1CxtStmt.html +2 -2
  240. package/SVF-doxygen/html/html/classSVF_1_1CxtThread.html +2 -2
  241. package/SVF-doxygen/html/html/classSVF_1_1CxtThreadProc.html +1 -1
  242. package/SVF-doxygen/html/html/classSVF_1_1CxtThreadStmt.html +2 -2
  243. package/SVF-doxygen/html/html/classSVF_1_1DCHEdge.html +2 -2
  244. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +35 -32
  245. package/SVF-doxygen/html/html/classSVF_1_1DDAClient.html +3 -3
  246. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +16 -16
  247. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
  248. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +3 -3
  249. package/SVF-doxygen/html/html/classSVF_1_1DirectSVFGEdge.html +2 -2
  250. package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +1 -1
  251. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker-members.html +2 -2
  252. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +16 -16
  253. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +1 -1
  254. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +1 -1
  255. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +6 -6
  256. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +3 -4
  257. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +1 -1
  258. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +4 -4
  259. package/SVF-doxygen/html/html/classSVF_1_1FileChecker-members.html +2 -2
  260. package/SVF-doxygen/html/html/classSVF_1_1FileChecker.html +8 -8
  261. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +3 -3
  262. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +1 -1
  263. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +21 -21
  264. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +17 -17
  265. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +29 -29
  266. package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode.html +2 -2
  267. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +2 -2
  268. package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +3 -3
  269. package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +3 -3
  270. package/SVF-doxygen/html/html/classSVF_1_1FunEntryICFGNode.html +6 -6
  271. package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +8 -8
  272. package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.html +31 -31
  273. package/SVF-doxygen/html/html/classSVF_1_1GenericGraph.html +44 -44
  274. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +78 -78
  275. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
  276. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +3 -4
  277. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +1 -1
  278. package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +1 -1
  279. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +3 -4
  280. package/SVF-doxygen/html/html/classSVF_1_1GlobalICFGNode.html +1 -1
  281. package/SVF-doxygen/html/html/classSVF_1_1GraphPrinter-members.html +83 -0
  282. package/SVF-doxygen/html/html/classSVF_1_1GraphPrinter.html +236 -0
  283. package/SVF-doxygen/html/html/classSVF_1_1GraphReachSolver-members.html +2 -2
  284. package/SVF-doxygen/html/html/classSVF_1_1GraphReachSolver.html +12 -12
  285. package/SVF-doxygen/html/html/classSVF_1_1GraphWriter-members.html +100 -0
  286. package/SVF-doxygen/html/html/classSVF_1_1GraphWriter.html +882 -0
  287. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +20 -19
  288. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +12 -12
  289. package/SVF-doxygen/html/html/classSVF_1_1ICFGEdge.html +7 -7
  290. package/SVF-doxygen/html/html/classSVF_1_1ICFGNode.html +1 -1
  291. package/SVF-doxygen/html/html/classSVF_1_1ICFGStat.html +2 -2
  292. package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +12 -11
  293. package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge.html +2 -2
  294. package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG.html +1 -1
  295. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +3 -3
  296. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +2 -2
  297. package/SVF-doxygen/html/html/classSVF_1_1IntraCFGEdge.html +3 -3
  298. package/SVF-doxygen/html/html/classSVF_1_1IntraDirSVFGEdge.html +2 -2
  299. package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +1 -1
  300. package/SVF-doxygen/html/html/classSVF_1_1IntraICFGNode.html +6 -6
  301. package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge.html +2 -2
  302. package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode.html +2 -2
  303. package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +2 -2
  304. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +7 -6
  305. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +129 -129
  306. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker-members.html +2 -2
  307. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +22 -22
  308. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +1 -1
  309. package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +1 -1
  310. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +3 -3
  311. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +50 -50
  312. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +7 -7
  313. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +55 -55
  314. package/SVF-doxygen/html/html/classSVF_1_1MHPValidator.html +1 -1
  315. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +22 -22
  316. package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode.html +1 -1
  317. package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode.html +4 -4
  318. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +3 -3
  319. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +6 -6
  320. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +8 -8
  321. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +37 -37
  322. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +9 -9
  323. package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +1 -1
  324. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +36 -36
  325. package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt.html +3 -3
  326. package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +4 -4
  327. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +3 -4
  328. package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +3 -3
  329. package/SVF-doxygen/html/html/classSVF_1_1PCG.html +28 -28
  330. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +3 -3
  331. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +26 -25
  332. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge.html +3 -3
  333. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphNode.html +7 -7
  334. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +9 -9
  335. package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +2 -2
  336. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +40 -40
  337. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +7 -7
  338. package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +4 -4
  339. package/SVF-doxygen/html/html/classSVF_1_1RaceValidator.html +1 -1
  340. package/SVF-doxygen/html/html/classSVF_1_1RetCFGEdge.html +3 -3
  341. package/SVF-doxygen/html/html/classSVF_1_1RetDirSVFGEdge.html +2 -2
  342. package/SVF-doxygen/html/html/classSVF_1_1RetICFGNode.html +5 -5
  343. package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge.html +2 -2
  344. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +1 -1
  345. package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +2 -2
  346. package/SVF-doxygen/html/html/classSVF_1_1SCCDetection-members.html +1 -1
  347. package/SVF-doxygen/html/html/classSVF_1_1SCCDetection.html +8 -8
  348. package/SVF-doxygen/html/html/classSVF_1_1SVFArgument-members.html +7 -9
  349. package/SVF-doxygen/html/html/classSVF_1_1SVFArgument.html +16 -20
  350. package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock-members.html +8 -10
  351. package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock.html +56 -63
  352. package/SVF-doxygen/html/html/classSVF_1_1SVFBlackHoleValue-members.html +6 -8
  353. package/SVF-doxygen/html/html/classSVF_1_1SVFBlackHoleValue.html +7 -11
  354. package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst-members.html +12 -14
  355. package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +34 -38
  356. package/SVF-doxygen/html/html/classSVF_1_1SVFConstant-members.html +6 -8
  357. package/SVF-doxygen/html/html/classSVF_1_1SVFConstant.html +5 -9
  358. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantData-members.html +6 -8
  359. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantData.html +7 -11
  360. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantFP-members.html +6 -8
  361. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantFP.html +10 -14
  362. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantInt-members.html +6 -8
  363. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantInt.html +14 -18
  364. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantNullPtr-members.html +6 -8
  365. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantNullPtr.html +7 -11
  366. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction-members.html +23 -25
  367. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +115 -119
  368. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +16 -16
  369. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +1 -1
  370. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +43 -43
  371. package/SVF-doxygen/html/html/classSVF_1_1SVFGStat.html +9 -9
  372. package/SVF-doxygen/html/html/classSVF_1_1SVFGlobalValue-members.html +9 -11
  373. package/SVF-doxygen/html/html/classSVF_1_1SVFGlobalValue.html +14 -18
  374. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +35 -35
  375. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +48 -47
  376. package/SVF-doxygen/html/html/classSVF_1_1SVFInstruction-members.html +11 -13
  377. package/SVF-doxygen/html/html/classSVF_1_1SVFInstruction.html +31 -35
  378. package/SVF-doxygen/html/html/classSVF_1_1SVFLoopAndDomInfo.html +2 -2
  379. package/SVF-doxygen/html/html/classSVF_1_1SVFMetadataAsValue-members.html +6 -8
  380. package/SVF-doxygen/html/html/classSVF_1_1SVFMetadataAsValue.html +7 -11
  381. package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +3 -3
  382. package/SVF-doxygen/html/html/classSVF_1_1SVFOtherValue-members.html +6 -8
  383. package/SVF-doxygen/html/html/classSVF_1_1SVFOtherValue.html +5 -9
  384. package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +9 -9
  385. package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.html +9 -9
  386. package/SVF-doxygen/html/html/classSVF_1_1SVFType.html +3 -3
  387. package/SVF-doxygen/html/html/classSVF_1_1SVFValue-members.html +25 -28
  388. package/SVF-doxygen/html/html/classSVF_1_1SVFValue.html +38 -128
  389. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +12 -12
  390. package/SVF-doxygen/html/html/classSVF_1_1SVFVirtualCallInst-members.html +14 -16
  391. package/SVF-doxygen/html/html/classSVF_1_1SVFVirtualCallInst.html +29 -33
  392. package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +46 -46
  393. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +13 -13
  394. package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +2 -2
  395. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector-members.html +1 -1
  396. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector.html +7 -7
  397. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html +4 -4
  398. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA-members.html +2 -2
  399. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +16 -16
  400. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkSolver-members.html +2 -2
  401. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkSolver.html +12 -12
  402. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +1 -1
  403. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +9 -9
  404. package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode.html +5 -5
  405. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +1 -1
  406. package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +2 -2
  407. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder-members.html +2 -3
  408. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +21 -54
  409. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +5 -5
  410. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +72 -72
  411. package/SVF-doxygen/html/html/classSVF_1_1TCTNode.html +1 -1
  412. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +1 -1
  413. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +1 -1
  414. package/SVF-doxygen/html/html/classSVF_1_1ThreadAPI.html +11 -11
  415. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +5 -5
  416. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +3 -3
  417. package/SVF-doxygen/html/html/classSVF_1_1ThreadForkEdge.html +4 -4
  418. package/SVF-doxygen/html/html/classSVF_1_1ThreadJoinEdge.html +4 -4
  419. package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge.html +2 -2
  420. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +1 -1
  421. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +12 -12
  422. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +5 -5
  423. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +3 -3
  424. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +22 -21
  425. package/SVF-doxygen/html/html/classSVF_1_1VFGEdge.html +13 -13
  426. package/SVF-doxygen/html/html/classSVF_1_1VFGNode.html +1 -1
  427. package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +3 -4
  428. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +2 -2
  429. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +1 -1
  430. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +35 -35
  431. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +6 -6
  432. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +4 -4
  433. package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver-members.html +1 -1
  434. package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver.html +4 -4
  435. package/SVF-doxygen/html/html/classSVF_1_1WPAMinimumSolver.html +7 -6
  436. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +9 -9
  437. package/SVF-doxygen/html/html/classSVF_1_1WPASCCSolver.html +4 -4
  438. package/SVF-doxygen/html/html/classSVF_1_1WPASolver-members.html +1 -1
  439. package/SVF-doxygen/html/html/classSVF_1_1WPASolver.html +8 -8
  440. package/SVF-doxygen/html/html/classSVF_1_1iter__adaptor__base-members.html +112 -0
  441. package/SVF-doxygen/html/html/classSVF_1_1iter__adaptor__base.html +633 -0
  442. package/SVF-doxygen/html/html/classSVF_1_1iter__adaptor__base.png +0 -0
  443. package/SVF-doxygen/html/html/classSVF_1_1iter__facade__base-members.html +102 -0
  444. package/SVF-doxygen/html/html/classSVF_1_1iter__facade__base.html +787 -0
  445. package/SVF-doxygen/html/html/classSVF_1_1iter__facade__base.png +0 -0
  446. package/SVF-doxygen/html/html/classSVF_1_1iter__facade__base_1_1ReferenceProxy-members.html +84 -0
  447. package/SVF-doxygen/html/html/classSVF_1_1iter__facade__base_1_1ReferenceProxy.html +229 -0
  448. package/SVF-doxygen/html/html/classSVF_1_1iter__range-members.html +87 -0
  449. package/SVF-doxygen/html/html/classSVF_1_1iter__range.html +342 -0
  450. package/SVF-doxygen/html/html/classSVF_1_1mapped__iter-members.html +112 -0
  451. package/SVF-doxygen/html/html/classSVF_1_1mapped__iter.html +322 -0
  452. package/SVF-doxygen/html/html/classSVF_1_1mapped__iter.png +0 -0
  453. package/SVF-doxygen/html/html/classSVF_1_1pointer__iterator-members.html +113 -0
  454. package/SVF-doxygen/html/html/classSVF_1_1pointer__iterator.html +343 -0
  455. package/SVF-doxygen/html/html/classSVF_1_1pointer__iterator.png +0 -0
  456. package/SVF-doxygen/html/html/classes.html +105 -102
  457. package/SVF-doxygen/html/html/classllvm_1_1GraphPrinter.html +9 -7
  458. package/SVF-doxygen/html/html/classllvm_1_1GraphWriter-members.html +100 -0
  459. package/SVF-doxygen/html/html/classllvm_1_1GraphWriter.html +882 -0
  460. package/SVF-doxygen/html/html/classllvm_1_1iterator__adaptor__base-members.html +112 -0
  461. package/SVF-doxygen/html/html/classllvm_1_1iterator__adaptor__base.html +633 -0
  462. package/SVF-doxygen/html/html/classllvm_1_1iterator__adaptor__base.png +0 -0
  463. package/SVF-doxygen/html/html/classllvm_1_1iterator__facade__base-members.html +102 -0
  464. package/SVF-doxygen/html/html/classllvm_1_1iterator__facade__base.html +787 -0
  465. package/SVF-doxygen/html/html/classllvm_1_1iterator__facade__base.png +0 -0
  466. package/SVF-doxygen/html/html/classllvm_1_1iterator__facade__base_1_1ReferenceProxy-members.html +84 -0
  467. package/SVF-doxygen/html/html/classllvm_1_1iterator__facade__base_1_1ReferenceProxy.html +229 -0
  468. package/SVF-doxygen/html/html/classllvm_1_1iterator__range-members.html +87 -0
  469. package/SVF-doxygen/html/html/classllvm_1_1iterator__range.html +342 -0
  470. package/SVF-doxygen/html/html/classllvm_1_1mapped__iter-members.html +112 -0
  471. package/SVF-doxygen/html/html/classllvm_1_1mapped__iter.html +322 -0
  472. package/SVF-doxygen/html/html/classllvm_1_1mapped__iter.png +0 -0
  473. package/SVF-doxygen/html/html/classllvm_1_1pointer__iterator-members.html +113 -0
  474. package/SVF-doxygen/html/html/classllvm_1_1pointer__iterator.html +343 -0
  475. package/SVF-doxygen/html/html/classllvm_1_1pointer__iterator.png +0 -0
  476. package/SVF-doxygen/html/html/dda_8cpp_source.html +1 -1
  477. package/SVF-doxygen/html/html/dir_1870ebf480d659cc38d2dd7ac3aa8993.html +2 -0
  478. package/SVF-doxygen/html/html/dir_95e22971b5dbae2382075a3453e365b4.html +4 -0
  479. package/SVF-doxygen/html/html/dir_fa02919a30fec2d2c2d591b4d920d648.html +6 -0
  480. package/SVF-doxygen/html/html/fastcluster__R__dm_8cpp_8inc_source.html +2 -1
  481. package/SVF-doxygen/html/html/files.html +42 -36
  482. package/SVF-doxygen/html/html/functions_a.html +11 -8
  483. package/SVF-doxygen/html/html/functions_b.html +19 -12
  484. package/SVF-doxygen/html/html/functions_c.html +43 -42
  485. package/SVF-doxygen/html/html/functions_d.html +27 -15
  486. package/SVF-doxygen/html/html/functions_e.html +19 -7
  487. package/SVF-doxygen/html/html/functions_eval_b.html +4 -4
  488. package/SVF-doxygen/html/html/functions_eval_i.html +6 -0
  489. package/SVF-doxygen/html/html/functions_f.html +21 -18
  490. package/SVF-doxygen/html/html/functions_func.html +13 -10
  491. package/SVF-doxygen/html/html/functions_func_b.html +2 -1
  492. package/SVF-doxygen/html/html/functions_func_c.html +4 -4
  493. package/SVF-doxygen/html/html/functions_func_d.html +18 -14
  494. package/SVF-doxygen/html/html/functions_func_e.html +13 -2
  495. package/SVF-doxygen/html/html/functions_func_g.html +107 -75
  496. package/SVF-doxygen/html/html/functions_func_h.html +4 -4
  497. package/SVF-doxygen/html/html/functions_func_i.html +22 -11
  498. package/SVF-doxygen/html/html/functions_func_m.html +3 -0
  499. package/SVF-doxygen/html/html/functions_func_n.html +5 -2
  500. package/SVF-doxygen/html/html/functions_func_o.html +42 -8
  501. package/SVF-doxygen/html/html/functions_func_p.html +8 -2
  502. package/SVF-doxygen/html/html/functions_func_r.html +7 -1
  503. package/SVF-doxygen/html/html/functions_func_s.html +15 -18
  504. package/SVF-doxygen/html/html/functions_func_w.html +22 -1
  505. package/SVF-doxygen/html/html/functions_g.html +119 -78
  506. package/SVF-doxygen/html/html/functions_h.html +3 -6
  507. package/SVF-doxygen/html/html/functions_i.html +43 -15
  508. package/SVF-doxygen/html/html/functions_m.html +4 -1
  509. package/SVF-doxygen/html/html/functions_n.html +31 -25
  510. package/SVF-doxygen/html/html/functions_o.html +51 -22
  511. package/SVF-doxygen/html/html/functions_p.html +29 -19
  512. package/SVF-doxygen/html/html/functions_r.html +10 -5
  513. package/SVF-doxygen/html/html/functions_rela.html +6 -3
  514. package/SVF-doxygen/html/html/functions_s.html +22 -27
  515. package/SVF-doxygen/html/html/functions_t.html +6 -6
  516. package/SVF-doxygen/html/html/functions_type_b.html +3 -0
  517. package/SVF-doxygen/html/html/functions_type_c.html +6 -5
  518. package/SVF-doxygen/html/html/functions_type_d.html +5 -0
  519. package/SVF-doxygen/html/html/functions_type_e.html +4 -4
  520. package/SVF-doxygen/html/html/functions_type_g.html +6 -5
  521. package/SVF-doxygen/html/html/functions_type_i.html +3 -2
  522. package/SVF-doxygen/html/html/functions_type_n.html +26 -23
  523. package/SVF-doxygen/html/html/functions_type_p.html +2 -1
  524. package/SVF-doxygen/html/html/functions_type_r.html +1 -0
  525. package/SVF-doxygen/html/html/functions_type_v.html +1 -0
  526. package/SVF-doxygen/html/html/functions_v.html +8 -7
  527. package/SVF-doxygen/html/html/functions_vars_b.html +3 -0
  528. package/SVF-doxygen/html/html/functions_vars_d.html +3 -0
  529. package/SVF-doxygen/html/html/functions_vars_e.html +3 -0
  530. package/SVF-doxygen/html/html/functions_vars_f.html +3 -0
  531. package/SVF-doxygen/html/html/functions_vars_g.html +9 -1
  532. package/SVF-doxygen/html/html/functions_vars_h.html +0 -3
  533. package/SVF-doxygen/html/html/functions_vars_i.html +10 -0
  534. package/SVF-doxygen/html/html/functions_vars_o.html +3 -0
  535. package/SVF-doxygen/html/html/functions_vars_p.html +3 -0
  536. package/SVF-doxygen/html/html/functions_w.html +22 -1
  537. package/SVF-doxygen/html/html/hierarchy.html +444 -397
  538. package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +4 -4
  539. package/SVF-doxygen/html/html/iterator_8h.html +124 -0
  540. package/SVF-doxygen/html/html/iterator_8h_source.html +134 -0
  541. package/SVF-doxygen/html/html/iterator__range_8h.html +110 -0
  542. package/SVF-doxygen/html/html/iterator__range_8h_source.html +90 -0
  543. package/SVF-doxygen/html/html/menudata.js +17 -16
  544. package/SVF-doxygen/html/html/mta_8cpp_source.html +1 -1
  545. package/SVF-doxygen/html/html/namespaceSVF.html +575 -9
  546. package/SVF-doxygen/html/html/namespaceSVF_1_1DOT.html +107 -0
  547. package/SVF-doxygen/html/html/namespaceSVF_1_1GraphProgram.html +122 -0
  548. package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +65 -7
  549. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +3 -3
  550. package/SVF-doxygen/html/html/namespacellvm.html +1 -95
  551. package/SVF-doxygen/html/html/namespacellvm_1_1DOT.html +107 -0
  552. package/SVF-doxygen/html/html/namespacellvm_1_1GraphProgram.html +122 -0
  553. package/SVF-doxygen/html/html/namespacemembers_c.html +9 -0
  554. package/SVF-doxygen/html/html/namespacemembers_d.html +5 -2
  555. package/SVF-doxygen/html/html/namespacemembers_e.html +3 -0
  556. package/SVF-doxygen/html/html/namespacemembers_enum.html +3 -0
  557. package/SVF-doxygen/html/html/namespacemembers_eval.html +15 -0
  558. package/SVF-doxygen/html/html/namespacemembers_f.html +3 -0
  559. package/SVF-doxygen/html/html/namespacemembers_func.html +0 -495
  560. package/SVF-doxygen/html/html/namespacemembers_func_b.html +88 -0
  561. package/SVF-doxygen/html/html/namespacemembers_func_c.html +97 -0
  562. package/SVF-doxygen/html/html/namespacemembers_func_d.html +97 -0
  563. package/SVF-doxygen/html/html/namespacemembers_func_e.html +82 -0
  564. package/SVF-doxygen/html/html/namespacemembers_func_f.html +76 -0
  565. package/SVF-doxygen/html/html/namespacemembers_func_g.html +186 -0
  566. package/SVF-doxygen/html/html/namespacemembers_func_h.html +76 -0
  567. package/SVF-doxygen/html/html/namespacemembers_func_i.html +253 -0
  568. package/SVF-doxygen/html/html/namespacemembers_func_m.html +91 -0
  569. package/SVF-doxygen/html/html/namespacemembers_func_n.html +76 -0
  570. package/SVF-doxygen/html/html/namespacemembers_func_o.html +94 -0
  571. package/SVF-doxygen/html/html/namespacemembers_func_p.html +82 -0
  572. package/SVF-doxygen/html/html/namespacemembers_func_r.html +79 -0
  573. package/SVF-doxygen/html/html/namespacemembers_func_s.html +91 -0
  574. package/SVF-doxygen/html/html/namespacemembers_func_t.html +76 -0
  575. package/SVF-doxygen/html/html/namespacemembers_func_v.html +85 -0
  576. package/SVF-doxygen/html/html/namespacemembers_func_w.html +82 -0
  577. package/SVF-doxygen/html/html/namespacemembers_g.html +1 -1
  578. package/SVF-doxygen/html/html/namespacemembers_i.html +12 -3
  579. package/SVF-doxygen/html/html/namespacemembers_m.html +12 -0
  580. package/SVF-doxygen/html/html/namespacemembers_n.html +9 -0
  581. package/SVF-doxygen/html/html/namespacemembers_r.html +4 -1
  582. package/SVF-doxygen/html/html/namespacemembers_t.html +3 -0
  583. package/SVF-doxygen/html/html/namespacemembers_type_g.html +1 -1
  584. package/SVF-doxygen/html/html/namespacemembers_type_r.html +3 -0
  585. package/SVF-doxygen/html/html/namespacemembers_v.html +3 -0
  586. package/SVF-doxygen/html/html/namespacemembers_w.html +3 -0
  587. package/SVF-doxygen/html/html/namespaces.html +4 -2
  588. package/SVF-doxygen/html/html/saber_8cpp_source.html +1 -1
  589. package/SVF-doxygen/html/html/search/all_1.js +1 -0
  590. package/SVF-doxygen/html/html/search/all_10.js +13 -10
  591. package/SVF-doxygen/html/html/search/all_11.js +6 -3
  592. package/SVF-doxygen/html/html/search/all_12.js +7 -6
  593. package/SVF-doxygen/html/html/search/all_13.js +5 -4
  594. package/SVF-doxygen/html/html/search/all_15.js +6 -5
  595. package/SVF-doxygen/html/html/search/all_16.js +8 -1
  596. package/SVF-doxygen/html/html/search/all_2.js +6 -4
  597. package/SVF-doxygen/html/html/search/all_3.js +10 -7
  598. package/SVF-doxygen/html/html/search/all_4.js +21 -14
  599. package/SVF-doxygen/html/html/search/all_5.js +9 -4
  600. package/SVF-doxygen/html/html/search/all_6.js +3 -1
  601. package/SVF-doxygen/html/html/search/all_7.js +90 -46
  602. package/SVF-doxygen/html/html/search/all_8.js +1 -2
  603. package/SVF-doxygen/html/html/search/all_9.js +23 -5
  604. package/SVF-doxygen/html/html/search/all_d.js +6 -1
  605. package/SVF-doxygen/html/html/search/all_e.js +11 -8
  606. package/SVF-doxygen/html/html/search/all_f.js +19 -15
  607. package/SVF-doxygen/html/html/search/classes_3.js +13 -9
  608. package/SVF-doxygen/html/html/search/classes_6.js +64 -32
  609. package/SVF-doxygen/html/html/search/classes_8.js +11 -1
  610. package/SVF-doxygen/html/html/search/classes_a.js +1 -0
  611. package/SVF-doxygen/html/html/search/classes_d.js +2 -0
  612. package/SVF-doxygen/html/html/search/classes_e.js +1 -0
  613. package/SVF-doxygen/html/html/search/enums_8.js +1 -6
  614. package/SVF-doxygen/html/html/search/enums_9.js +6 -1
  615. package/SVF-doxygen/html/html/search/enums_a.js +1 -4
  616. package/SVF-doxygen/html/html/search/enums_b.js +4 -2
  617. package/SVF-doxygen/html/html/search/enums_c.js +2 -4
  618. package/SVF-doxygen/html/html/search/enums_d.js +4 -1
  619. package/SVF-doxygen/html/html/search/enums_e.html +26 -0
  620. package/SVF-doxygen/html/html/search/enums_e.js +4 -0
  621. package/SVF-doxygen/html/html/search/enumvalues_1.js +3 -3
  622. package/SVF-doxygen/html/html/search/enumvalues_10.js +1 -0
  623. package/SVF-doxygen/html/html/search/enumvalues_2.js +1 -0
  624. package/SVF-doxygen/html/html/search/enumvalues_3.js +1 -0
  625. package/SVF-doxygen/html/html/search/enumvalues_5.js +1 -0
  626. package/SVF-doxygen/html/html/search/enumvalues_8.js +3 -1
  627. package/SVF-doxygen/html/html/search/enumvalues_b.js +1 -0
  628. package/SVF-doxygen/html/html/search/files_3.js +1 -0
  629. package/SVF-doxygen/html/html/search/files_6.js +4 -1
  630. package/SVF-doxygen/html/html/search/files_7.js +3 -1
  631. package/SVF-doxygen/html/html/search/functions_0.js +1 -0
  632. package/SVF-doxygen/html/html/search/functions_1.js +1 -1
  633. package/SVF-doxygen/html/html/search/functions_10.js +2 -0
  634. package/SVF-doxygen/html/html/search/functions_11.js +1 -2
  635. package/SVF-doxygen/html/html/search/functions_14.js +1 -0
  636. package/SVF-doxygen/html/html/search/functions_15.js +8 -1
  637. package/SVF-doxygen/html/html/search/functions_2.js +4 -2
  638. package/SVF-doxygen/html/html/search/functions_3.js +5 -4
  639. package/SVF-doxygen/html/html/search/functions_4.js +7 -3
  640. package/SVF-doxygen/html/html/search/functions_6.js +21 -12
  641. package/SVF-doxygen/html/html/search/functions_7.js +1 -1
  642. package/SVF-doxygen/html/html/search/functions_8.js +10 -4
  643. package/SVF-doxygen/html/html/search/functions_c.js +5 -0
  644. package/SVF-doxygen/html/html/search/functions_d.js +4 -2
  645. package/SVF-doxygen/html/html/search/functions_e.js +14 -8
  646. package/SVF-doxygen/html/html/search/functions_f.js +3 -1
  647. package/SVF-doxygen/html/html/search/namespaces_1.js +2 -0
  648. package/SVF-doxygen/html/html/search/related_9.js +3 -3
  649. package/SVF-doxygen/html/html/search/searchdata.js +1 -1
  650. package/SVF-doxygen/html/html/search/typedefs_1.js +1 -0
  651. package/SVF-doxygen/html/html/search/typedefs_13.js +1 -1
  652. package/SVF-doxygen/html/html/search/typedefs_2.js +2 -2
  653. package/SVF-doxygen/html/html/search/typedefs_3.js +2 -1
  654. package/SVF-doxygen/html/html/search/typedefs_4.js +1 -1
  655. package/SVF-doxygen/html/html/search/typedefs_6.js +3 -3
  656. package/SVF-doxygen/html/html/search/typedefs_7.js +2 -2
  657. package/SVF-doxygen/html/html/search/typedefs_c.js +4 -4
  658. package/SVF-doxygen/html/html/search/typedefs_e.js +2 -2
  659. package/SVF-doxygen/html/html/search/typedefs_f.js +2 -1
  660. package/SVF-doxygen/html/html/search/variables_10.js +1 -0
  661. package/SVF-doxygen/html/html/search/variables_13.js +3 -3
  662. package/SVF-doxygen/html/html/search/variables_2.js +1 -0
  663. package/SVF-doxygen/html/html/search/variables_3.js +1 -1
  664. package/SVF-doxygen/html/html/search/variables_4.js +1 -0
  665. package/SVF-doxygen/html/html/search/variables_5.js +1 -0
  666. package/SVF-doxygen/html/html/search/variables_6.js +1 -0
  667. package/SVF-doxygen/html/html/search/variables_7.js +2 -1
  668. package/SVF-doxygen/html/html/search/variables_8.js +0 -1
  669. package/SVF-doxygen/html/html/search/variables_9.js +3 -0
  670. package/SVF-doxygen/html/html/search/variables_e.js +1 -1
  671. package/SVF-doxygen/html/html/search/variables_f.js +1 -0
  672. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits-members.html +99 -0
  673. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits.html +193 -0
  674. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits.png +0 -0
  675. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4-members.html +105 -0
  676. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.html +443 -0
  677. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.png +0 -0
  678. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CHGraph_01_5_01_4-members.html +104 -0
  679. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CHGraph_01_5_01_4.html +388 -0
  680. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CHGraph_01_5_01_4.png +0 -0
  681. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4-members.html +106 -0
  682. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +481 -0
  683. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.png +0 -0
  684. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ICFG_01_5_01_4-members.html +106 -0
  685. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +475 -0
  686. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.png +0 -0
  687. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4-members.html +107 -0
  688. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +486 -0
  689. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.png +0 -0
  690. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4-members.html +106 -0
  691. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4.html +457 -0
  692. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4.png +0 -0
  693. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVFG_01_5_01_4-members.html +108 -0
  694. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +595 -0
  695. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.png +0 -0
  696. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01TCT_01_5_01_4-members.html +105 -0
  697. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01TCT_01_5_01_4.html +409 -0
  698. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01TCT_01_5_01_4.png +0 -0
  699. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01VFG_01_5_01_4-members.html +107 -0
  700. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01VFG_01_5_01_4.html +543 -0
  701. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01VFG_01_5_01_4.png +0 -0
  702. package/SVF-doxygen/html/html/structSVF_1_1DefaultDOTGraphTraits-members.html +99 -0
  703. package/SVF-doxygen/html/html/structSVF_1_1DefaultDOTGraphTraits.html +855 -0
  704. package/SVF-doxygen/html/html/structSVF_1_1DefaultDOTGraphTraits.png +0 -0
  705. package/SVF-doxygen/html/html/structSVF_1_1GenericEdge_1_1equalGEdge.html +3 -3
  706. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits-members.html +81 -0
  707. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits.html +116 -0
  708. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01Inverse_3_01T_01_4_01_4_01_4-members.html +81 -0
  709. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01Inverse_3_01T_01_4_01_4_01_4.html +106 -0
  710. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01Inverse_3_01T_01_4_01_4_01_4.png +0 -0
  711. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CFLNode_01_5_01_4_01_4-members.html +81 -0
  712. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CFLNode_01_5_01_4_01_4.html +110 -0
  713. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CFLNode_01_5_01_4_01_4.png +0 -0
  714. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CHNode_01_5_01_4_01_4-members.html +81 -0
  715. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CHNode_01_5_01_4_01_4.html +110 -0
  716. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CHNode_01_5_01_4_01_4.png +0 -0
  717. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1ConstraintNode_01_5_01_4_01_4-members.html +81 -0
  718. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1ConstraintNode_01_5_01_4_01_4.html +110 -0
  719. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1ConstraintNode_01_5_01_4_01_4.png +0 -0
  720. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1DCHNode_01_5_01_4_01_4-members.html +81 -0
  721. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1DCHNode_01_5_01_4_01_4.html +110 -0
  722. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1DCHNode_01_5_01_4_01_4.png +0 -0
  723. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_4_01_4-members.html +88 -0
  724. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_4_01_4.html +324 -0
  725. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4-members.html +81 -0
  726. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4.html +110 -0
  727. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4.png +0 -0
  728. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1PTACallGraphNode_01_5_01_4_01_4-members.html +81 -0
  729. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1PTACallGraphNode_01_5_01_4_01_4.html +110 -0
  730. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1PTACallGraphNode_01_5_01_4_01_4.png +0 -0
  731. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1SVFVar_01_5_01_4_01_4-members.html +81 -0
  732. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1SVFVar_01_5_01_4_01_4.html +110 -0
  733. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1SVFVar_01_5_01_4_01_4.png +0 -0
  734. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1TCTNode_01_5_01_4_01_4-members.html +81 -0
  735. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1TCTNode_01_5_01_4_01_4.html +110 -0
  736. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1TCTNode_01_5_01_4_01_4.png +0 -0
  737. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1VFGNode_01_5_01_4_01_4-members.html +81 -0
  738. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1VFGNode_01_5_01_4_01_4.html +110 -0
  739. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1VFGNode_01_5_01_4_01_4.png +0 -0
  740. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFLGraph_01_5_01_4-members.html +81 -0
  741. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFLGraph_01_5_01_4.html +126 -0
  742. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFLGraph_01_5_01_4.png +0 -0
  743. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFLNode_01_5_01_4-members.html +81 -0
  744. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFLNode_01_5_01_4.html +106 -0
  745. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFLNode_01_5_01_4.png +0 -0
  746. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CHGraph_01_5_01_4-members.html +81 -0
  747. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CHGraph_01_5_01_4.html +126 -0
  748. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CHGraph_01_5_01_4.png +0 -0
  749. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CHNode_01_5_01_4-members.html +81 -0
  750. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CHNode_01_5_01_4.html +106 -0
  751. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CHNode_01_5_01_4.png +0 -0
  752. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintGraph_01_5_01_4-members.html +81 -0
  753. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintGraph_01_5_01_4.html +126 -0
  754. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintGraph_01_5_01_4.png +0 -0
  755. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintNode_01_5_01_4-members.html +81 -0
  756. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintNode_01_5_01_4.html +106 -0
  757. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintNode_01_5_01_4.png +0 -0
  758. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1DCHGraph_01_5_01_4-members.html +81 -0
  759. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1DCHGraph_01_5_01_4.html +126 -0
  760. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1DCHGraph_01_5_01_4.png +0 -0
  761. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1DCHNode_01_5_01_4-members.html +81 -0
  762. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1DCHNode_01_5_01_4.html +106 -0
  763. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1DCHNode_01_5_01_4.png +0 -0
  764. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1GenericGraph_3_01NodeTy_00_01EdgeTy_01_4_01_5_4-members.html +99 -0
  765. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1GenericGraph_3_01NodeTy_00_01EdgeTy_01_4_01_5_4.html +467 -0
  766. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1GenericGraph_3_01NodeTy_00_01EdgeTy_01_4_01_5_4.png +0 -0
  767. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_01_4-members.html +89 -0
  768. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_01_4.html +367 -0
  769. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_01_4.png +0 -0
  770. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4-members.html +81 -0
  771. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4.html +106 -0
  772. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4.png +0 -0
  773. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ICFG_01_5_01_4-members.html +81 -0
  774. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ICFG_01_5_01_4.html +126 -0
  775. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ICFG_01_5_01_4.png +0 -0
  776. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1IRGraph_01_5_01_4-members.html +81 -0
  777. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1IRGraph_01_5_01_4.html +126 -0
  778. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1IRGraph_01_5_01_4.png +0 -0
  779. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1PTACallGraphNode_01_5_01_4-members.html +81 -0
  780. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1PTACallGraphNode_01_5_01_4.html +106 -0
  781. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1PTACallGraphNode_01_5_01_4.png +0 -0
  782. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1PTACallGraph_01_5_01_4-members.html +81 -0
  783. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1PTACallGraph_01_5_01_4.html +126 -0
  784. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1PTACallGraph_01_5_01_4.png +0 -0
  785. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFG_01_5_01_4-members.html +81 -0
  786. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFG_01_5_01_4.html +126 -0
  787. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFG_01_5_01_4.png +0 -0
  788. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFVar_01_5_01_4-members.html +81 -0
  789. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFVar_01_5_01_4.html +106 -0
  790. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFVar_01_5_01_4.png +0 -0
  791. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1TCTNode_01_5_01_4-members.html +81 -0
  792. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1TCTNode_01_5_01_4.html +106 -0
  793. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1TCTNode_01_5_01_4.png +0 -0
  794. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1TCT_01_5_01_4-members.html +81 -0
  795. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1TCT_01_5_01_4.html +126 -0
  796. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1TCT_01_5_01_4.png +0 -0
  797. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1VFGNode_01_5_01_4-members.html +81 -0
  798. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1VFGNode_01_5_01_4.html +106 -0
  799. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1VFGNode_01_5_01_4.png +0 -0
  800. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1VFG_01_5_01_4-members.html +81 -0
  801. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1VFG_01_5_01_4.html +126 -0
  802. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1VFG_01_5_01_4.png +0 -0
  803. package/SVF-doxygen/html/html/structSVF_1_1Inverse-members.html +82 -0
  804. package/SVF-doxygen/html/html/structSVF_1_1Inverse.html +154 -0
  805. package/SVF-doxygen/html/html/structSVF_1_1SparseBitVectorElement-members.html +3 -3
  806. package/SVF-doxygen/html/html/structSVF_1_1SparseBitVectorElement.html +46 -46
  807. package/SVF-doxygen/html/html/structSVF_1_1pointee__iter-members.html +111 -0
  808. package/SVF-doxygen/html/html/structSVF_1_1pointee__iter.html +279 -0
  809. package/SVF-doxygen/html/html/structSVF_1_1pointee__iter.png +0 -0
  810. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits-members.html +99 -0
  811. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits.html +193 -0
  812. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits.png +0 -0
  813. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4-members.html +22 -4
  814. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.html +67 -10
  815. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.png +0 -0
  816. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CHGraph_01_5_01_4-members.html +21 -3
  817. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CHGraph_01_5_01_4.html +65 -8
  818. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CHGraph_01_5_01_4.png +0 -0
  819. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4-members.html +22 -4
  820. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +72 -12
  821. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.png +0 -0
  822. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4-members.html +23 -5
  823. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +70 -10
  824. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.png +0 -0
  825. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4-members.html +23 -5
  826. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +68 -11
  827. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.png +0 -0
  828. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4-members.html +23 -5
  829. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4.html +68 -11
  830. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4.png +0 -0
  831. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4-members.html +24 -6
  832. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +76 -15
  833. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.png +0 -0
  834. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01TCT_01_5_01_4-members.html +22 -4
  835. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01TCT_01_5_01_4.html +67 -10
  836. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01TCT_01_5_01_4.png +0 -0
  837. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4-members.html +24 -6
  838. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4.html +73 -12
  839. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4.png +0 -0
  840. package/SVF-doxygen/html/html/structllvm_1_1DefaultDOTGraphTraits-members.html +99 -0
  841. package/SVF-doxygen/html/html/structllvm_1_1DefaultDOTGraphTraits.html +855 -0
  842. package/SVF-doxygen/html/html/structllvm_1_1DefaultDOTGraphTraits.png +0 -0
  843. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits-members.html +81 -0
  844. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits.html +116 -0
  845. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01Inverse_3_01T_01_4_01_4_01_4-members.html +81 -0
  846. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01Inverse_3_01T_01_4_01_4_01_4.html +106 -0
  847. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01Inverse_3_01T_01_4_01_4_01_4.png +0 -0
  848. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1CFLNode_01_5_01_4_01_4-members.html +81 -0
  849. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1CFLNode_01_5_01_4_01_4.html +12 -2
  850. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1CFLNode_01_5_01_4_01_4.png +0 -0
  851. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1CHNode_01_5_01_4_01_4-members.html +81 -0
  852. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1CHNode_01_5_01_4_01_4.html +12 -2
  853. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1CHNode_01_5_01_4_01_4.png +0 -0
  854. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ConstraintNode_01_5_01_4_01_4-members.html +81 -0
  855. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ConstraintNode_01_5_01_4_01_4.html +12 -2
  856. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ConstraintNode_01_5_01_4_01_4.png +0 -0
  857. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1DCHNode_01_5_01_4_01_4-members.html +81 -0
  858. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1DCHNode_01_5_01_4_01_4.html +12 -2
  859. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1DCHNode_01_5_01_4_01_4.png +0 -0
  860. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_4_01_4-members.html +1 -1
  861. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_4_01_4.html +33 -31
  862. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4-members.html +81 -0
  863. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4.html +12 -2
  864. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4.png +0 -0
  865. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1PTACallGraphNode_01_5_01_4_01_4-members.html +81 -0
  866. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1PTACallGraphNode_01_5_01_4_01_4.html +12 -2
  867. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1PTACallGraphNode_01_5_01_4_01_4.png +0 -0
  868. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1SVFVar_01_5_01_4_01_4-members.html +81 -0
  869. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1SVFVar_01_5_01_4_01_4.html +12 -2
  870. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1SVFVar_01_5_01_4_01_4.png +0 -0
  871. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1TCTNode_01_5_01_4_01_4-members.html +81 -0
  872. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1TCTNode_01_5_01_4_01_4.html +12 -2
  873. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1TCTNode_01_5_01_4_01_4.png +0 -0
  874. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1VFGNode_01_5_01_4_01_4-members.html +81 -0
  875. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1VFGNode_01_5_01_4_01_4.html +12 -2
  876. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1VFGNode_01_5_01_4_01_4.png +0 -0
  877. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CFLGraph_01_5_01_4.html +5 -1
  878. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CFLGraph_01_5_01_4.png +0 -0
  879. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CFLNode_01_5_01_4-members.html +81 -0
  880. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CFLNode_01_5_01_4.html +10 -0
  881. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CFLNode_01_5_01_4.png +0 -0
  882. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CHGraph_01_5_01_4.html +5 -1
  883. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CHGraph_01_5_01_4.png +0 -0
  884. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CHNode_01_5_01_4-members.html +81 -0
  885. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CHNode_01_5_01_4.html +10 -0
  886. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CHNode_01_5_01_4.png +0 -0
  887. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ConstraintGraph_01_5_01_4.html +5 -1
  888. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ConstraintGraph_01_5_01_4.png +0 -0
  889. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ConstraintNode_01_5_01_4-members.html +81 -0
  890. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ConstraintNode_01_5_01_4.html +10 -0
  891. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ConstraintNode_01_5_01_4.png +0 -0
  892. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1DCHGraph_01_5_01_4.html +5 -1
  893. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1DCHGraph_01_5_01_4.png +0 -0
  894. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1DCHNode_01_5_01_4-members.html +81 -0
  895. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1DCHNode_01_5_01_4.html +10 -0
  896. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1DCHNode_01_5_01_4.png +0 -0
  897. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1GenericGraph_3_01NodeTy_00_01EdgeTy_01_4_01_5_4-members.html +2 -2
  898. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1GenericGraph_3_01NodeTy_00_01EdgeTy_01_4_01_5_4.html +46 -44
  899. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_01_4-members.html +1 -1
  900. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1GenericNode_3_01NodeTy_00_01EdgeTy_01_4_01_5_01_4.html +38 -34
  901. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4-members.html +81 -0
  902. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4.html +10 -0
  903. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4.png +0 -0
  904. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFG_01_5_01_4.html +5 -1
  905. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFG_01_5_01_4.png +0 -0
  906. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1IRGraph_01_5_01_4.html +5 -1
  907. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1IRGraph_01_5_01_4.png +0 -0
  908. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1PTACallGraphNode_01_5_01_4-members.html +81 -0
  909. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1PTACallGraphNode_01_5_01_4.html +10 -0
  910. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1PTACallGraphNode_01_5_01_4.png +0 -0
  911. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1PTACallGraph_01_5_01_4.html +5 -1
  912. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1PTACallGraph_01_5_01_4.png +0 -0
  913. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1SVFG_01_5_01_4.html +5 -1
  914. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1SVFG_01_5_01_4.png +0 -0
  915. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1SVFVar_01_5_01_4-members.html +81 -0
  916. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1SVFVar_01_5_01_4.html +10 -0
  917. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1SVFVar_01_5_01_4.png +0 -0
  918. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1TCTNode_01_5_01_4-members.html +81 -0
  919. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1TCTNode_01_5_01_4.html +10 -0
  920. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1TCTNode_01_5_01_4.png +0 -0
  921. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1TCT_01_5_01_4.html +5 -1
  922. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1TCT_01_5_01_4.png +0 -0
  923. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1VFGNode_01_5_01_4-members.html +81 -0
  924. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1VFGNode_01_5_01_4.html +10 -0
  925. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1VFGNode_01_5_01_4.png +0 -0
  926. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1VFG_01_5_01_4.html +5 -1
  927. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1VFG_01_5_01_4.png +0 -0
  928. package/SVF-doxygen/html/html/structllvm_1_1Inverse-members.html +82 -0
  929. package/SVF-doxygen/html/html/structllvm_1_1Inverse.html +154 -0
  930. package/SVF-doxygen/html/html/structllvm_1_1pointee__iterator-members.html +111 -0
  931. package/SVF-doxygen/html/html/structllvm_1_1pointee__iterator.html +279 -0
  932. package/SVF-doxygen/html/html/structllvm_1_1pointee__iterator.png +0 -0
  933. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CallSite_01_4.html +3 -3
  934. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CxtProc_01_4.html +1 -1
  935. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CxtStmt_01_4.html +1 -1
  936. package/SVF-doxygen/html/html/svf-ex_8cpp.html +9 -9
  937. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +7 -7
  938. package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +4 -4
  939. package/SVF-doxygen/html/html/wpa_8cpp_source.html +1 -1
  940. package/include/Graphs/CFLGraph.h +6 -6
  941. package/include/Graphs/CHG.h +6 -6
  942. package/include/Graphs/ConsG.h +6 -6
  943. package/include/Graphs/DOTGraphTraits.h +188 -0
  944. package/include/Graphs/GenericGraph.h +58 -18
  945. package/include/Graphs/GraphPrinter.h +14 -22
  946. package/include/Graphs/GraphTraits.h +150 -0
  947. package/include/Graphs/GraphWriter.h +380 -0
  948. package/include/Graphs/ICFG.h +6 -6
  949. package/include/Graphs/IRGraph.h +6 -7
  950. package/include/Graphs/PTACallGraph.h +6 -6
  951. package/include/Graphs/SVFG.h +6 -6
  952. package/include/Graphs/VFG.h +6 -6
  953. package/include/MTA/TCT.h +6 -6
  954. package/include/SABER/SrcSnkSolver.h +2 -2
  955. package/include/SVF-LLVM/DCHG.h +6 -6
  956. package/include/SVF-LLVM/LLVMUtil.h +5 -0
  957. package/include/SVF-LLVM/SymbolTableBuilder.h +0 -3
  958. package/include/SVFIR/SVFValue.h +2 -11
  959. package/include/SVFIR/SVFVariables.h +5 -5
  960. package/include/Util/GraphReachSolver.h +2 -2
  961. package/include/Util/SCC.h +1 -1
  962. package/include/Util/iterator.h +407 -0
  963. package/include/Util/iterator_range.h +76 -0
  964. package/include/WPA/WPASolver.h +1 -1
  965. package/lib/Graphs/CFLGraph.cpp +2 -2
  966. package/lib/Graphs/CHG.cpp +2 -2
  967. package/lib/Graphs/ConsG.cpp +2 -2
  968. package/lib/Graphs/GraphWriter.cpp +53 -0
  969. package/lib/Graphs/ICFG.cpp +2 -2
  970. package/lib/Graphs/IRGraph.cpp +2 -2
  971. package/lib/Graphs/PTACallGraph.cpp +2 -2
  972. package/lib/Graphs/SVFG.cpp +1 -1
  973. package/lib/Graphs/VFG.cpp +2 -2
  974. package/lib/MTA/TCT.cpp +1 -1
  975. package/lib/SVF-LLVM/LLVMModule.cpp +1 -2
  976. package/lib/SVF-LLVM/LLVMUtil.cpp +40 -0
  977. package/lib/SVF-LLVM/SVFIRBuilder.cpp +1 -1
  978. package/lib/SVF-LLVM/SymbolTableBuilder.cpp +0 -34
  979. package/lib/SVFIR/SVFValue.cpp +0 -1
  980. package/package.json +1 -1
@@ -66,7 +66,7 @@ $(function() {
66
66
  <div class="title">SparseBitVector.h</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="SparseBitVector_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">//===- SparseBitVector.h - Efficient Sparse BitVector --*- 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;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#ifndef SPARSEBITVECTOR_H</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#define SPARSEBITVECTOR_H</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &lt;ostream&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &lt;climits&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;iterator&gt;</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;list&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// Appease GCC?</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#ifdef __has_builtin</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor"># define HAS_CLZ __has_builtin(__builtin_clz)</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor"># define HAS_CLZLL __has_builtin(__builtin_clzll)</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="SparseBitVector_8h.html#aa4aed82d501b04499090de2c616e6b1f"> 24</a></span>&#160;<span class="preprocessor"># define HAS_CLZ 0</span></div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="SparseBitVector_8h.html#ad66fb43b1e40d6e22629fcd889d4bfab"> 25</a></span>&#160;<span class="preprocessor"># define HAS_CLZLL 0</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;{</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349"> 32</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;{</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54"> 35</a></span>&#160; <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54">ZB_Undefined</a>,</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349aac378e728f7d53b2d96be1d33c63afb1"> 37</a></span>&#160; <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349aac378e728f7d53b2d96be1d33c63afb1">ZB_Max</a>,</div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7"> 39</a></span>&#160; <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7">ZB_Width</a></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;};</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"><a class="line" href="structSVF_1_1TrailingZerosCounter.html"> 42</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, std::<span class="keywordtype">size_t</span> SizeOfT&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1TrailingZerosCounter.html">TrailingZerosCounter</a></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;{</div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83"> 44</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a>)</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; {</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">if</span> (!Val)</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">return</span> std::numeric_limits&lt;T&gt;::digits;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordflow">if</span> (Val &amp; 0x1)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">// Bisection method.</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordtype">unsigned</span> ZeroBits = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; T Shift = std::numeric_limits&lt;T&gt;::digits &gt;&gt; 1;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; T Mask = std::numeric_limits&lt;T&gt;::max() &gt;&gt; Shift;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordflow">while</span> (Shift)</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; {</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">if</span> ((Val &amp; Mask) == 0)</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; Val &gt;&gt;= Shift;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; ZeroBits |= Shift;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; }</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; Shift &gt;&gt;= 1;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; Mask &gt;&gt;= Shift;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; }</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keywordflow">return</span> ZeroBits;</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"> 67</span>&#160;};</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461"> 77</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB = <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7">ZB_Width</a>)</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; static_assert(std::numeric_limits&lt;T&gt;::is_integer &amp;&amp;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; !std::numeric_limits&lt;T&gt;::is_signed,</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="stringliteral">&quot;Only unsigned integral types are allowed.&quot;</span>);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html">TrailingZerosCounter&lt;T, sizeof(T)&gt;::count</a>(Val, ZB);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;}</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structSVF_1_1PopulationCounter.html"> 85</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, std::<span class="keywordtype">size_t</span> SizeOfT&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1PopulationCounter.html">PopulationCounter</a></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"><a class="line" href="structSVF_1_1PopulationCounter.html#aa49a07f6be7991ffe42af5445b38d59b"> 87</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1PopulationCounter.html#aa49a07f6be7991ffe42af5445b38d59b">count</a>(T <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>)</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; <span class="comment">// Generic version, forward to 32 bits.</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; static_assert(SizeOfT &lt;= 4, <span class="stringliteral">&quot;Not implemented!&quot;</span>);</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">return</span> __builtin_popcount(Value);</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; uint32_t v = <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; v = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; v = (v &amp; 0x33333333) + ((v &gt;&gt; 2) &amp; 0x33333333);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">return</span> ((v + (v &gt;&gt; 4) &amp; 0xF0F0F0F) * 0x1010101) &gt;&gt; 24;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</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"><a class="line" href="structSVF_1_1LeadingZerosCounter.html"> 102</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, std::<span class="keywordtype">size_t</span> SizeOfT&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter</a></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;{</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structSVF_1_1LeadingZerosCounter.html#ad85fa905e96374d79a832a027226d8d3"> 104</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1LeadingZerosCounter.html#ad85fa905e96374d79a832a027226d8d3">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a>)</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; {</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span> (!Val)</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">return</span> std::numeric_limits&lt;T&gt;::digits;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// Bisection method.</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordtype">unsigned</span> ZeroBits = 0;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">for</span> (T Shift = std::numeric_limits&lt;T&gt;::digits &gt;&gt; 1; Shift; Shift &gt;&gt;= 1)</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; T Tmp = Val &gt;&gt; Shift;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">if</span> (Tmp)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; Val = Tmp;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; ZeroBits |= Shift;</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="keywordflow">return</span> ZeroBits;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</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;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="preprocessor">#if defined(__GNUC__) || defined(_MSC_VER)</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter</a>&lt;T, 4&gt;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;{</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB)</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; <span class="keywordflow">if</span> (ZB != <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54">ZB_Undefined</a> &amp;&amp; Val == 0)</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">return</span> 32;</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;<span class="preprocessor">#if defined(__GNUC__) || HAS_CLZ</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">return</span> __builtin_clz(Val);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="preprocessor">#elif defined(_MSC_VER)</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Index;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; _BitScanReverse(&amp;Index, Val);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">return</span> Index ^ 31;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</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;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="preprocessor">#if !defined(_MSC_VER) || defined(_M_X64)</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter</a>&lt;T, 8&gt;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB)</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; {</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">if</span> (ZB != <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54">ZB_Undefined</a> &amp;&amp; Val == 0)</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">return</span> 64;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="preprocessor">#if defined(__GNUC__) || HAS_CLZLL</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">return</span> __builtin_clzll(Val);</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="preprocessor">#elif defined(_MSC_VER)</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Index;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; _BitScanReverse64(&amp;Index, Val);</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">return</span> Index ^ 63;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="preprocessor">#endif</span></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"> 157</span>&#160;};</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af897f6692f1f6aa13d897f89b3370d0d"> 169</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#af897f6692f1f6aa13d897f89b3370d0d">countLeadingZeros</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB = <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7">ZB_Width</a>)</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;{</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; static_assert(std::numeric_limits&lt;T&gt;::is_integer &amp;&amp;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; !std::numeric_limits&lt;T&gt;::is_signed,</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="stringliteral">&quot;Only unsigned integral types are allowed.&quot;</span>);</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter&lt;T, sizeof(T)&gt;::count</a>(Val, ZB);</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;}</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="structSVF_1_1PopulationCounter_3_01T_00_018_01_4.html"> 177</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1PopulationCounter.html">PopulationCounter</a>&lt;T, 8&gt;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;{</div><div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="structSVF_1_1PopulationCounter_3_01T_00_018_01_4.html#a6b0aabdd55f93d2b5ea8df270a14a0ec"> 179</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1PopulationCounter_3_01T_00_018_01_4.html#a6b0aabdd55f93d2b5ea8df270a14a0ec">count</a>(T <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>)</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; {</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">return</span> __builtin_popcountll(Value);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; uint64_t v = <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; v = v - ((v &gt;&gt; 1) &amp; 0x5555555555555555ULL);</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; v = (v &amp; 0x3333333333333333ULL) + ((v &gt;&gt; 2) &amp; 0x3333333333333333ULL);</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; v = (v + (v &gt;&gt; 4)) &amp; 0x0F0F0F0F0F0F0F0FULL;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">return</span> unsigned((uint64_t)(v * 0x0101010101010101ULL) &gt;&gt; 56);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;<span class="preprocessor">#endif</span></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;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="namespaceSVF.html#ae86e9ecca38512426d0bade3a95d0a51"> 197</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#ae86e9ecca38512426d0bade3a95d0a51">countPopulation</a>(T <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>)</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;{</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; static_assert(std::numeric_limits&lt;T&gt;::is_integer &amp;&amp;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; !std::numeric_limits&lt;T&gt;::is_signed,</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="stringliteral">&quot;Only unsigned integral types are allowed.&quot;</span>);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1PopulationCounter.html">PopulationCounter&lt;T, sizeof(T)&gt;::count</a>(<a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>);</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="l00217"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html"> 217</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize = 128&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a></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="keyword">public</span>:</div><div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d"> 220</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> = <span class="keywordtype">unsigned</span> long;</div><div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ad9e38352db094adcdfb2964f325d9e53"> 221</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ad9e38352db094adcdfb2964f325d9e53">size_type</a> = unsigned;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keyword">enum</span></div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; {</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a88e49a140a08313ab4d664774c4957a2a3335c07a7225c80110e998246f96d6c4"> 224</a></span>&#160; BITWORD_SIZE = <span class="keyword">sizeof</span>(<a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a>) * CHAR_BIT,</div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a88e49a140a08313ab4d664774c4957a2a3dde12fdc7052a87d20741d2c31a65a3"> 225</a></span>&#160; BITWORDS_PER_ELEMENT = (ElementSize + BITWORD_SIZE - 1) / BITWORD_SIZE,</div><div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a88e49a140a08313ab4d664774c4957a2aeb226b2e0dea78fbdbf5b780c3745f6d"> 226</a></span>&#160; BITS_PER_ELEMENT = ElementSize</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; };</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="comment">// Index of Element in terms of where first bit starts.</span></div><div class="line"><a name="l00231"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ae5c5ac3afef47499a4e852de0dc39c18"> 231</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae5c5ac3afef47499a4e852de0dc39c18">ElementIndex</a>;</div><div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526"> 232</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> Bits[BITWORDS_PER_ELEMENT];</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;</div><div class="line"><a name="l00234"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a4ec765790960025d3468866c326ab87b"> 234</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4ec765790960025d3468866c326ab87b">SparseBitVectorElement</a>()</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; ElementIndex = ~0U;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; memset(&amp;Bits[0], 0, <span class="keyword">sizeof</span> (<a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a>) * BITWORDS_PER_ELEMENT);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00241"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a75777b1461184d8fb2cfa4ec6e95c1c5"> 241</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a75777b1461184d8fb2cfa4ec6e95c1c5">SparseBitVectorElement</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; ElementIndex = Idx;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; memset(&amp;Bits[0], 0, <span class="keyword">sizeof</span> (<a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a>) * BITWORDS_PER_ELEMENT);</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; }</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">// Comparison.</span></div><div class="line"><a name="l00248"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a8484d923c29872843b0d0ffcebf4d112"> 248</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a8484d923c29872843b0d0ffcebf4d112">operator==</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keywordflow">if</span> (ElementIndex != RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae5c5ac3afef47499a4e852de0dc39c18">ElementIndex</a>)</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">if</span> (Bits[i] != RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i])</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</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"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#aa812f8538b869b004791b4177c50069b"> 258</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#aa812f8538b869b004791b4177c50069b">operator!=</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == RHS);</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; }</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; <span class="comment">// Return the bits that make up word Idx in our element.</span></div><div class="line"><a name="l00264"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f"> 264</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(<span class="keywordtype">unsigned</span> Idx)<span class="keyword"> const</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; assert(Idx &lt; BITWORDS_PER_ELEMENT);</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">return</span> Bits[Idx];</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; }</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160;</div><div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827"> 270</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keywordflow">return</span> ElementIndex;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ac3a4795681af74563d757f587252aa7f"> 275</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ac3a4795681af74563d757f587252aa7f">empty</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keywordflow">if</span> (Bits[i])</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; }</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;</div><div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a094acafea02f3c117445267e75c9a629"> 283</a></span>&#160; <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; {</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; Bits[Idx / BITWORD_SIZE] |= 1L &lt;&lt; (Idx % BITWORD_SIZE);</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</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"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a7a5d223870e32035863f6596727c6775"> 288</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a7a5d223870e32035863f6596727c6775">test_and_set</a>(<span class="keywordtype">unsigned</span> Idx)</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="keywordtype">bool</span> old = test(Idx);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keywordflow">if</span> (!old)</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keyword">set</span>(Idx);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</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; <span class="keywordflow">return</span> <span class="keyword">false</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="l00299"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#acced4edf716af14a6931156d59e50632"> 299</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#acced4edf716af14a6931156d59e50632">reset</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; {</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; Bits[Idx / BITWORD_SIZE] &amp;= ~(1L &lt;&lt; (Idx % BITWORD_SIZE));</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; }</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"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a465b415217533f1f0026bec837495fdd"> 304</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a465b415217533f1f0026bec837495fdd">test</a>(<span class="keywordtype">unsigned</span> Idx)<span class="keyword"> const</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">return</span> Bits[Idx / BITWORD_SIZE] &amp; (1L &lt;&lt; (Idx % BITWORD_SIZE));</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; }</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a8ed9ca88c7eef7574a9887197b422e81"> 309</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ad9e38352db094adcdfb2964f325d9e53">size_type</a> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a8ed9ca88c7eef7574a9887197b422e81">count</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordtype">unsigned</span> NumBits = 0;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; NumBits += <a class="code" href="namespaceSVF.html#ae86e9ecca38512426d0bade3a95d0a51">countPopulation</a>(Bits[i]);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">return</span> NumBits;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2281ff5a0a492064cff864d4c246cbc2"> 318</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2281ff5a0a492064cff864d4c246cbc2">find_first</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keywordflow">return</span> i * BITWORD_SIZE + <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(Bits[i]);</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;SBV: find_first: SBV cannot be empty&quot;</span>);</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; abort();</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="l00328"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a1d79c099887fcf01f5c0743b38caf39d"> 328</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a1d79c099887fcf01f5c0743b38caf39d">find_last</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> I = 0; I &lt; BITWORDS_PER_ELEMENT; ++I)</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; {</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordtype">unsigned</span> Idx = BITWORDS_PER_ELEMENT - I - 1;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">if</span> (Bits[Idx] != 0)</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">return</span> Idx * BITWORD_SIZE + BITWORD_SIZE -</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <a class="code" href="namespaceSVF.html#af897f6692f1f6aa13d897f89b3370d0d">countLeadingZeros</a>(Bits[Idx]) - 1;</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; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;SBV: find_last: SBV cannot be empty&quot;</span>);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; abort();</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; }</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a60a023744119cd0424511ea1e83b76e1"> 343</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a60a023744119cd0424511ea1e83b76e1">find_next</a>(<span class="keywordtype">unsigned</span> Curr)<span class="keyword"> const</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">if</span> (Curr &gt;= BITS_PER_ELEMENT)</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordtype">unsigned</span> WordPos = Curr / BITWORD_SIZE;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordtype">unsigned</span> BitPos = Curr % BITWORD_SIZE;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> Copy = Bits[WordPos];</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; assert(WordPos &lt;= BITWORDS_PER_ELEMENT</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; &amp;&amp; <span class="stringliteral">&quot;Word Position outside of element&quot;</span>);</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; <span class="comment">// Mask off previous bits.</span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; Copy &amp;= ~0UL &lt;&lt; BitPos;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordflow">if</span> (Copy != 0)</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="keywordflow">return</span> WordPos * BITWORD_SIZE + <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(Copy);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="comment">// Check subsequent words.</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = WordPos+1; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordflow">return</span> i * BITWORD_SIZE + <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(Bits[i]);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">return</span> -1;</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="l00367"></a><span class="lineno"> 367</span>&#160; <span class="comment">// Union this element with RHS and return true if this one changed.</span></div><div class="line"><a name="l00368"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a34e70705e4618e6d79a19ee7725e4960"> 368</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a34e70705e4618e6d79a19ee7725e4960">unionWith</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; {</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; {</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> old = changed ? 0 : Bits[i];</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; Bits[i] |= RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">if</span> (!changed &amp;&amp; old != Bits[i])</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">// Return true if we have any bits in common with RHS</span></div><div class="line"><a name="l00383"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2ac6b33e335ac411740c875c6aeb6706"> 383</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2ac6b33e335ac411740c875c6aeb6706">intersects</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; {</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="keywordflow">if</span> (RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i] &amp; Bits[i])</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; }</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; }</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// Intersect this Element with RHS and return true if this one changed.</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="comment">// BecameZero is set to true if this element became all-zero bits.</span></div><div class="line"><a name="l00395"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2f62812b261a83b19aab46c0961bfcb4"> 395</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2f62812b261a83b19aab46c0961bfcb4">intersectWith</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS,</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordtype">bool</span> &amp;BecameZero)</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; {</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordtype">bool</span> allzero = <span class="keyword">true</span>;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160;</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> old = changed ? 0 : Bits[i];</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160;</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; Bits[i] &amp;= RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; allzero = <span class="keyword">false</span>;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">if</span> (!changed &amp;&amp; old != Bits[i])</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; }</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; BecameZero = allzero;</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="comment">// Intersect this Element with the complement of RHS and return true if this</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="comment">// one changed. BecameZero is set to true if this element became all-zero</span></div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="comment">// bits.</span></div><div class="line"><a name="l00420"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ac721b283253b7bd96fedd5f12c079699"> 420</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ac721b283253b7bd96fedd5f12c079699">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS,</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keywordtype">bool</span> &amp;BecameZero)</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; {</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keywordtype">bool</span> allzero = <span class="keyword">true</span>;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; {</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> old = changed ? 0 : Bits[i];</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; Bits[i] &amp;= ~RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; allzero = <span class="keyword">false</span>;</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">if</span> (!changed &amp;&amp; old != Bits[i])</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; }</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; BecameZero = allzero;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="comment">// Three argument version of intersectWithComplement that intersects</span></div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="comment">// RHS1 &amp; ~RHS2 into this element</span></div><div class="line"><a name="l00444"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a6d81176f07f369b38da34e624710b387"> 444</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a6d81176f07f369b38da34e624710b387">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS1,</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS2,</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="keywordtype">bool</span> &amp;BecameZero)</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="keywordtype">bool</span> allzero = <span class="keyword">true</span>;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; {</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; Bits[i] = RHS1.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i] &amp; ~RHS2.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; allzero = <span class="keyword">false</span>;</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; }</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; BecameZero = allzero;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160;};</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize = 128&gt;</div><div class="line"><a name="l00462"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html"> 462</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a></div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160;{</div><div class="line"><a name="l00464"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a74ab73c1674200bb4560070c8b10346d"> 464</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a74ab73c1674200bb4560070c8b10346d">ElementList</a> = std::list&lt;SparseBitVectorElement&lt;ElementSize&gt;&gt;;</div><div class="line"><a name="l00465"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed"> 465</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> = <span class="keyword">typename</span> ElementList::iterator;</div><div class="line"><a name="l00466"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f"> 466</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> = <span class="keyword">typename</span> ElementList::const_iterator;</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keyword">enum</span></div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; {</div><div class="line"><a name="l00469"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ae6cdfbedeb260d7fc91d83f7c1523be8a887a4856f51078b02a23348b7331453e"> 469</a></span>&#160; BITWORD_SIZE = <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement&lt;ElementSize&gt;::BITWORD_SIZE</a></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; };</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160;</div><div class="line"><a name="l00472"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636"> 472</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a74ab73c1674200bb4560070c8b10346d">ElementList</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="comment">// Pointer to our current Element. This has no visible effect on the external</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="comment">// state of a SparseBitVector, it&#39;s just used to improve performance in the</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="comment">// common case of testing/modifying bits with similar indices.</span></div><div class="line"><a name="l00476"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ada7cb2e144c2fccd0d50138778b152dd"> 476</a></span>&#160; <span class="keyword">mutable</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ada7cb2e144c2fccd0d50138778b152dd">CurrElementIter</a>;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="comment">// This is like std::lower_bound, except we do linear searching from the</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// current position.</span></div><div class="line"><a name="l00480"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ad53d20775e5445a438f579743aa77cf3"> 480</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ad53d20775e5445a438f579743aa77cf3">FindLowerBoundImpl</a>(<span class="keywordtype">unsigned</span> ElementIndex)<span class="keyword"> const</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160;</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="comment">// We cache a non-const iterator so we&#39;re forced to resort to const_cast to</span></div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="comment">// get the begin/end in the case where &#39;this&#39; is const. To avoid duplication</span></div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="comment">// of code with the only difference being whether the const cast is present</span></div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="comment">// &#39;this&#39; is always const in this particular function and we sort out the</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="comment">// difference in FindLowerBound and FindLowerBoundConst.</span></div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Begin =</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keyword">const_cast&lt;</span><a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;Elements.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>();</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> End =</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keyword">const_cast&lt;</span><a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;Elements.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>();</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; {</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; CurrElementIter = Begin;</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="keywordflow">return</span> CurrElementIter;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="comment">// Make sure our current iterator is valid.</span></div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keywordflow">if</span> (CurrElementIter == End)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; --CurrElementIter;</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="comment">// Search from our current iterator, either backwards or forwards,</span></div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="comment">// depending on what element we are looking for.</span></div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> ElementIter = CurrElementIter;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="keywordflow">if</span> (CurrElementIter-&gt;index() == ElementIndex)</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; {</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">return</span> ElementIter;</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (CurrElementIter-&gt;index() &gt; ElementIndex)</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; {</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="keywordflow">while</span> (ElementIter != Begin</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; &amp;&amp; ElementIter-&gt;index() &gt; ElementIndex)</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; --ElementIter;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">while</span> (ElementIter != End &amp;&amp;</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; ElementIter-&gt;index() &lt; ElementIndex)</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; ++ElementIter;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; }</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; CurrElementIter = ElementIter;</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keywordflow">return</span> ElementIter;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; }</div><div class="line"><a name="l00525"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ab4787f96a5f7cab926f9c7426aa92fc1"> 525</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ab4787f96a5f7cab926f9c7426aa92fc1">FindLowerBoundConst</a>(<span class="keywordtype">unsigned</span> ElementIndex)<span class="keyword"> const</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keywordflow">return</span> FindLowerBoundImpl(ElementIndex);</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; }</div><div class="line"><a name="l00529"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#aaac61c8dd5477ecc6e76c664bf45c0b0"> 529</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#aaac61c8dd5477ecc6e76c664bf45c0b0">FindLowerBound</a>(<span class="keywordtype">unsigned</span> ElementIndex)</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; {</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordflow">return</span> FindLowerBoundImpl(ElementIndex);</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="comment">// Iterator to walk set bits in the bitmap. This iterator is a lot uglier</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="comment">// than it would be, in order to be efficient.</span></div><div class="line"><a name="l00536"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html"> 536</a></span>&#160; <span class="keyword">class </span><a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; {</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00539"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab"> 539</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab">AtEnd</a>;</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160;</div><div class="line"><a name="l00541"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aba51f4b0022c38b89f9fa519cf25fb3f"> 541</a></span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *<a class="code" href="classSVF_1_1BitVector.html">BitVector</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="comment">// Current element inside of bitmap.</span></div><div class="line"><a name="l00544"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a3627077086baa18bd0ae25efd981c18f"> 544</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a3627077086baa18bd0ae25efd981c18f">Iter</a>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="comment">// Current bit number inside of our bitmap.</span></div><div class="line"><a name="l00547"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aae6ff6aada3863feb736619d4f8dba16"> 547</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aae6ff6aada3863feb736619d4f8dba16">BitNumber</a>;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160;</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="comment">// Current word number inside of our element.</span></div><div class="line"><a name="l00550"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6b139db78c9cba017df0fa468bee713a"> 550</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6b139db78c9cba017df0fa468bee713a">WordNumber</a>;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160;</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="comment">// Current bits from the element.</span></div><div class="line"><a name="l00553"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#abc3768e05459a1d0a2d2220858a7a53d"> 553</a></span>&#160; <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">SparseBitVectorElement&lt;ElementSize&gt;::BitWord</a> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#abc3768e05459a1d0a2d2220858a7a53d">Bits</a>;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// Move our iterator to the first non-zero bit in the bitmap.</span></div><div class="line"><a name="l00556"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5e213fe330a23d22c8cf2b0624f73de7"> 556</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5e213fe330a23d22c8cf2b0624f73de7">AdvanceToFirstNonZero</a>()</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; {</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">if</span> (AtEnd)</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordflow">if</span> (BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; {</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; AtEnd = <span class="keyword">true</span>;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; }</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; Iter = BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; BitNumber = Iter-&gt;index() * ElementSize;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="keywordtype">unsigned</span> BitPos = Iter-&gt;find_first();</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; BitNumber += BitPos;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; WordNumber = (BitNumber % ElementSize) / BITWORD_SIZE;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; Bits = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(WordNumber);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; Bits &gt;&gt;= BitPos % BITWORD_SIZE;</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; }</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="comment">// Move our iterator to the next non-zero bit.</span></div><div class="line"><a name="l00575"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a346d500f11666f4746237f42a8d67fc1"> 575</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a346d500f11666f4746237f42a8d67fc1">AdvanceToNextNonZero</a>()</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; {</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keywordflow">if</span> (AtEnd)</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160;</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keywordflow">while</span> (Bits &amp;&amp; !(Bits &amp; 1))</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; {</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; Bits &gt;&gt;= 1;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; BitNumber += 1;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; }</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="comment">// See if we ran out of Bits in this word.</span></div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keywordflow">if</span> (!Bits)</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; {</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keywordtype">int</span> NextSetBitNumber = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a60a023744119cd0424511ea1e83b76e1">find_next</a>(BitNumber % ElementSize) ;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="comment">// If we ran out of set bits in this element, move to next element.</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">if</span> (NextSetBitNumber == -1 || (BitNumber % ElementSize == 0))</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; {</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; ++Iter;</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; WordNumber = 0;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="comment">// We may run out of elements in the bitmap.</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keywordflow">if</span> (Iter == BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; AtEnd = <span class="keyword">true</span>;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; }</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="comment">// Set up for next non-zero word in bitmap.</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; BitNumber = Iter-&gt;index() * ElementSize;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; NextSetBitNumber = Iter-&gt;find_first();</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; BitNumber += NextSetBitNumber;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; WordNumber = (BitNumber % ElementSize) / BITWORD_SIZE;</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; Bits = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(WordNumber);</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; Bits &gt;&gt;= NextSetBitNumber % BITWORD_SIZE;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; }</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; {</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; WordNumber = (NextSetBitNumber % ElementSize) / BITWORD_SIZE;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; Bits = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(WordNumber);</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; Bits &gt;&gt;= NextSetBitNumber % BITWORD_SIZE;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; BitNumber = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>() * ElementSize;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; BitNumber += NextSetBitNumber;</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; }</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; }</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; }</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160;</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;</div><div class="line"><a name="l00624"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5fe4841ca223f13c2aeec4c6e69a7b43"> 624</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5fe4841ca223f13c2aeec4c6e69a7b43">SparseBitVectorIterator</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS,</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keywordtype">bool</span> end = <span class="keyword">false</span>):BitVector(RHS)</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; {</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; Iter = BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; BitNumber = 0;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; Bits = 0;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; WordNumber = ~0;</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; AtEnd = end;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; AdvanceToFirstNonZero();</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; }</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="comment">// Preincrement.</span></div><div class="line"><a name="l00636"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6638115d9d80e0f7b0cff50e06ccd891"> 636</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a>&amp; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6638115d9d80e0f7b0cff50e06ccd891">operator++</a>()</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; {</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; ++BitNumber;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; Bits &gt;&gt;= 1;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; AdvanceToNextNonZero();</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; }</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160;</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <span class="comment">// Postincrement.</span></div><div class="line"><a name="l00645"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a9615a441805796b993252866e5a971aa"> 645</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a9615a441805796b993252866e5a971aa">operator++</a>(<span class="keywordtype">int</span>)</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> tmp = *<span class="keyword">this</span>;</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; ++*<span class="keyword">this</span>;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; }</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160;</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="comment">// Return the current set bit number.</span></div><div class="line"><a name="l00653"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#ab1f0f55fdfef6b2d64d0a715483f5da4"> 653</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#ab1f0f55fdfef6b2d64d0a715483f5da4">operator*</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="keywordflow">return</span> BitNumber;</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;</div><div class="line"><a name="l00658"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a7fc92990c6a09c33c3676ab47807bc68"> 658</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a7fc92990c6a09c33c3676ab47807bc68">operator==</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="comment">// If they are both at the end, ignore the rest of the fields.</span></div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">if</span> (AtEnd &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab">AtEnd</a>)</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <span class="comment">// Otherwise they are the same if they have the same bit number and</span></div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="comment">// bitmap.</span></div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <span class="keywordflow">return</span> AtEnd == RHS.<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab">AtEnd</a> &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aae6ff6aada3863feb736619d4f8dba16">BitNumber</a> == BitNumber;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160;</div><div class="line"><a name="l00668"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5448a6bdf09ef6a45d7c8e84648221ea"> 668</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5448a6bdf09ef6a45d7c8e84648221ea">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == RHS);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; }</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; };</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00675"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a0421e3336137b232edc442ece00a8a9c"> 675</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a> = <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a>;</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160;</div><div class="line"><a name="l00677"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a4f618377a31eba119de672b0be4936bc"> 677</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a4f618377a31eba119de672b0be4936bc">SparseBitVector</a>() : Elements(), CurrElementIter(Elements.begin()) {}</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160;</div><div class="line"><a name="l00679"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a9cb4261779da0cbeb8d09b8fbd5cf557"> 679</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a9cb4261779da0cbeb8d09b8fbd5cf557">SparseBitVector</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; : Elements(RHS.Elements), CurrElementIter(Elements.begin()) {}</div><div class="line"><a name="l00681"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a786b5d4d9eb3cf4ec738043fc17e34c0"> 681</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a786b5d4d9eb3cf4ec738043fc17e34c0">SparseBitVector</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;&amp;RHS)</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; : Elements(<a class="code" href="namespacestd.html">std</a>::<a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">move</a>(RHS.Elements)), CurrElementIter(Elements.begin()) {}</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="comment">// Clear.</span></div><div class="line"><a name="l00685"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a5afe3e74412a1f3f728d7e0eaae70c13"> 685</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a5afe3e74412a1f3f728d7e0eaae70c13">clear</a>()</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; Elements.clear();</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="comment">// Assignment</span></div><div class="line"><a name="l00691"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#adeed46c25650bdbccdef0519906d1030"> 691</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a>&amp; <a class="code" href="classSVF_1_1SparseBitVector.html#adeed46c25650bdbccdef0519906d1030">operator=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a>&amp; RHS)</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; {</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160;</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; Elements = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; }</div><div class="line"><a name="l00700"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a74ded252b99e70cb999b869a5250948e"> 700</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;<a class="code" href="classSVF_1_1SparseBitVector.html#a74ded252b99e70cb999b869a5250948e">operator=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;&amp;RHS)</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; {</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; Elements = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(RHS.Elements);</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; }</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <span class="comment">// Test, Reset, and Set a bit in the bitmap.</span></div><div class="line"><a name="l00708"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80"> 708</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(<span class="keywordtype">unsigned</span> Idx)<span class="keyword"> const</span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keywordtype">unsigned</span> ElementIndex = Idx / ElementSize;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> ElementIter = FindLowerBoundConst(ElementIndex);</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="comment">// If we can&#39;t find an element that is supposed to contain this bit, there</span></div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="comment">// is nothing more to do.</span></div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; <span class="keywordflow">if</span> (ElementIter == Elements.end() ||</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; ElementIter-&gt;index() != ElementIndex)</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="keywordflow">return</span> ElementIter-&gt;test(Idx % ElementSize);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; }</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160;</div><div class="line"><a name="l00724"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ad5337b5aeed50f8b7ffd56b14ee25c9f"> 724</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#ad5337b5aeed50f8b7ffd56b14ee25c9f">reset</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; {</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160;</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="keywordtype">unsigned</span> ElementIndex = Idx / ElementSize;</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> ElementIter = FindLowerBound(ElementIndex);</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160;</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="comment">// If we can&#39;t find an element that is supposed to contain this bit, there</span></div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="comment">// is nothing more to do.</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordflow">if</span> (ElementIter == Elements.end() ||</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; ElementIter-&gt;index() != ElementIndex)</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; ElementIter-&gt;reset(Idx % ElementSize);</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="comment">// When the element is zeroed out, delete it.</span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <span class="keywordflow">if</span> (ElementIter-&gt;empty())</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; {</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; ++CurrElementIter;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; Elements.erase(ElementIter);</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; }</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; }</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160;</div><div class="line"><a name="l00747"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832"> 747</a></span>&#160; <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; {</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="keywordtype">unsigned</span> ElementIndex = Idx / ElementSize;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> ElementIter;</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; {</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; ElementIter = Elements.emplace(Elements.end(), ElementIndex);</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; }</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; {</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; ElementIter = FindLowerBound(ElementIndex);</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160;</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <span class="keywordflow">if</span> (ElementIter == Elements.end() ||</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; ElementIter-&gt;index() != ElementIndex)</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; {</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; <span class="comment">// We may have hit the beginning of our SparseBitVector, in which case,</span></div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <span class="comment">// we may need to insert right after this element, which requires moving</span></div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <span class="comment">// the current iterator forward one, because insert does insert before.</span></div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <span class="keywordflow">if</span> (ElementIter != Elements.end() &amp;&amp;</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; ElementIter-&gt;index() &lt; ElementIndex)</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; ++ElementIter;</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; ElementIter = Elements.emplace(ElementIter, ElementIndex);</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; }</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; }</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; CurrElementIter = ElementIter;</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160;</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; ElementIter-&gt;set(Idx % ElementSize);</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; }</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160;</div><div class="line"><a name="l00776"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a355247d17d1c17b857b4ee572e19b91f"> 776</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a355247d17d1c17b857b4ee572e19b91f">test_and_set</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; {</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; <span class="keywordtype">bool</span> old = test(Idx);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keywordflow">if</span> (!old)</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; {</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <span class="keyword">set</span>(Idx);</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; }</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; }</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160;</div><div class="line"><a name="l00787"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#abfb058304c4b174d162a94c0cc26d2f7"> 787</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#abfb058304c4b174d162a94c0cc26d2f7">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == RHS);</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; }</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;</div><div class="line"><a name="l00792"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a816d96bad46fde34b3848bf08dc6cdf5"> 792</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a816d96bad46fde34b3848bf08dc6cdf5">operator==</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordflow">for</span> (; Iter1 != Elements.end() &amp;&amp; Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end();</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; ++Iter1, ++Iter2)</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; {</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">if</span> (*Iter1 != *Iter2)</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; }</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <span class="keywordflow">return</span> Iter1 == Elements.end() &amp;&amp; Iter2 == RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end();</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; }</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160;</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <span class="comment">// Union our bitmap with the RHS and return true if we changed.</span></div><div class="line"><a name="l00807"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a48668ff6f168162bd8f13cf860749090"> 807</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a48668ff6f168162bd8f13cf860749090">operator|=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; {</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160;</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160;</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; <span class="comment">// If RHS is empty, we are done</span></div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="keywordflow">if</span> (RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160;</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; {</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end() || Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; {</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; Elements.insert(Iter1, *Iter2);</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; ++Iter2;</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; }</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; {</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; changed |= Iter1-&gt;unionWith(*Iter2);</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; ++Iter1;</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; ++Iter2;</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; }</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; {</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; ++Iter1;</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; }</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; }</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; }</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160;</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="comment">// Intersect our bitmap with the RHS and return true if ours changed.</span></div><div class="line"><a name="l00844"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a1f7e6424f8bfc68589a9947b26e0b62f"> 844</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4">operator&amp;=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; {</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160;</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="comment">// Check if both bitmaps are empty.</span></div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="keywordflow">if</span> (Elements.empty() &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160;</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <span class="comment">// Loop through, intersecting as we go, erasing elements when necessary.</span></div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; {</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end())</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; {</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; }</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160;</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; ++Iter2;</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; }</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; {</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="keywordtype">bool</span> BecameZero;</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; changed |= Iter1-&gt;intersectWith(*Iter2, BecameZero);</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="keywordflow">if</span> (BecameZero)</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; {</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> IterTmp = Iter1;</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; ++Iter1;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; Elements.erase(IterTmp);</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; }</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; {</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; ++Iter1;</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; }</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; ++Iter2;</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; }</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; {</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> IterTmp = Iter1;</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; ++Iter1;</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; Elements.erase(IterTmp);</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; }</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; }</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; <span class="keywordflow">if</span> (Iter1 != Elements.end())</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; {</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; Elements.erase(Iter1, Elements.end());</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; }</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; }</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160;</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="comment">// Intersect our bitmap with the complement of the RHS and return true</span></div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <span class="comment">// if ours changed.</span></div><div class="line"><a name="l00905"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a8b481ef53a27a351affecab90310b1ef"> 905</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a8b481ef53a27a351affecab90310b1ef">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; {</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; {</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keywordflow">if</span> (!empty())</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; {</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; clear();</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; }</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; }</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160;</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="comment">// If either our bitmap or RHS is empty, we are done</span></div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="keywordflow">if</span> (Elements.empty() || RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160;</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="comment">// Loop through, intersecting as we go, erasing elements when necessary.</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; {</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end())</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; {</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; }</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160;</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; {</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; ++Iter2;</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; }</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; {</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keywordtype">bool</span> BecameZero;</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; changed |= Iter1-&gt;intersectWithComplement(*Iter2, BecameZero);</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; <span class="keywordflow">if</span> (BecameZero)</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> IterTmp = Iter1;</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; ++Iter1;</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; Elements.erase(IterTmp);</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; }</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; ++Iter1;</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; }</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; ++Iter2;</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; }</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; {</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; ++Iter1;</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; }</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; }</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; }</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160;</div><div class="line"><a name="l00963"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#aaab743995d5dd1359b0f541dacc1dcf3"> 963</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#aaab743995d5dd1359b0f541dacc1dcf3">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <span class="keywordflow">return</span> intersectWithComplement(*RHS);</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; }</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160;</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="comment">// Three argument version of intersectWithComplement.</span></div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; <span class="comment">// Result of RHS1 &amp; ~RHS2 is stored into this bitmap.</span></div><div class="line"><a name="l00970"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#afee44821475fa31f218fb743b264cb37"> 970</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#afee44821475fa31f218fb743b264cb37">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS1,</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS2)</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; {</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS1)</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; {</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; intersectWithComplement(RHS2);</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; }</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS2)</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; {</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> RHS2Copy(RHS2);</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; intersectWithComplement(RHS1, RHS2Copy);</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; }</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160;</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; Elements.clear();</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter1 = RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS2.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160;</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; <span class="comment">// If RHS1 is empty, we are done</span></div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; <span class="comment">// If RHS2 is empty, we still have to copy RHS1</span></div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; <span class="keywordflow">if</span> (RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160;</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; <span class="comment">// Loop through, intersecting as we go, erasing elements when necessary.</span></div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS2.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; {</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="keywordflow">if</span> (Iter1 == RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; {</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; ++Iter2;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; }</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; {</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <span class="keywordtype">bool</span> BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; Elements.emplace_back(Iter1-&gt;index());</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; Elements.back().intersectWithComplement(*Iter1, *Iter2, BecameZero);</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="keywordflow">if</span> (BecameZero)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; Elements.pop_back();</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; ++Iter1;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; ++Iter2;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; {</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; Elements.push_back(*Iter1++);</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; }</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; }</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; <span class="comment">// copy the remaining elements</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">std::copy</a>(Iter1, RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end(), std::back_inserter(Elements));</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; }</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;</div><div class="line"><a name="l01025"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a28d0e5b43ad556d079b5b0ec58e898e4"> 1025</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a28d0e5b43ad556d079b5b0ec58e898e4">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS1,</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS2)</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; {</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; intersectWithComplement(*RHS1, *RHS2);</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; }</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;</div><div class="line"><a name="l01031"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a16756e0545fd3d50ab89f45a2e83bb79"> 1031</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a16756e0545fd3d50ab89f45a2e83bb79">intersects</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)<span class="keyword"> const</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <span class="keywordflow">return</span> intersects(*RHS);</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; }</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; <span class="comment">// Return true if we share any bits in common with RHS</span></div><div class="line"><a name="l01037"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a704fddd1bf7592e9df9fbc14c3873696"> 1037</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a704fddd1bf7592e9df9fbc14c3873696">intersects</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; <span class="comment">// Check if both bitmaps are empty.</span></div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; <span class="keywordflow">if</span> (Elements.empty() &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; <span class="comment">// Loop through, intersecting stopping when we hit bits in common.</span></div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; {</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end())</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; {</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; ++Iter2;</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; }</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; {</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;intersects(*Iter2))</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; ++Iter1;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; ++Iter2;</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; }</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; {</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; ++Iter1;</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; }</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; }</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; }</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="comment">// Return true iff all bits set in this SparseBitVector are</span></div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; <span class="comment">// also set in RHS.</span></div><div class="line"><a name="l01073"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#abbd0e0cf759fad7858224ed8a63aade8"> 1073</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#abbd0e0cf759fad7858224ed8a63aade8">contains</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; Result &amp;= RHS;</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; <span class="keywordflow">return</span> (Result == RHS);</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; }</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; <span class="comment">// Return the first set bit in the bitmap. Return -1 if no bits are set.</span></div><div class="line"><a name="l01081"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a06eeb5543eb160e08f9a41e30b52d963"> 1081</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a06eeb5543eb160e08f9a41e30b52d963">find_first</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; <span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement&lt;ElementSize&gt;</a> &amp;First = *(Elements.begin());</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="keywordflow">return</span> (First.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>() * ElementSize) + First.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2281ff5a0a492064cff864d4c246cbc2">find_first</a>();</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; }</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; <span class="comment">// Return the last set bit in the bitmap. Return -1 if no bits are set.</span></div><div class="line"><a name="l01090"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ac969500db9dbd1c63b6a47a1d9a5abba"> 1090</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1SparseBitVector.html#ac969500db9dbd1c63b6a47a1d9a5abba">find_last</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; <span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement&lt;ElementSize&gt;</a> &amp;Last = *(Elements.rbegin());</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; <span class="keywordflow">return</span> (Last.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>() * ElementSize) + Last.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a1d79c099887fcf01f5c0743b38caf39d">find_last</a>();</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; }</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="comment">// Return true if the SparseBitVector is empty</span></div><div class="line"><a name="l01099"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#aea5389ad7e5fe4c8bef686940a1a6056"> 1099</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#aea5389ad7e5fe4c8bef686940a1a6056">empty</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; <span class="keywordflow">return</span> Elements.empty();</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; }</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;</div><div class="line"><a name="l01104"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9"> 1104</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9">count</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keywordtype">unsigned</span> BitCount = 0;</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter = Elements.begin();</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; Iter != Elements.end();</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; ++Iter)</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; BitCount += Iter-&gt;count();</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="keywordflow">return</span> BitCount;</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; }</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772"> 1115</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a> <a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; }</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;</div><div class="line"><a name="l01120"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1"> 1120</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a> <a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a>(<span class="keyword">this</span>, <span class="keyword">true</span>);</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; }</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;};</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;<span class="comment">// Convenience functions to allow Or and And without dereferencing in the user</span></div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;<span class="comment">// code.</span></div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01130"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a97ff28f5dfd5c31e6ef351de3cdad85d"> 1130</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a97ff28f5dfd5c31e6ef351de3cdad85d">operator |=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;{</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; <span class="keywordflow">return</span> LHS |= *RHS;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;}</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01137"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a7554dead3b2d1bcdfcb36c213e6735b6"> 1137</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a97ff28f5dfd5c31e6ef351de3cdad85d">operator |=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *LHS,</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;{</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <span class="keywordflow">return</span> LHS-&gt;operator|=(RHS);</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;}</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01144"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4"> 1144</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4">operator &amp;=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *LHS,</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;{</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; <span class="keywordflow">return</span> LHS-&gt;operator&amp;=(RHS);</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;}</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01151"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a5df68020aca621b053acbe3f917f0809"> 1151</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4">operator &amp;=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;{</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <span class="keywordflow">return</span> LHS &amp;= *RHS;</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;}</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;<span class="comment">// Convenience functions for infix union, intersection, difference operators.</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;<span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a></div><div class="line"><a name="l01161"></a><span class="lineno"><a class="line" href="namespaceSVF.html#ad16a5803e8f1fa06266223aeb8366df1"> 1161</a></span>&#160;<a class="code" href="namespaceSVF.html#aa01b96d5bc6c3930b0bfca789acf75c4">operator|</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;{</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result(LHS);</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160; Result |= RHS;</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; <span class="keywordflow">return</span> Result;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;}</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;<span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a></div><div class="line"><a name="l01171"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a47b11c4e305a8a1e2dc387c2f9d4617e"> 1171</a></span>&#160;<a class="code" href="namespaceSVF.html#aaa21ff095e66a18937f29246e213f69d">operator&amp;</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;{</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result(LHS);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; Result &amp;= RHS;</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; <span class="keywordflow">return</span> Result;</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;}</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;<span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a></div><div class="line"><a name="l01181"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a1b6662f895cfd942996ac4d578960eed"> 1181</a></span>&#160;<a class="code" href="namespaceSVF.html#a6c2f7ce4908d39a17b29830a2e4bd781">operator-</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;{</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; Result.<a class="code" href="classSVF_1_1SparseBitVector.html#a8b481ef53a27a351affecab90310b1ef">intersectWithComplement</a>(LHS, RHS);</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; <span class="keywordflow">return</span> Result;</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;}</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;<span class="comment">// Dump a SparseBitVector to a stream</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01191"></a><span class="lineno"><a class="line" href="namespaceSVF.html#aae350f79ebcb9efd22ec9efa6678cd13"> 1191</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceSVF.html#aae350f79ebcb9efd22ec9efa6678cd13">dump</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS, std::ostream &amp;out)</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;{</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; out &lt;&lt; <span class="stringliteral">&quot;[&quot;</span>;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; <span class="keyword">typename</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVector&lt;ElementSize&gt;::iterator</a> bi = LHS.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(),</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; be = LHS.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>();</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; <span class="keywordflow">if</span> (bi != be)</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; {</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; out &lt;&lt; *bi;</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160; <span class="keywordflow">for</span> (++bi; bi != be; ++bi)</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; {</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160; out &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; *bi;</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160; }</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; }</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; out &lt;&lt; <span class="stringliteral">&quot;]\n&quot;</span>;</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;}</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;} <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;<span class="preprocessor">#endif // SPARSEBITVECTOR_H</span></div><div class="ttc" id="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator_html"><div class="ttname"><a href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVF::SparseBitVector::SparseBitVectorIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00536">SparseBitVector.h:536</a></div></div>
69
+ <a href="SparseBitVector_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">//===- SparseBitVector.h - Efficient Sparse BitVector --*- 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;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#ifndef SPARSEBITVECTOR_H</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#define SPARSEBITVECTOR_H</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &lt;ostream&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &lt;climits&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;iterator&gt;</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;list&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// Appease GCC?</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#ifdef __has_builtin</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor"># define HAS_CLZ __has_builtin(__builtin_clz)</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor"># define HAS_CLZLL __has_builtin(__builtin_clzll)</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="SparseBitVector_8h.html#aa4aed82d501b04499090de2c616e6b1f"> 24</a></span>&#160;<span class="preprocessor"># define HAS_CLZ 0</span></div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="SparseBitVector_8h.html#ad66fb43b1e40d6e22629fcd889d4bfab"> 25</a></span>&#160;<span class="preprocessor"># define HAS_CLZLL 0</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;{</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349"> 32</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;{</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54"> 35</a></span>&#160; <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54">ZB_Undefined</a>,</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349aac378e728f7d53b2d96be1d33c63afb1"> 37</a></span>&#160; <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349aac378e728f7d53b2d96be1d33c63afb1">ZB_Max</a>,</div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7"> 39</a></span>&#160; <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7">ZB_Width</a></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;};</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"><a class="line" href="structSVF_1_1TrailingZerosCounter.html"> 42</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, std::<span class="keywordtype">size_t</span> SizeOfT&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1TrailingZerosCounter.html">TrailingZerosCounter</a></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;{</div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83"> 44</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a>)</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; {</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">if</span> (!Val)</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">return</span> std::numeric_limits&lt;T&gt;::digits;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordflow">if</span> (Val &amp; 0x1)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">// Bisection method.</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordtype">unsigned</span> ZeroBits = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; T Shift = std::numeric_limits&lt;T&gt;::digits &gt;&gt; 1;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; T Mask = std::numeric_limits&lt;T&gt;::max() &gt;&gt; Shift;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordflow">while</span> (Shift)</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; {</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">if</span> ((Val &amp; Mask) == 0)</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; Val &gt;&gt;= Shift;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; ZeroBits |= Shift;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; }</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; Shift &gt;&gt;= 1;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; Mask &gt;&gt;= Shift;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; }</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keywordflow">return</span> ZeroBits;</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"> 67</span>&#160;};</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461"> 77</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB = <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7">ZB_Width</a>)</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; static_assert(std::numeric_limits&lt;T&gt;::is_integer &amp;&amp;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; !std::numeric_limits&lt;T&gt;::is_signed,</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="stringliteral">&quot;Only unsigned integral types are allowed.&quot;</span>);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html">TrailingZerosCounter&lt;T, sizeof(T)&gt;::count</a>(Val, ZB);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;}</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structSVF_1_1PopulationCounter.html"> 85</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, std::<span class="keywordtype">size_t</span> SizeOfT&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1PopulationCounter.html">PopulationCounter</a></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"><a class="line" href="structSVF_1_1PopulationCounter.html#aa49a07f6be7991ffe42af5445b38d59b"> 87</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1PopulationCounter.html#aa49a07f6be7991ffe42af5445b38d59b">count</a>(T <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>)</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; <span class="comment">// Generic version, forward to 32 bits.</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; static_assert(SizeOfT &lt;= 4, <span class="stringliteral">&quot;Not implemented!&quot;</span>);</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">return</span> __builtin_popcount(Value);</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; uint32_t v = <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; v = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; v = (v &amp; 0x33333333) + ((v &gt;&gt; 2) &amp; 0x33333333);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">return</span> ((v + (v &gt;&gt; 4) &amp; 0xF0F0F0F) * 0x1010101) &gt;&gt; 24;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</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"><a class="line" href="structSVF_1_1LeadingZerosCounter.html"> 102</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, std::<span class="keywordtype">size_t</span> SizeOfT&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter</a></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;{</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structSVF_1_1LeadingZerosCounter.html#ad85fa905e96374d79a832a027226d8d3"> 104</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1LeadingZerosCounter.html#ad85fa905e96374d79a832a027226d8d3">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a>)</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; {</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span> (!Val)</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">return</span> std::numeric_limits&lt;T&gt;::digits;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// Bisection method.</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordtype">unsigned</span> ZeroBits = 0;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">for</span> (T Shift = std::numeric_limits&lt;T&gt;::digits &gt;&gt; 1; Shift; Shift &gt;&gt;= 1)</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; T Tmp = Val &gt;&gt; Shift;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">if</span> (Tmp)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; Val = Tmp;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; ZeroBits |= Shift;</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="keywordflow">return</span> ZeroBits;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</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;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="preprocessor">#if defined(__GNUC__) || defined(_MSC_VER)</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter</a>&lt;T, 4&gt;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;{</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB)</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; <span class="keywordflow">if</span> (ZB != <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54">ZB_Undefined</a> &amp;&amp; Val == 0)</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">return</span> 32;</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;<span class="preprocessor">#if defined(__GNUC__) || HAS_CLZ</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">return</span> __builtin_clz(Val);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="preprocessor">#elif defined(_MSC_VER)</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Index;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; _BitScanReverse(&amp;Index, Val);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">return</span> Index ^ 31;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</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;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="preprocessor">#if !defined(_MSC_VER) || defined(_M_X64)</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter</a>&lt;T, 8&gt;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83">count</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB)</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; {</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">if</span> (ZB != <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349a5cbe6f40e9b49a24bc2d2e4bf6f12d54">ZB_Undefined</a> &amp;&amp; Val == 0)</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">return</span> 64;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="preprocessor">#if defined(__GNUC__) || HAS_CLZLL</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">return</span> __builtin_clzll(Val);</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="preprocessor">#elif defined(_MSC_VER)</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Index;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; _BitScanReverse64(&amp;Index, Val);</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">return</span> Index ^ 63;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="preprocessor">#endif</span></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"> 157</span>&#160;};</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="namespaceSVF.html#af897f6692f1f6aa13d897f89b3370d0d"> 169</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#af897f6692f1f6aa13d897f89b3370d0d">countLeadingZeros</a>(T Val, <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349">ZeroBehavior</a> ZB = <a class="code" href="namespaceSVF.html#af5b6ec9770091c42227a45491b00b349afdacc59903d2677ef91777d78c7b80a7">ZB_Width</a>)</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;{</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; static_assert(std::numeric_limits&lt;T&gt;::is_integer &amp;&amp;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; !std::numeric_limits&lt;T&gt;::is_signed,</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="stringliteral">&quot;Only unsigned integral types are allowed.&quot;</span>);</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1LeadingZerosCounter.html">LeadingZerosCounter&lt;T, sizeof(T)&gt;::count</a>(Val, ZB);</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;}</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="structSVF_1_1PopulationCounter_3_01T_00_018_01_4.html"> 177</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1PopulationCounter.html">PopulationCounter</a>&lt;T, 8&gt;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;{</div><div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="structSVF_1_1PopulationCounter_3_01T_00_018_01_4.html#a6b0aabdd55f93d2b5ea8df270a14a0ec"> 179</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1PopulationCounter_3_01T_00_018_01_4.html#a6b0aabdd55f93d2b5ea8df270a14a0ec">count</a>(T <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>)</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; {</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">return</span> __builtin_popcountll(Value);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; uint64_t v = <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; v = v - ((v &gt;&gt; 1) &amp; 0x5555555555555555ULL);</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; v = (v &amp; 0x3333333333333333ULL) + ((v &gt;&gt; 2) &amp; 0x3333333333333333ULL);</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; v = (v + (v &gt;&gt; 4)) &amp; 0x0F0F0F0F0F0F0F0FULL;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">return</span> unsigned((uint64_t)(v * 0x0101010101010101ULL) &gt;&gt; 56);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;<span class="preprocessor">#endif</span></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;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="namespaceSVF.html#ae86e9ecca38512426d0bade3a95d0a51"> 197</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#ae86e9ecca38512426d0bade3a95d0a51">countPopulation</a>(T <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>)</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;{</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; static_assert(std::numeric_limits&lt;T&gt;::is_integer &amp;&amp;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; !std::numeric_limits&lt;T&gt;::is_signed,</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="stringliteral">&quot;Only unsigned integral types are allowed.&quot;</span>);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1PopulationCounter.html">PopulationCounter&lt;T, sizeof(T)&gt;::count</a>(<a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>);</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="l00217"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html"> 217</a></span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize = 128&gt; <span class="keyword">struct </span><a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a></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="keyword">public</span>:</div><div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d"> 220</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> = <span class="keywordtype">unsigned</span> long;</div><div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ad9e38352db094adcdfb2964f325d9e53"> 221</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ad9e38352db094adcdfb2964f325d9e53">size_type</a> = unsigned;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keyword">enum</span></div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; {</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2dfc62db92b64481fe56fafaa923dce0a3335c07a7225c80110e998246f96d6c4"> 224</a></span>&#160; BITWORD_SIZE = <span class="keyword">sizeof</span>(<a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a>) * CHAR_BIT,</div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2dfc62db92b64481fe56fafaa923dce0a3dde12fdc7052a87d20741d2c31a65a3"> 225</a></span>&#160; BITWORDS_PER_ELEMENT = (ElementSize + BITWORD_SIZE - 1) / BITWORD_SIZE,</div><div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2dfc62db92b64481fe56fafaa923dce0aeb226b2e0dea78fbdbf5b780c3745f6d"> 226</a></span>&#160; BITS_PER_ELEMENT = ElementSize</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; };</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="comment">// Index of Element in terms of where first bit starts.</span></div><div class="line"><a name="l00231"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ae5c5ac3afef47499a4e852de0dc39c18"> 231</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae5c5ac3afef47499a4e852de0dc39c18">ElementIndex</a>;</div><div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526"> 232</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> Bits[BITWORDS_PER_ELEMENT];</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;</div><div class="line"><a name="l00234"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a4ec765790960025d3468866c326ab87b"> 234</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4ec765790960025d3468866c326ab87b">SparseBitVectorElement</a>()</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; ElementIndex = ~0U;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; memset(&amp;Bits[0], 0, <span class="keyword">sizeof</span> (<a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a>) * BITWORDS_PER_ELEMENT);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00241"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a75777b1461184d8fb2cfa4ec6e95c1c5"> 241</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a75777b1461184d8fb2cfa4ec6e95c1c5">SparseBitVectorElement</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; ElementIndex = Idx;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; memset(&amp;Bits[0], 0, <span class="keyword">sizeof</span> (<a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a>) * BITWORDS_PER_ELEMENT);</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; }</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">// Comparison.</span></div><div class="line"><a name="l00248"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a8484d923c29872843b0d0ffcebf4d112"> 248</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a8484d923c29872843b0d0ffcebf4d112">operator==</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keywordflow">if</span> (ElementIndex != RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae5c5ac3afef47499a4e852de0dc39c18">ElementIndex</a>)</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">if</span> (Bits[i] != RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i])</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</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"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#aa812f8538b869b004791b4177c50069b"> 258</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#aa812f8538b869b004791b4177c50069b">operator!=</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == RHS);</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; }</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; <span class="comment">// Return the bits that make up word Idx in our element.</span></div><div class="line"><a name="l00264"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f"> 264</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(<span class="keywordtype">unsigned</span> Idx)<span class="keyword"> const</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; assert(Idx &lt; BITWORDS_PER_ELEMENT);</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">return</span> Bits[Idx];</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; }</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160;</div><div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827"> 270</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keywordflow">return</span> ElementIndex;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ac3a4795681af74563d757f587252aa7f"> 275</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ac3a4795681af74563d757f587252aa7f">empty</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keywordflow">if</span> (Bits[i])</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; }</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;</div><div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a094acafea02f3c117445267e75c9a629"> 283</a></span>&#160; <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; {</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; Bits[Idx / BITWORD_SIZE] |= 1L &lt;&lt; (Idx % BITWORD_SIZE);</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</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"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a7a5d223870e32035863f6596727c6775"> 288</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a7a5d223870e32035863f6596727c6775">test_and_set</a>(<span class="keywordtype">unsigned</span> Idx)</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="keywordtype">bool</span> old = test(Idx);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keywordflow">if</span> (!old)</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keyword">set</span>(Idx);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</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; <span class="keywordflow">return</span> <span class="keyword">false</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="l00299"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#acced4edf716af14a6931156d59e50632"> 299</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#acced4edf716af14a6931156d59e50632">reset</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; {</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; Bits[Idx / BITWORD_SIZE] &amp;= ~(1L &lt;&lt; (Idx % BITWORD_SIZE));</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; }</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"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a465b415217533f1f0026bec837495fdd"> 304</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a465b415217533f1f0026bec837495fdd">test</a>(<span class="keywordtype">unsigned</span> Idx)<span class="keyword"> const</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">return</span> Bits[Idx / BITWORD_SIZE] &amp; (1L &lt;&lt; (Idx % BITWORD_SIZE));</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; }</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a8ed9ca88c7eef7574a9887197b422e81"> 309</a></span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ad9e38352db094adcdfb2964f325d9e53">size_type</a> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a8ed9ca88c7eef7574a9887197b422e81">count</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordtype">unsigned</span> NumBits = 0;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; NumBits += <a class="code" href="namespaceSVF.html#ae86e9ecca38512426d0bade3a95d0a51">countPopulation</a>(Bits[i]);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">return</span> NumBits;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2281ff5a0a492064cff864d4c246cbc2"> 318</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2281ff5a0a492064cff864d4c246cbc2">find_first</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keywordflow">return</span> i * BITWORD_SIZE + <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(Bits[i]);</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;SBV: find_first: SBV cannot be empty&quot;</span>);</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; abort();</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="l00328"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a1d79c099887fcf01f5c0743b38caf39d"> 328</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a1d79c099887fcf01f5c0743b38caf39d">find_last</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> I = 0; I &lt; BITWORDS_PER_ELEMENT; ++I)</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; {</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordtype">unsigned</span> Idx = BITWORDS_PER_ELEMENT - I - 1;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">if</span> (Bits[Idx] != 0)</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">return</span> Idx * BITWORD_SIZE + BITWORD_SIZE -</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <a class="code" href="namespaceSVF.html#af897f6692f1f6aa13d897f89b3370d0d">countLeadingZeros</a>(Bits[Idx]) - 1;</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; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;SBV: find_last: SBV cannot be empty&quot;</span>);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; abort();</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; }</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a60a023744119cd0424511ea1e83b76e1"> 343</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a60a023744119cd0424511ea1e83b76e1">find_next</a>(<span class="keywordtype">unsigned</span> Curr)<span class="keyword"> const</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">if</span> (Curr &gt;= BITS_PER_ELEMENT)</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordtype">unsigned</span> WordPos = Curr / BITWORD_SIZE;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordtype">unsigned</span> BitPos = Curr % BITWORD_SIZE;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> Copy = Bits[WordPos];</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; assert(WordPos &lt;= BITWORDS_PER_ELEMENT</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; &amp;&amp; <span class="stringliteral">&quot;Word Position outside of element&quot;</span>);</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; <span class="comment">// Mask off previous bits.</span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; Copy &amp;= ~0UL &lt;&lt; BitPos;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordflow">if</span> (Copy != 0)</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="keywordflow">return</span> WordPos * BITWORD_SIZE + <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(Copy);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="comment">// Check subsequent words.</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = WordPos+1; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordflow">return</span> i * BITWORD_SIZE + <a class="code" href="namespaceSVF.html#a5cb5811bab8e04773dfa21ad919df461">countTrailingZeros</a>(Bits[i]);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">return</span> -1;</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="l00367"></a><span class="lineno"> 367</span>&#160; <span class="comment">// Union this element with RHS and return true if this one changed.</span></div><div class="line"><a name="l00368"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a34e70705e4618e6d79a19ee7725e4960"> 368</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a34e70705e4618e6d79a19ee7725e4960">unionWith</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; {</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; {</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> old = changed ? 0 : Bits[i];</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; Bits[i] |= RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">if</span> (!changed &amp;&amp; old != Bits[i])</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">// Return true if we have any bits in common with RHS</span></div><div class="line"><a name="l00383"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2ac6b33e335ac411740c875c6aeb6706"> 383</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2ac6b33e335ac411740c875c6aeb6706">intersects</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; {</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="keywordflow">if</span> (RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i] &amp; Bits[i])</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; }</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; }</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// Intersect this Element with RHS and return true if this one changed.</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="comment">// BecameZero is set to true if this element became all-zero bits.</span></div><div class="line"><a name="l00395"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a2f62812b261a83b19aab46c0961bfcb4"> 395</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2f62812b261a83b19aab46c0961bfcb4">intersectWith</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS,</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordtype">bool</span> &amp;BecameZero)</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; {</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordtype">bool</span> allzero = <span class="keyword">true</span>;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160;</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> old = changed ? 0 : Bits[i];</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160;</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; Bits[i] &amp;= RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; allzero = <span class="keyword">false</span>;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">if</span> (!changed &amp;&amp; old != Bits[i])</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; }</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; BecameZero = allzero;</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="comment">// Intersect this Element with the complement of RHS and return true if this</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="comment">// one changed. BecameZero is set to true if this element became all-zero</span></div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="comment">// bits.</span></div><div class="line"><a name="l00420"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#ac721b283253b7bd96fedd5f12c079699"> 420</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#ac721b283253b7bd96fedd5f12c079699">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS,</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keywordtype">bool</span> &amp;BecameZero)</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; {</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keywordtype">bool</span> allzero = <span class="keyword">true</span>;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; {</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">BitWord</a> old = changed ? 0 : Bits[i];</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; Bits[i] &amp;= ~RHS.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; allzero = <span class="keyword">false</span>;</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">if</span> (!changed &amp;&amp; old != Bits[i])</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; }</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; BecameZero = allzero;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="comment">// Three argument version of intersectWithComplement that intersects</span></div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="comment">// RHS1 &amp; ~RHS2 into this element</span></div><div class="line"><a name="l00444"></a><span class="lineno"><a class="line" href="structSVF_1_1SparseBitVectorElement.html#a6d81176f07f369b38da34e624710b387"> 444</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#a6d81176f07f369b38da34e624710b387">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS1,</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement</a> &amp;RHS2,</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="keywordtype">bool</span> &amp;BecameZero)</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="keywordtype">bool</span> allzero = <span class="keyword">true</span>;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; BITWORDS_PER_ELEMENT; ++i)</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; {</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; Bits[i] = RHS1.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i] &amp; ~RHS2.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a4b6a06a3a19f2241cec68e09d4feb526">Bits</a>[i];</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keywordflow">if</span> (Bits[i] != 0)</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; allzero = <span class="keyword">false</span>;</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; }</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; BecameZero = allzero;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160;};</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize = 128&gt;</div><div class="line"><a name="l00462"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html"> 462</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a></div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160;{</div><div class="line"><a name="l00464"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a74ab73c1674200bb4560070c8b10346d"> 464</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a74ab73c1674200bb4560070c8b10346d">ElementList</a> = std::list&lt;SparseBitVectorElement&lt;ElementSize&gt;&gt;;</div><div class="line"><a name="l00465"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed"> 465</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> = <span class="keyword">typename</span> ElementList::iterator;</div><div class="line"><a name="l00466"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f"> 466</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> = <span class="keyword">typename</span> ElementList::const_iterator;</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keyword">enum</span></div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; {</div><div class="line"><a name="l00469"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ab0a250ed14fc688ffb38c8f00aca0bd4a887a4856f51078b02a23348b7331453e"> 469</a></span>&#160; BITWORD_SIZE = <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement&lt;ElementSize&gt;::BITWORD_SIZE</a></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; };</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160;</div><div class="line"><a name="l00472"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636"> 472</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a74ab73c1674200bb4560070c8b10346d">ElementList</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="comment">// Pointer to our current Element. This has no visible effect on the external</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="comment">// state of a SparseBitVector, it&#39;s just used to improve performance in the</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="comment">// common case of testing/modifying bits with similar indices.</span></div><div class="line"><a name="l00476"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ada7cb2e144c2fccd0d50138778b152dd"> 476</a></span>&#160; <span class="keyword">mutable</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ada7cb2e144c2fccd0d50138778b152dd">CurrElementIter</a>;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="comment">// This is like std::lower_bound, except we do linear searching from the</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// current position.</span></div><div class="line"><a name="l00480"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ad53d20775e5445a438f579743aa77cf3"> 480</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ad53d20775e5445a438f579743aa77cf3">FindLowerBoundImpl</a>(<span class="keywordtype">unsigned</span> ElementIndex)<span class="keyword"> const</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160;</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="comment">// We cache a non-const iterator so we&#39;re forced to resort to const_cast to</span></div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="comment">// get the begin/end in the case where &#39;this&#39; is const. To avoid duplication</span></div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="comment">// of code with the only difference being whether the const cast is present</span></div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="comment">// &#39;this&#39; is always const in this particular function and we sort out the</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="comment">// difference in FindLowerBound and FindLowerBoundConst.</span></div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Begin =</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keyword">const_cast&lt;</span><a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;Elements.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>();</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> End =</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keyword">const_cast&lt;</span><a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;Elements.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>();</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; {</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; CurrElementIter = Begin;</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="keywordflow">return</span> CurrElementIter;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="comment">// Make sure our current iterator is valid.</span></div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keywordflow">if</span> (CurrElementIter == End)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; --CurrElementIter;</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="comment">// Search from our current iterator, either backwards or forwards,</span></div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="comment">// depending on what element we are looking for.</span></div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> ElementIter = CurrElementIter;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="keywordflow">if</span> (CurrElementIter-&gt;index() == ElementIndex)</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; {</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">return</span> ElementIter;</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (CurrElementIter-&gt;index() &gt; ElementIndex)</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; {</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="keywordflow">while</span> (ElementIter != Begin</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; &amp;&amp; ElementIter-&gt;index() &gt; ElementIndex)</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; --ElementIter;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">while</span> (ElementIter != End &amp;&amp;</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; ElementIter-&gt;index() &lt; ElementIndex)</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; ++ElementIter;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; }</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; CurrElementIter = ElementIter;</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keywordflow">return</span> ElementIter;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; }</div><div class="line"><a name="l00525"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ab4787f96a5f7cab926f9c7426aa92fc1"> 525</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#ab4787f96a5f7cab926f9c7426aa92fc1">FindLowerBoundConst</a>(<span class="keywordtype">unsigned</span> ElementIndex)<span class="keyword"> const</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keywordflow">return</span> FindLowerBoundImpl(ElementIndex);</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; }</div><div class="line"><a name="l00529"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#aaac61c8dd5477ecc6e76c664bf45c0b0"> 529</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> <a class="code" href="classSVF_1_1SparseBitVector.html#aaac61c8dd5477ecc6e76c664bf45c0b0">FindLowerBound</a>(<span class="keywordtype">unsigned</span> ElementIndex)</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; {</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordflow">return</span> FindLowerBoundImpl(ElementIndex);</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="comment">// Iterator to walk set bits in the bitmap. This iterator is a lot uglier</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="comment">// than it would be, in order to be efficient.</span></div><div class="line"><a name="l00536"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html"> 536</a></span>&#160; <span class="keyword">class </span><a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; {</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00539"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab"> 539</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab">AtEnd</a>;</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160;</div><div class="line"><a name="l00541"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aba51f4b0022c38b89f9fa519cf25fb3f"> 541</a></span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *<a class="code" href="classSVF_1_1BitVector.html">BitVector</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="comment">// Current element inside of bitmap.</span></div><div class="line"><a name="l00544"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a3627077086baa18bd0ae25efd981c18f"> 544</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a3627077086baa18bd0ae25efd981c18f">Iter</a>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="comment">// Current bit number inside of our bitmap.</span></div><div class="line"><a name="l00547"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aae6ff6aada3863feb736619d4f8dba16"> 547</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aae6ff6aada3863feb736619d4f8dba16">BitNumber</a>;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160;</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="comment">// Current word number inside of our element.</span></div><div class="line"><a name="l00550"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6b139db78c9cba017df0fa468bee713a"> 550</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6b139db78c9cba017df0fa468bee713a">WordNumber</a>;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160;</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="comment">// Current bits from the element.</span></div><div class="line"><a name="l00553"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#abc3768e05459a1d0a2d2220858a7a53d"> 553</a></span>&#160; <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html#af9014ab5077a2d9c1aed1e9b1460390d">SparseBitVectorElement&lt;ElementSize&gt;::BitWord</a> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#abc3768e05459a1d0a2d2220858a7a53d">Bits</a>;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// Move our iterator to the first non-zero bit in the bitmap.</span></div><div class="line"><a name="l00556"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5e213fe330a23d22c8cf2b0624f73de7"> 556</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5e213fe330a23d22c8cf2b0624f73de7">AdvanceToFirstNonZero</a>()</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; {</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">if</span> (AtEnd)</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordflow">if</span> (BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; {</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; AtEnd = <span class="keyword">true</span>;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; }</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; Iter = BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; BitNumber = Iter-&gt;index() * ElementSize;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="keywordtype">unsigned</span> BitPos = Iter-&gt;find_first();</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; BitNumber += BitPos;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; WordNumber = (BitNumber % ElementSize) / BITWORD_SIZE;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; Bits = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(WordNumber);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; Bits &gt;&gt;= BitPos % BITWORD_SIZE;</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; }</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="comment">// Move our iterator to the next non-zero bit.</span></div><div class="line"><a name="l00575"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a346d500f11666f4746237f42a8d67fc1"> 575</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a346d500f11666f4746237f42a8d67fc1">AdvanceToNextNonZero</a>()</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; {</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keywordflow">if</span> (AtEnd)</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160;</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keywordflow">while</span> (Bits &amp;&amp; !(Bits &amp; 1))</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; {</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; Bits &gt;&gt;= 1;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; BitNumber += 1;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; }</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="comment">// See if we ran out of Bits in this word.</span></div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keywordflow">if</span> (!Bits)</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; {</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keywordtype">int</span> NextSetBitNumber = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a60a023744119cd0424511ea1e83b76e1">find_next</a>(BitNumber % ElementSize) ;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="comment">// If we ran out of set bits in this element, move to next element.</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">if</span> (NextSetBitNumber == -1 || (BitNumber % ElementSize == 0))</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; {</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; ++Iter;</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; WordNumber = 0;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="comment">// We may run out of elements in the bitmap.</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keywordflow">if</span> (Iter == BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; AtEnd = <span class="keyword">true</span>;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; }</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="comment">// Set up for next non-zero word in bitmap.</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; BitNumber = Iter-&gt;index() * ElementSize;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; NextSetBitNumber = Iter-&gt;find_first();</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; BitNumber += NextSetBitNumber;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; WordNumber = (BitNumber % ElementSize) / BITWORD_SIZE;</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; Bits = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(WordNumber);</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; Bits &gt;&gt;= NextSetBitNumber % BITWORD_SIZE;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; }</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; {</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; WordNumber = (NextSetBitNumber % ElementSize) / BITWORD_SIZE;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; Bits = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a5d43d980591d14d3a3d0782be034ed4f">word</a>(WordNumber);</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; Bits &gt;&gt;= NextSetBitNumber % BITWORD_SIZE;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; BitNumber = Iter-&gt;<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>() * ElementSize;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; BitNumber += NextSetBitNumber;</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; }</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; }</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; }</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160;</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;</div><div class="line"><a name="l00624"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5fe4841ca223f13c2aeec4c6e69a7b43"> 624</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5fe4841ca223f13c2aeec4c6e69a7b43">SparseBitVectorIterator</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS,</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keywordtype">bool</span> end = <span class="keyword">false</span>):BitVector(RHS)</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; {</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; Iter = BitVector-&gt;<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; BitNumber = 0;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; Bits = 0;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; WordNumber = ~0;</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; AtEnd = end;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; AdvanceToFirstNonZero();</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; }</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="comment">// Preincrement.</span></div><div class="line"><a name="l00636"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6638115d9d80e0f7b0cff50e06ccd891"> 636</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a>&amp; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a6638115d9d80e0f7b0cff50e06ccd891">operator++</a>()</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; {</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; ++BitNumber;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; Bits &gt;&gt;= 1;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; AdvanceToNextNonZero();</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; }</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160;</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <span class="comment">// Postincrement.</span></div><div class="line"><a name="l00645"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a9615a441805796b993252866e5a971aa"> 645</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a9615a441805796b993252866e5a971aa">operator++</a>(<span class="keywordtype">int</span>)</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> tmp = *<span class="keyword">this</span>;</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; ++*<span class="keyword">this</span>;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; }</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160;</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="comment">// Return the current set bit number.</span></div><div class="line"><a name="l00653"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#ab1f0f55fdfef6b2d64d0a715483f5da4"> 653</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#ab1f0f55fdfef6b2d64d0a715483f5da4">operator*</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="keywordflow">return</span> BitNumber;</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;</div><div class="line"><a name="l00658"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a7fc92990c6a09c33c3676ab47807bc68"> 658</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a7fc92990c6a09c33c3676ab47807bc68">operator==</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="comment">// If they are both at the end, ignore the rest of the fields.</span></div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">if</span> (AtEnd &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab">AtEnd</a>)</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <span class="comment">// Otherwise they are the same if they have the same bit number and</span></div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="comment">// bitmap.</span></div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <span class="keywordflow">return</span> AtEnd == RHS.<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aa28c3c88d66d8bc3dbf96e2f4bd84fab">AtEnd</a> &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#aae6ff6aada3863feb736619d4f8dba16">BitNumber</a> == BitNumber;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160;</div><div class="line"><a name="l00668"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5448a6bdf09ef6a45d7c8e84648221ea"> 668</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html#a5448a6bdf09ef6a45d7c8e84648221ea">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == RHS);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; }</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; };</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00675"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a0421e3336137b232edc442ece00a8a9c"> 675</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a> = <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVectorIterator</a>;</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160;</div><div class="line"><a name="l00677"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a4f618377a31eba119de672b0be4936bc"> 677</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a4f618377a31eba119de672b0be4936bc">SparseBitVector</a>() : Elements(), CurrElementIter(Elements.begin()) {}</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160;</div><div class="line"><a name="l00679"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a9cb4261779da0cbeb8d09b8fbd5cf557"> 679</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a9cb4261779da0cbeb8d09b8fbd5cf557">SparseBitVector</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; : Elements(RHS.Elements), CurrElementIter(Elements.begin()) {}</div><div class="line"><a name="l00681"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a786b5d4d9eb3cf4ec738043fc17e34c0"> 681</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a786b5d4d9eb3cf4ec738043fc17e34c0">SparseBitVector</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;&amp;RHS)</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; : Elements(<a class="code" href="namespacestd.html">std</a>::<a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">move</a>(RHS.Elements)), CurrElementIter(Elements.begin()) {}</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="comment">// Clear.</span></div><div class="line"><a name="l00685"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a5afe3e74412a1f3f728d7e0eaae70c13"> 685</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a5afe3e74412a1f3f728d7e0eaae70c13">clear</a>()</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; Elements.clear();</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="comment">// Assignment</span></div><div class="line"><a name="l00691"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#adeed46c25650bdbccdef0519906d1030"> 691</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a>&amp; <a class="code" href="classSVF_1_1SparseBitVector.html#adeed46c25650bdbccdef0519906d1030">operator=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a>&amp; RHS)</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; {</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160;</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; Elements = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; }</div><div class="line"><a name="l00700"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a74ded252b99e70cb999b869a5250948e"> 700</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;<a class="code" href="classSVF_1_1SparseBitVector.html#a74ded252b99e70cb999b869a5250948e">operator=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;&amp;RHS)</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; {</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; Elements = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(RHS.Elements);</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; }</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <span class="comment">// Test, Reset, and Set a bit in the bitmap.</span></div><div class="line"><a name="l00708"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80"> 708</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(<span class="keywordtype">unsigned</span> Idx)<span class="keyword"> const</span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keywordtype">unsigned</span> ElementIndex = Idx / ElementSize;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> ElementIter = FindLowerBoundConst(ElementIndex);</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="comment">// If we can&#39;t find an element that is supposed to contain this bit, there</span></div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="comment">// is nothing more to do.</span></div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; <span class="keywordflow">if</span> (ElementIter == Elements.end() ||</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; ElementIter-&gt;index() != ElementIndex)</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="keywordflow">return</span> ElementIter-&gt;test(Idx % ElementSize);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; }</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160;</div><div class="line"><a name="l00724"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ad5337b5aeed50f8b7ffd56b14ee25c9f"> 724</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#ad5337b5aeed50f8b7ffd56b14ee25c9f">reset</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; {</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160;</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="keywordtype">unsigned</span> ElementIndex = Idx / ElementSize;</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> ElementIter = FindLowerBound(ElementIndex);</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160;</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="comment">// If we can&#39;t find an element that is supposed to contain this bit, there</span></div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="comment">// is nothing more to do.</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordflow">if</span> (ElementIter == Elements.end() ||</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; ElementIter-&gt;index() != ElementIndex)</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; ElementIter-&gt;reset(Idx % ElementSize);</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="comment">// When the element is zeroed out, delete it.</span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <span class="keywordflow">if</span> (ElementIter-&gt;empty())</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; {</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; ++CurrElementIter;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; Elements.erase(ElementIter);</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; }</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; }</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160;</div><div class="line"><a name="l00747"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832"> 747</a></span>&#160; <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; {</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="keywordtype">unsigned</span> ElementIndex = Idx / ElementSize;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> ElementIter;</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; {</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; ElementIter = Elements.emplace(Elements.end(), ElementIndex);</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; }</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; {</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; ElementIter = FindLowerBound(ElementIndex);</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160;</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <span class="keywordflow">if</span> (ElementIter == Elements.end() ||</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; ElementIter-&gt;index() != ElementIndex)</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; {</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; <span class="comment">// We may have hit the beginning of our SparseBitVector, in which case,</span></div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <span class="comment">// we may need to insert right after this element, which requires moving</span></div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <span class="comment">// the current iterator forward one, because insert does insert before.</span></div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <span class="keywordflow">if</span> (ElementIter != Elements.end() &amp;&amp;</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; ElementIter-&gt;index() &lt; ElementIndex)</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; ++ElementIter;</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; ElementIter = Elements.emplace(ElementIter, ElementIndex);</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; }</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; }</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; CurrElementIter = ElementIter;</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160;</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; ElementIter-&gt;set(Idx % ElementSize);</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; }</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160;</div><div class="line"><a name="l00776"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a355247d17d1c17b857b4ee572e19b91f"> 776</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a355247d17d1c17b857b4ee572e19b91f">test_and_set</a>(<span class="keywordtype">unsigned</span> Idx)</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; {</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; <span class="keywordtype">bool</span> old = test(Idx);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keywordflow">if</span> (!old)</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; {</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <span class="keyword">set</span>(Idx);</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; }</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; }</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160;</div><div class="line"><a name="l00787"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#abfb058304c4b174d162a94c0cc26d2f7"> 787</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#abfb058304c4b174d162a94c0cc26d2f7">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == RHS);</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; }</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;</div><div class="line"><a name="l00792"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a816d96bad46fde34b3848bf08dc6cdf5"> 792</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a816d96bad46fde34b3848bf08dc6cdf5">operator==</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordflow">for</span> (; Iter1 != Elements.end() &amp;&amp; Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end();</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; ++Iter1, ++Iter2)</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; {</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">if</span> (*Iter1 != *Iter2)</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; }</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <span class="keywordflow">return</span> Iter1 == Elements.end() &amp;&amp; Iter2 == RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end();</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; }</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160;</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <span class="comment">// Union our bitmap with the RHS and return true if we changed.</span></div><div class="line"><a name="l00807"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a48668ff6f168162bd8f13cf860749090"> 807</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a48668ff6f168162bd8f13cf860749090">operator|=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; {</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160;</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160;</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; <span class="comment">// If RHS is empty, we are done</span></div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="keywordflow">if</span> (RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160;</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; {</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end() || Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; {</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; Elements.insert(Iter1, *Iter2);</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; ++Iter2;</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; }</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; {</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; changed |= Iter1-&gt;unionWith(*Iter2);</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; ++Iter1;</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; ++Iter2;</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; }</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; {</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; ++Iter1;</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; }</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; }</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; }</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160;</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="comment">// Intersect our bitmap with the RHS and return true if ours changed.</span></div><div class="line"><a name="l00844"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a1f7e6424f8bfc68589a9947b26e0b62f"> 844</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4">operator&amp;=</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; {</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160;</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="comment">// Check if both bitmaps are empty.</span></div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="keywordflow">if</span> (Elements.empty() &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160;</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <span class="comment">// Loop through, intersecting as we go, erasing elements when necessary.</span></div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; {</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end())</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; {</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; }</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160;</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; ++Iter2;</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; }</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; {</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="keywordtype">bool</span> BecameZero;</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; changed |= Iter1-&gt;intersectWith(*Iter2, BecameZero);</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="keywordflow">if</span> (BecameZero)</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; {</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> IterTmp = Iter1;</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; ++Iter1;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; Elements.erase(IterTmp);</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; }</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; {</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; ++Iter1;</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; }</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; ++Iter2;</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; }</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; {</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> IterTmp = Iter1;</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; ++Iter1;</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; Elements.erase(IterTmp);</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; }</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; }</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; <span class="keywordflow">if</span> (Iter1 != Elements.end())</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; {</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; Elements.erase(Iter1, Elements.end());</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; }</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; }</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160;</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="comment">// Intersect our bitmap with the complement of the RHS and return true</span></div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <span class="comment">// if ours changed.</span></div><div class="line"><a name="l00905"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a8b481ef53a27a351affecab90310b1ef"> 905</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a8b481ef53a27a351affecab90310b1ef">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> &amp;RHS)</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; {</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS)</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; {</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keywordflow">if</span> (!empty())</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; {</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; clear();</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; }</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; }</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160;</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="comment">// If either our bitmap or RHS is empty, we are done</span></div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="keywordflow">if</span> (Elements.empty() || RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160;</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="comment">// Loop through, intersecting as we go, erasing elements when necessary.</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; {</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end())</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; {</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; }</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160;</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; {</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; ++Iter2;</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; }</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; {</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keywordtype">bool</span> BecameZero;</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; changed |= Iter1-&gt;intersectWithComplement(*Iter2, BecameZero);</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; <span class="keywordflow">if</span> (BecameZero)</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#a399721230d13a4153766e6e8ed1f9aed">ElementListIter</a> IterTmp = Iter1;</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; ++Iter1;</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; Elements.erase(IterTmp);</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; }</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; ++Iter1;</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; }</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; ++Iter2;</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; }</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; {</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; ++Iter1;</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; }</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; }</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; }</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160;</div><div class="line"><a name="l00963"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#aaab743995d5dd1359b0f541dacc1dcf3"> 963</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#aaab743995d5dd1359b0f541dacc1dcf3">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)<span class="keyword"> const</span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <span class="keywordflow">return</span> intersectWithComplement(*RHS);</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; }</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160;</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="comment">// Three argument version of intersectWithComplement.</span></div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; <span class="comment">// Result of RHS1 &amp; ~RHS2 is stored into this bitmap.</span></div><div class="line"><a name="l00970"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#afee44821475fa31f218fb743b264cb37"> 970</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#afee44821475fa31f218fb743b264cb37">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS1,</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS2)</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; {</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS1)</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; {</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; intersectWithComplement(RHS2);</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; }</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">this</span> == &amp;RHS2)</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; {</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector</a> RHS2Copy(RHS2);</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; intersectWithComplement(RHS1, RHS2Copy);</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; }</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160;</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; Elements.clear();</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; CurrElementIter = Elements.begin();</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter1 = RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS2.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160;</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; <span class="comment">// If RHS1 is empty, we are done</span></div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; <span class="comment">// If RHS2 is empty, we still have to copy RHS1</span></div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; <span class="keywordflow">if</span> (RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160;</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; <span class="comment">// Loop through, intersecting as we go, erasing elements when necessary.</span></div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS2.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; {</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="keywordflow">if</span> (Iter1 == RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; {</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; ++Iter2;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; }</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; {</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <span class="keywordtype">bool</span> BecameZero = <span class="keyword">false</span>;</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; Elements.emplace_back(Iter1-&gt;index());</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; Elements.back().intersectWithComplement(*Iter1, *Iter2, BecameZero);</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="keywordflow">if</span> (BecameZero)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; Elements.pop_back();</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; ++Iter1;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; ++Iter2;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; {</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; Elements.push_back(*Iter1++);</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; }</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; }</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; <span class="comment">// copy the remaining elements</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">std::copy</a>(Iter1, RHS1.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end(), std::back_inserter(Elements));</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; }</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;</div><div class="line"><a name="l01025"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a28d0e5b43ad556d079b5b0ec58e898e4"> 1025</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a28d0e5b43ad556d079b5b0ec58e898e4">intersectWithComplement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS1,</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS2)</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; {</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; intersectWithComplement(*RHS1, *RHS2);</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; }</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;</div><div class="line"><a name="l01031"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a16756e0545fd3d50ab89f45a2e83bb79"> 1031</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a16756e0545fd3d50ab89f45a2e83bb79">intersects</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)<span class="keyword"> const</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <span class="keywordflow">return</span> intersects(*RHS);</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; }</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; <span class="comment">// Return true if we share any bits in common with RHS</span></div><div class="line"><a name="l01037"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a704fddd1bf7592e9df9fbc14c3873696"> 1037</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a704fddd1bf7592e9df9fbc14c3873696">intersects</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter1 = Elements.begin();</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter2 = RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.begin();</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; <span class="comment">// Check if both bitmaps are empty.</span></div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; <span class="keywordflow">if</span> (Elements.empty() &amp;&amp; RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.empty())</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; <span class="comment">// Loop through, intersecting stopping when we hit bits in common.</span></div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; <span class="keywordflow">while</span> (Iter2 != RHS.<a class="code" href="classSVF_1_1SparseBitVector.html#ab094576b73de3c8580ea152f90d63636">Elements</a>.end())</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; {</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; <span class="keywordflow">if</span> (Iter1 == Elements.end())</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;index() &gt; Iter2-&gt;index())</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; {</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; ++Iter2;</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; }</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Iter1-&gt;index() == Iter2-&gt;index())</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; {</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="keywordflow">if</span> (Iter1-&gt;intersects(*Iter2))</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; ++Iter1;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; ++Iter2;</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; }</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; {</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; ++Iter1;</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; }</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; }</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; }</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="comment">// Return true iff all bits set in this SparseBitVector are</span></div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; <span class="comment">// also set in RHS.</span></div><div class="line"><a name="l01073"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#abbd0e0cf759fad7858224ed8a63aade8"> 1073</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#abbd0e0cf759fad7858224ed8a63aade8">contains</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)<span class="keyword"> const</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; Result &amp;= RHS;</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; <span class="keywordflow">return</span> (Result == RHS);</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; }</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; <span class="comment">// Return the first set bit in the bitmap. Return -1 if no bits are set.</span></div><div class="line"><a name="l01081"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a06eeb5543eb160e08f9a41e30b52d963"> 1081</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a06eeb5543eb160e08f9a41e30b52d963">find_first</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; <span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement&lt;ElementSize&gt;</a> &amp;First = *(Elements.begin());</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="keywordflow">return</span> (First.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>() * ElementSize) + First.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a2281ff5a0a492064cff864d4c246cbc2">find_first</a>();</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; }</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; <span class="comment">// Return the last set bit in the bitmap. Return -1 if no bits are set.</span></div><div class="line"><a name="l01090"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#ac969500db9dbd1c63b6a47a1d9a5abba"> 1090</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1SparseBitVector.html#ac969500db9dbd1c63b6a47a1d9a5abba">find_last</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <span class="keywordflow">if</span> (Elements.empty())</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; <span class="keyword">const</span> <a class="code" href="structSVF_1_1SparseBitVectorElement.html">SparseBitVectorElement&lt;ElementSize&gt;</a> &amp;Last = *(Elements.rbegin());</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; <span class="keywordflow">return</span> (Last.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#ae63d6fcc488ad3cdcddf35edb4e9c827">index</a>() * ElementSize) + Last.<a class="code" href="structSVF_1_1SparseBitVectorElement.html#a1d79c099887fcf01f5c0743b38caf39d">find_last</a>();</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; }</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="comment">// Return true if the SparseBitVector is empty</span></div><div class="line"><a name="l01099"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#aea5389ad7e5fe4c8bef686940a1a6056"> 1099</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SparseBitVector.html#aea5389ad7e5fe4c8bef686940a1a6056">empty</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; <span class="keywordflow">return</span> Elements.empty();</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; }</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;</div><div class="line"><a name="l01104"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9"> 1104</a></span>&#160; <span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9">count</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keywordtype">unsigned</span> BitCount = 0;</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector.html#acdc2e97bfeeba3a91d8793992df9451f">ElementListConstIter</a> Iter = Elements.begin();</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; Iter != Elements.end();</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; ++Iter)</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; BitCount += Iter-&gt;count();</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="keywordflow">return</span> BitCount;</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; }</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772"> 1115</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a> <a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; }</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;</div><div class="line"><a name="l01120"></a><span class="lineno"><a class="line" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1"> 1120</a></span>&#160; <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a> <a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>()<span class="keyword"> const</span></div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">iterator</a>(<span class="keyword">this</span>, <span class="keyword">true</span>);</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; }</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;};</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;<span class="comment">// Convenience functions to allow Or and And without dereferencing in the user</span></div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;<span class="comment">// code.</span></div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01130"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a97ff28f5dfd5c31e6ef351de3cdad85d"> 1130</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a97ff28f5dfd5c31e6ef351de3cdad85d">operator |=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;{</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; <span class="keywordflow">return</span> LHS |= *RHS;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;}</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01137"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a7554dead3b2d1bcdfcb36c213e6735b6"> 1137</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a97ff28f5dfd5c31e6ef351de3cdad85d">operator |=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *LHS,</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;{</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <span class="keywordflow">return</span> LHS-&gt;operator|=(RHS);</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;}</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01144"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4"> 1144</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4">operator &amp;=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *LHS,</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;{</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; <span class="keywordflow">return</span> LHS-&gt;operator&amp;=(RHS);</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;}</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01151"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a5df68020aca621b053acbe3f917f0809"> 1151</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#a9d6c986a34096a3552a6385ccbb724e4">operator &amp;=</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> *RHS)</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;{</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <span class="keywordflow">return</span> LHS &amp;= *RHS;</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;}</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;<span class="comment">// Convenience functions for infix union, intersection, difference operators.</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;<span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a></div><div class="line"><a name="l01161"></a><span class="lineno"><a class="line" href="namespaceSVF.html#ad16a5803e8f1fa06266223aeb8366df1"> 1161</a></span>&#160;<a class="code" href="namespaceSVF.html#aa01b96d5bc6c3930b0bfca789acf75c4">operator|</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;{</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result(LHS);</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160; Result |= RHS;</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; <span class="keywordflow">return</span> Result;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;}</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;<span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a></div><div class="line"><a name="l01171"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a47b11c4e305a8a1e2dc387c2f9d4617e"> 1171</a></span>&#160;<a class="code" href="namespaceSVF.html#aaa21ff095e66a18937f29246e213f69d">operator&amp;</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;{</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result(LHS);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; Result &amp;= RHS;</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; <span class="keywordflow">return</span> Result;</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;}</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;<span class="keyword">inline</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a></div><div class="line"><a name="l01181"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a1b6662f895cfd942996ac4d578960eed"> 1181</a></span>&#160;<a class="code" href="namespaceSVF.html#a6c2f7ce4908d39a17b29830a2e4bd781">operator-</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS,</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;RHS)</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;{</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> Result;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; Result.<a class="code" href="classSVF_1_1SparseBitVector.html#a8b481ef53a27a351affecab90310b1ef">intersectWithComplement</a>(LHS, RHS);</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; <span class="keywordflow">return</span> Result;</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;}</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;<span class="comment">// Dump a SparseBitVector to a stream</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> ElementSize&gt;</div><div class="line"><a name="l01191"></a><span class="lineno"><a class="line" href="namespaceSVF.html#aae350f79ebcb9efd22ec9efa6678cd13"> 1191</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceSVF.html#aae350f79ebcb9efd22ec9efa6678cd13">dump</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">SparseBitVector&lt;ElementSize&gt;</a> &amp;LHS, std::ostream &amp;out)</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;{</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; out &lt;&lt; <span class="stringliteral">&quot;[&quot;</span>;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; <span class="keyword">typename</span> <a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SparseBitVector&lt;ElementSize&gt;::iterator</a> bi = LHS.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(),</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; be = LHS.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>();</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; <span class="keywordflow">if</span> (bi != be)</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; {</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; out &lt;&lt; *bi;</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160; <span class="keywordflow">for</span> (++bi; bi != be; ++bi)</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; {</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160; out &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; *bi;</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160; }</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; }</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; out &lt;&lt; <span class="stringliteral">&quot;]\n&quot;</span>;</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;}</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;} <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;<span class="preprocessor">#endif // SPARSEBITVECTOR_H</span></div><div class="ttc" id="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator_html"><div class="ttname"><a href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVF::SparseBitVector::SparseBitVectorIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00536">SparseBitVector.h:536</a></div></div>
70
70
  <div class="ttc" id="classSVF_1_1SparseBitVector_html_ac969500db9dbd1c63b6a47a1d9a5abba"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html#ac969500db9dbd1c63b6a47a1d9a5abba">SVF::SparseBitVector::find_last</a></div><div class="ttdeci">int find_last() const</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l01090">SparseBitVector.h:1090</a></div></div>
71
71
  <div class="ttc" id="structSVF_1_1SparseBitVectorElement_html_a2281ff5a0a492064cff864d4c246cbc2"><div class="ttname"><a href="structSVF_1_1SparseBitVectorElement.html#a2281ff5a0a492064cff864d4c246cbc2">SVF::SparseBitVectorElement::find_first</a></div><div class="ttdeci">int find_first() const</div><div class="ttdoc">find_first - Returns the index of the first set bit. </div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00318">SparseBitVector.h:318</a></div></div>
72
72
  <div class="ttc" id="structSVF_1_1TrailingZerosCounter_html_aa8b0814bfce87a935ef57f870fe1ee83"><div class="ttname"><a href="structSVF_1_1TrailingZerosCounter.html#aa8b0814bfce87a935ef57f870fe1ee83">SVF::TrailingZerosCounter::count</a></div><div class="ttdeci">static unsigned count(T Val, ZeroBehavior)</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00044">SparseBitVector.h:44</a></div></div>