expressir 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (310) hide show
  1. checksums.yaml +4 -4
  2. data/.cross_rubies +0 -6
  3. data/.github/workflows/rake.yml +200 -9
  4. data/.gitignore +7 -2
  5. data/.gitmodules +3 -0
  6. data/.rubocop.yml +13 -4
  7. data/Rakefile +4 -1
  8. data/bin/console +0 -1
  9. data/bin/rspec +3 -3
  10. data/exe/expressir +4 -2
  11. data/exe/format +1 -1
  12. data/exe/format-test +25 -25
  13. data/exe/generate-parser +16 -13
  14. data/expressir.gemspec +11 -9
  15. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/CMakeLists.txt +44 -34
  16. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj +11 -5
  17. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj.filters +0 -3
  18. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj +11 -4
  19. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj.filters +0 -3
  20. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj +11 -4
  21. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj.filters +0 -3
  22. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj +11 -4
  23. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj.filters +0 -3
  24. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/project.pbxproj +20 -20
  25. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRFileStream.cpp +0 -6
  26. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.cpp +30 -19
  27. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.h +13 -10
  28. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonToken.cpp +2 -4
  29. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/DefaultErrorStrategy.cpp +16 -13
  30. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.cpp +2 -2
  31. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.h +2 -2
  32. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.cpp +5 -4
  33. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.h +1 -1
  34. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/IntStream.h +0 -6
  35. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.cpp +0 -1
  36. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.h +0 -13
  37. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.cpp +0 -15
  38. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.h +1 -7
  39. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.cpp +47 -27
  40. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.h +0 -6
  41. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.cpp +27 -39
  42. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.h +1 -7
  43. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.cpp +19 -22
  44. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.h +20 -20
  45. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RecognitionException.cpp +0 -1
  46. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.cpp +16 -27
  47. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.h +10 -21
  48. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.cpp +4 -3
  49. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.h +5 -1
  50. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuntimeMetaData.cpp +2 -1
  51. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Token.h +0 -32
  52. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.cpp +1 -1
  53. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.h +2 -7
  54. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.cpp +15 -18
  55. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.h +12 -18
  56. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Version.h +42 -0
  57. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.cpp +13 -45
  58. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.h +11 -26
  59. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-common.h +19 -61
  60. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-runtime.h +7 -5
  61. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.cpp +4 -55
  62. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.h +34 -20
  63. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.cpp +30 -35
  64. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.h +35 -32
  65. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.cpp +58 -54
  66. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.h +77 -31
  67. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.cpp +22 -32
  68. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.h +22 -24
  69. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp +335 -462
  70. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.h +9 -68
  71. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.cpp +9 -39
  72. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.h +6 -22
  73. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.cpp +10 -26
  74. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.h +41 -42
  75. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.cpp +33 -0
  76. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.h +36 -0
  77. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.cpp +2 -6
  78. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.h +4 -2
  79. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.cpp +49 -22
  80. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.h +20 -12
  81. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.cpp +1 -5
  82. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.h +5 -2
  83. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.h +4 -2
  84. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.h +4 -2
  85. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.h +5 -3
  86. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.h +10 -1
  87. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionInfo.h +1 -1
  88. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.cpp +0 -5
  89. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.h +12 -8
  90. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.cpp +2 -6
  91. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.h +6 -3
  92. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.cpp +139 -106
  93. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.h +9 -48
  94. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.cpp +16 -33
  95. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.h +12 -12
  96. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.cpp +69 -82
  97. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.h +15 -33
  98. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.cpp +12 -6
  99. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.h +45 -11
  100. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.cpp +48 -44
  101. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.h +31 -18
  102. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionType.h +3 -1
  103. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.cpp +14 -26
  104. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.h +12 -16
  105. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.cpp +15 -32
  106. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.h +12 -24
  107. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.cpp +23 -29
  108. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.h +13 -19
  109. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.cpp +13 -26
  110. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.h +12 -16
  111. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.cpp +6 -17
  112. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.h +12 -16
  113. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.cpp +6 -17
  114. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.h +12 -16
  115. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.cpp +13 -26
  116. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.h +12 -16
  117. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.cpp +6 -17
  118. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.h +11 -15
  119. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.cpp +13 -26
  120. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.h +13 -17
  121. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.h +5 -1
  122. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.cpp +1 -6
  123. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.h +4 -2
  124. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.cpp +6 -2
  125. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.h +8 -3
  126. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp +164 -151
  127. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.h +26 -19
  128. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulatorOptions.h +50 -0
  129. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.h +5 -1
  130. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.h +5 -2
  131. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.cpp +2 -11
  132. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.h +15 -9
  133. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.cpp +2 -2
  134. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.h +2 -2
  135. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.cpp +4 -14
  136. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.h +22 -11
  137. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.cpp +255 -338
  138. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.h +86 -127
  139. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.cpp +56 -0
  140. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.h +64 -0
  141. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.cpp +167 -0
  142. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.h +101 -0
  143. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCacheOptions.h +71 -0
  144. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextType.h +21 -0
  145. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.cpp +18 -17
  146. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.h +1 -1
  147. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.cpp +2 -2
  148. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.h +2 -2
  149. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.cpp +1 -5
  150. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.h +4 -2
  151. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.h +4 -3
  152. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.h +4 -2
  153. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.cpp +1 -5
  154. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.h +5 -3
  155. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.cpp +197 -156
  156. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.h +92 -81
  157. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContextType.h +23 -0
  158. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SerializedATNView.h +101 -0
  159. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.cpp +2 -6
  160. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.h +11 -3
  161. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.cpp +39 -34
  162. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.h +17 -10
  163. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.h +5 -2
  164. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.h +4 -2
  165. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.cpp +6 -6
  166. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.h +6 -2
  167. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.h +5 -2
  168. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.cpp +1 -9
  169. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.h +11 -22
  170. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.cpp +27 -0
  171. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.h +33 -0
  172. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.cpp +1 -5
  173. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.h +4 -2
  174. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.cpp +9 -21
  175. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.h +20 -15
  176. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.cpp +1 -8
  177. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.h +4 -4
  178. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.cpp +9 -50
  179. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.h +57 -48
  180. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.cpp +1 -4
  181. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.h +3 -4
  182. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.cpp +2 -2
  183. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.h +3 -1
  184. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.cpp +1 -29
  185. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.h +10 -10
  186. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.cpp +7 -20
  187. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.h +1 -9
  188. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.cpp +54 -68
  189. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.h +34 -14
  190. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.cpp +0 -5
  191. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.h +1 -155
  192. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Arrays.h +39 -0
  193. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/BitSet.h +1 -1
  194. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.cpp +12 -53
  195. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.h +16 -29
  196. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Casts.h +34 -0
  197. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Declarations.h +0 -2
  198. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.cpp +25 -33
  199. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.h +2 -62
  200. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Unicode.h +28 -0
  201. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.cpp +242 -0
  202. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.h +54 -0
  203. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/AbstractParseTreeVisitor.h +13 -12
  204. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.h +7 -2
  205. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.cpp +36 -5
  206. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.h +14 -4
  207. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/IterativeParseTreeWalker.cpp +14 -19
  208. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.cpp +0 -3
  209. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.h +13 -4
  210. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeType.h +22 -0
  211. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeVisitor.h +4 -4
  212. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.cpp +8 -9
  213. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.h +4 -4
  214. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.h +10 -2
  215. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.cpp +2 -5
  216. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.h +4 -5
  217. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/pattern/ParseTreePatternMatcher.cpp +1 -2
  218. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.cpp +128 -119
  219. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.h +18 -27
  220. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/tests/Utf8Test.cpp +110 -0
  221. data/ext/express-parser/antlrgen/Express.interp +1 -1
  222. data/ext/express-parser/antlrgen/ExpressBaseListener.cpp +1 -1
  223. data/ext/express-parser/antlrgen/ExpressBaseListener.h +1 -1
  224. data/ext/express-parser/antlrgen/ExpressBaseVisitor.cpp +1 -1
  225. data/ext/express-parser/antlrgen/ExpressBaseVisitor.h +200 -200
  226. data/ext/express-parser/antlrgen/ExpressLexer.cpp +645 -1129
  227. data/ext/express-parser/antlrgen/ExpressLexer.h +20 -27
  228. data/ext/express-parser/antlrgen/ExpressLexer.interp +1 -1
  229. data/ext/express-parser/antlrgen/ExpressListener.cpp +1 -1
  230. data/ext/express-parser/antlrgen/ExpressListener.h +1 -1
  231. data/ext/express-parser/antlrgen/ExpressParser.cpp +1754 -1447
  232. data/ext/express-parser/antlrgen/ExpressParser.h +219 -223
  233. data/ext/express-parser/antlrgen/ExpressVisitor.cpp +1 -1
  234. data/ext/express-parser/antlrgen/ExpressVisitor.h +200 -200
  235. data/ext/express-parser/express_parser.cpp +207 -75
  236. data/ext/express-parser/extconf.rb +10 -9
  237. data/lib/expressir/config.rb +1 -1
  238. data/lib/expressir/express/parser.rb +2 -2
  239. data/lib/expressir/express/visitor.rb +7 -5
  240. data/lib/expressir/model.rb +78 -78
  241. data/lib/expressir/version.rb +1 -1
  242. data/rakelib/antlr4-native.rake +63 -0
  243. data/rakelib/cross-ruby.rake +213 -162
  244. data/spec/acceptance/version_spec.rb +7 -2
  245. data/spec/expressir/express/cache_spec.rb +8 -5
  246. data/spec/expressir/express/formatter_spec.rb +16 -8
  247. data/spec/expressir/express/parser_spec.rb +17 -11
  248. data/spec/expressir/model/model_element_spec.rb +154 -146
  249. metadata +79 -91
  250. data/demo.rb +0 -18
  251. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.cpp +0 -621
  252. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.h +0 -61
  253. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.cpp +0 -14
  254. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.h +0 -24
  255. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.cpp +0 -12
  256. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.cpp +0 -12
  257. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.cpp +0 -15
  258. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.cpp +0 -9
  259. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.cpp +0 -35
  260. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.h +0 -27
  261. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.cpp +0 -12
  262. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Makefile +0 -67
  263. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.cpp +0 -12
  264. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.cpp +0 -12
  265. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.cpp +0 -16
  266. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.cpp +0 -12
  267. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.cpp +0 -12
  268. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.cpp +0 -15
  269. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.cpp +0 -12
  270. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.cpp +0 -303
  271. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.h +0 -112
  272. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.cpp +0 -9
  273. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.cpp +0 -9
  274. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +0 -9589
  275. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +0 -36619
  276. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +0 -13294
  277. data/original/examples/employment/eclipse/.project +0 -17
  278. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  279. data/original/examples/employment/eclipse/Express/employment_schema.exp +0 -33
  280. data/original/examples/employment/eclipse/Express/employment_schema.xmi +0 -77
  281. data/original/examples/employment/eclipse/Express/employment_schema.xml +0 -93
  282. data/original/examples/employment/eclipse/Models/Employment.uml +0 -4
  283. data/original/examples/employment/eclipse/Models/Employment.umldi +0 -240
  284. data/original/examples/employment/eclipse/readme.txt +0 -7
  285. data/original/examples/employment/employment_schema.exp +0 -33
  286. data/original/examples/employment/employment_schema.rb +0 -232
  287. data/original/examples/employment/employment_schema.xml +0 -93
  288. data/original/examples/employment/employment_schema___module.rb +0 -46
  289. data/original/examples/employment/employment_schema___p28attr.rb +0 -126
  290. data/original/examples/employment/employment_schema___p28inst.rb +0 -26
  291. data/original/examples/employment/example_employment_data.xml +0 -1
  292. data/original/examples/employment/example_employment_data_copy.xml +0 -1
  293. data/original/examples/employment/example_employment_reader.rb +0 -30
  294. data/original/examples/employment/example_employment_writer.rb +0 -51
  295. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +0 -3710
  296. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +0 -35880
  297. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +0 -15357
  298. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +0 -9468
  299. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +0 -8404
  300. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +0 -43147
  301. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +0 -18341
  302. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +0 -11632
  303. data/original/exp2ruby.rb +0 -525
  304. data/original/expsm.rb +0 -34
  305. data/original/mapping_owl.rb +0 -1018
  306. data/original/mapping_sysml.rb +0 -2281
  307. data/original/mapping_uml2.rb +0 -599
  308. data/original/mapping_uml2_eclipse.rb +0 -433
  309. data/original/reeper.rb +0 -134
  310. data/spec/expressr_spec.rb +0 -5
@@ -3,35 +3,136 @@
3
3
  * can be found in the LICENSE.txt file in the project root.
4
4
  */
5
5
 
6
- #include "atn/EmptyPredictionContext.h"
6
+ #include "atn/SingletonPredictionContext.h"
7
7
  #include "misc/MurmurHash.h"
8
8
  #include "atn/ArrayPredictionContext.h"
9
+ #include "atn/PredictionContextCache.h"
10
+ #include "atn/PredictionContextMergeCache.h"
9
11
  #include "RuleContext.h"
10
12
  #include "ParserRuleContext.h"
11
13
  #include "atn/RuleTransition.h"
12
14
  #include "support/Arrays.h"
13
15
  #include "support/CPPUtils.h"
16
+ #include "support/Casts.h"
14
17
 
15
18
  #include "atn/PredictionContext.h"
16
19
 
17
20
  using namespace antlr4;
18
21
  using namespace antlr4::misc;
19
22
  using namespace antlr4::atn;
20
-
21
23
  using namespace antlrcpp;
22
24
 
23
- size_t PredictionContext::globalNodeCount = 0;
24
- const Ref<PredictionContext> PredictionContext::EMPTY = std::make_shared<EmptyPredictionContext>();
25
+ namespace {
25
26
 
26
- //----------------- PredictionContext ----------------------------------------------------------------------------------
27
+ void combineCommonParents(std::vector<Ref<const PredictionContext>> &parents) {
28
+ std::unordered_set<Ref<const PredictionContext>> uniqueParents;
29
+ uniqueParents.reserve(parents.size());
30
+ for (const auto &parent : parents) {
31
+ uniqueParents.insert(parent);
32
+ }
33
+ for (auto &parent : parents) {
34
+ parent = *uniqueParents.find(parent);
35
+ }
36
+ }
27
37
 
28
- PredictionContext::PredictionContext(size_t cachedHashCode) : id(globalNodeCount++), cachedHashCode(cachedHashCode) {
29
- }
38
+ Ref<const PredictionContext> getCachedContextImpl(const Ref<const PredictionContext> &context,
39
+ PredictionContextCache &contextCache,
40
+ std::unordered_map<Ref<const PredictionContext>,
41
+ Ref<const PredictionContext>> &visited) {
42
+ if (context->isEmpty()) {
43
+ return context;
44
+ }
45
+
46
+ {
47
+ auto iterator = visited.find(context);
48
+ if (iterator != visited.end()) {
49
+ return iterator->second; // Not necessarly the same as context.
50
+ }
51
+ }
52
+
53
+ auto cached = contextCache.get(context);
54
+ if (cached) {
55
+ visited[context] = cached;
56
+ return cached;
57
+ }
58
+
59
+ bool changed = false;
60
+
61
+ std::vector<Ref<const PredictionContext>> parents(context->size());
62
+ for (size_t i = 0; i < parents.size(); i++) {
63
+ auto parent = getCachedContextImpl(context->getParent(i), contextCache, visited);
64
+ if (changed || parent != context->getParent(i)) {
65
+ if (!changed) {
66
+ parents.clear();
67
+ for (size_t j = 0; j < context->size(); j++) {
68
+ parents.push_back(context->getParent(j));
69
+ }
70
+
71
+ changed = true;
72
+ }
73
+
74
+ parents[i] = std::move(parent);
75
+ }
76
+ }
77
+
78
+ if (!changed) {
79
+ visited[context] = context;
80
+ contextCache.put(context);
81
+ return context;
82
+ }
83
+
84
+ Ref<const PredictionContext> updated;
85
+ if (parents.empty()) {
86
+ updated = PredictionContext::EMPTY;
87
+ } else if (parents.size() == 1) {
88
+ updated = SingletonPredictionContext::create(std::move(parents[0]), context->getReturnState(0));
89
+ contextCache.put(updated);
90
+ } else {
91
+ updated = std::make_shared<ArrayPredictionContext>(std::move(parents), downCast<const ArrayPredictionContext*>(context.get())->returnStates);
92
+ contextCache.put(updated);
93
+ }
94
+
95
+ visited[updated] = updated;
96
+ visited[context] = updated;
97
+
98
+ return updated;
99
+ }
100
+
101
+ void getAllContextNodesImpl(const Ref<const PredictionContext> &context,
102
+ std::vector<Ref<const PredictionContext>> &nodes,
103
+ std::unordered_set<const PredictionContext*> &visited) {
104
+
105
+ if (visited.find(context.get()) != visited.end()) {
106
+ return; // Already done.
107
+ }
108
+
109
+ visited.insert(context.get());
110
+ nodes.push_back(context);
111
+
112
+ for (size_t i = 0; i < context->size(); i++) {
113
+ getAllContextNodesImpl(context->getParent(i), nodes, visited);
114
+ }
115
+ }
116
+
117
+ size_t insertOrAssignNodeId(std::unordered_map<const PredictionContext*, size_t> &nodeIds, size_t &nodeId, const PredictionContext *node) {
118
+ auto existing = nodeIds.find(node);
119
+ if (existing != nodeIds.end()) {
120
+ return existing->second;
121
+ }
122
+ return nodeIds.insert({node, nodeId++}).first->second;
123
+ }
30
124
 
31
- PredictionContext::~PredictionContext() {
32
125
  }
33
126
 
34
- Ref<PredictionContext> PredictionContext::fromRuleContext(const ATN &atn, RuleContext *outerContext) {
127
+ const Ref<const PredictionContext> PredictionContext::EMPTY = std::make_shared<SingletonPredictionContext>(nullptr, PredictionContext::EMPTY_RETURN_STATE);
128
+
129
+ //----------------- PredictionContext ----------------------------------------------------------------------------------
130
+
131
+ PredictionContext::PredictionContext(PredictionContextType contextType) : _contextType(contextType), _hashCode(0) {}
132
+
133
+ PredictionContext::PredictionContext(PredictionContext&& other) : _contextType(other._contextType), _hashCode(other._hashCode.exchange(0, std::memory_order_relaxed)) {}
134
+
135
+ Ref<const PredictionContext> PredictionContext::fromRuleContext(const ATN &atn, RuleContext *outerContext) {
35
136
  if (outerContext == nullptr) {
36
137
  return PredictionContext::EMPTY;
37
138
  }
@@ -43,15 +144,9 @@ Ref<PredictionContext> PredictionContext::fromRuleContext(const ATN &atn, RuleCo
43
144
  }
44
145
 
45
146
  // If we have a parent, convert it to a PredictionContext graph
46
- Ref<PredictionContext> parent = PredictionContext::fromRuleContext(atn, dynamic_cast<RuleContext *>(outerContext->parent));
47
-
48
- ATNState *state = atn.states.at(outerContext->invokingState);
49
- RuleTransition *transition = (RuleTransition *)state->transitions[0];
50
- return SingletonPredictionContext::create(parent, transition->followState->stateNumber);
51
- }
52
-
53
- bool PredictionContext::isEmpty() const {
54
- return this == EMPTY.get();
147
+ auto parent = PredictionContext::fromRuleContext(atn, RuleContext::is(outerContext->parent) ? downCast<RuleContext*>(outerContext->parent) : nullptr);
148
+ const auto *transition = downCast<const RuleTransition*>(atn.states[outerContext->invokingState]->transitions[0].get());
149
+ return SingletonPredictionContext::create(std::move(parent), transition->followState->stateNumber);
55
150
  }
56
151
 
57
152
  bool PredictionContext::hasEmptyPath() const {
@@ -60,40 +155,19 @@ bool PredictionContext::hasEmptyPath() const {
60
155
  }
61
156
 
62
157
  size_t PredictionContext::hashCode() const {
63
- return cachedHashCode;
64
- }
65
-
66
- size_t PredictionContext::calculateEmptyHashCode() {
67
- size_t hash = MurmurHash::initialize(INITIAL_HASH);
68
- hash = MurmurHash::finish(hash, 0);
69
- return hash;
70
- }
71
-
72
- size_t PredictionContext::calculateHashCode(Ref<PredictionContext> parent, size_t returnState) {
73
- size_t hash = MurmurHash::initialize(INITIAL_HASH);
74
- hash = MurmurHash::update(hash, parent);
75
- hash = MurmurHash::update(hash, returnState);
76
- hash = MurmurHash::finish(hash, 2);
77
- return hash;
78
- }
79
-
80
- size_t PredictionContext::calculateHashCode(const std::vector<Ref<PredictionContext>> &parents,
81
- const std::vector<size_t> &returnStates) {
82
- size_t hash = MurmurHash::initialize(INITIAL_HASH);
83
-
84
- for (auto parent : parents) {
85
- hash = MurmurHash::update(hash, parent);
86
- }
87
-
88
- for (auto returnState : returnStates) {
89
- hash = MurmurHash::update(hash, returnState);
158
+ auto hash = cachedHashCode();
159
+ if (hash == 0) {
160
+ hash = hashCodeImpl();
161
+ if (hash == 0) {
162
+ hash = std::numeric_limits<size_t>::max();
163
+ }
164
+ _hashCode.store(hash, std::memory_order_relaxed);
90
165
  }
91
-
92
- return MurmurHash::finish(hash, parents.size() + returnStates.size());
166
+ return hash;
93
167
  }
94
168
 
95
- Ref<PredictionContext> PredictionContext::merge(const Ref<PredictionContext> &a,
96
- const Ref<PredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
169
+ Ref<const PredictionContext> PredictionContext::merge(Ref<const PredictionContext> a, Ref<const PredictionContext> b,
170
+ bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
97
171
  assert(a && b);
98
172
 
99
173
  // share same graph if both same
@@ -101,42 +175,45 @@ Ref<PredictionContext> PredictionContext::merge(const Ref<PredictionContext> &a,
101
175
  return a;
102
176
  }
103
177
 
104
- if (is<SingletonPredictionContext>(a) && is<SingletonPredictionContext>(b)) {
105
- return mergeSingletons(std::dynamic_pointer_cast<SingletonPredictionContext>(a),
106
- std::dynamic_pointer_cast<SingletonPredictionContext>(b), rootIsWildcard, mergeCache);
178
+ const auto aType = a->getContextType();
179
+ const auto bType = b->getContextType();
180
+
181
+ if (aType == PredictionContextType::SINGLETON && bType == PredictionContextType::SINGLETON) {
182
+ return mergeSingletons(std::static_pointer_cast<const SingletonPredictionContext>(std::move(a)),
183
+ std::static_pointer_cast<const SingletonPredictionContext>(std::move(b)), rootIsWildcard, mergeCache);
107
184
  }
108
185
 
109
186
  // At least one of a or b is array.
110
187
  // If one is $ and rootIsWildcard, return $ as * wildcard.
111
188
  if (rootIsWildcard) {
112
- if (is<EmptyPredictionContext>(a)) {
189
+ if (a == PredictionContext::EMPTY) {
113
190
  return a;
114
191
  }
115
- if (is<EmptyPredictionContext>(b)) {
192
+ if (b == PredictionContext::EMPTY) {
116
193
  return b;
117
194
  }
118
195
  }
119
196
 
120
197
  // convert singleton so both are arrays to normalize
121
- Ref<ArrayPredictionContext> left;
122
- if (is<SingletonPredictionContext>(a)) {
123
- left = std::make_shared<ArrayPredictionContext>(std::dynamic_pointer_cast<SingletonPredictionContext>(a));
198
+ Ref<const ArrayPredictionContext> left;
199
+ if (aType == PredictionContextType::SINGLETON) {
200
+ left = std::make_shared<ArrayPredictionContext>(downCast<const SingletonPredictionContext&>(*a));
124
201
  } else {
125
- left = std::dynamic_pointer_cast<ArrayPredictionContext>(a);
202
+ left = std::static_pointer_cast<const ArrayPredictionContext>(std::move(a));
126
203
  }
127
- Ref<ArrayPredictionContext> right;
128
- if (is<SingletonPredictionContext>(b)) {
129
- right = std::make_shared<ArrayPredictionContext>(std::dynamic_pointer_cast<SingletonPredictionContext>(b));
204
+ Ref<const ArrayPredictionContext> right;
205
+ if (bType == PredictionContextType::SINGLETON) {
206
+ right = std::make_shared<ArrayPredictionContext>(downCast<const SingletonPredictionContext&>(*b));
130
207
  } else {
131
- right = std::dynamic_pointer_cast<ArrayPredictionContext>(b);
208
+ right = std::static_pointer_cast<const ArrayPredictionContext>(std::move(b));
132
209
  }
133
- return mergeArrays(left, right, rootIsWildcard, mergeCache);
210
+ return mergeArrays(std::move(left), std::move(right), rootIsWildcard, mergeCache);
134
211
  }
135
212
 
136
- Ref<PredictionContext> PredictionContext::mergeSingletons(const Ref<SingletonPredictionContext> &a,
137
- const Ref<SingletonPredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
213
+ Ref<const PredictionContext> PredictionContext::mergeSingletons(Ref<const SingletonPredictionContext> a, Ref<const SingletonPredictionContext> b,
214
+ bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
138
215
 
139
- if (mergeCache != nullptr) { // Can be null if not given to the ATNState from which this call originates.
216
+ if (mergeCache) {
140
217
  auto existing = mergeCache->get(a, b);
141
218
  if (existing) {
142
219
  return existing;
@@ -147,18 +224,18 @@ Ref<PredictionContext> PredictionContext::mergeSingletons(const Ref<SingletonPre
147
224
  }
148
225
  }
149
226
 
150
- Ref<PredictionContext> rootMerge = mergeRoot(a, b, rootIsWildcard);
227
+ auto rootMerge = mergeRoot(a, b, rootIsWildcard);
151
228
  if (rootMerge) {
152
- if (mergeCache != nullptr) {
153
- mergeCache->put(a, b, rootMerge);
229
+ if (mergeCache) {
230
+ return mergeCache->put(a, b, std::move(rootMerge));
154
231
  }
155
232
  return rootMerge;
156
233
  }
157
234
 
158
- Ref<PredictionContext> parentA = a->parent;
159
- Ref<PredictionContext> parentB = b->parent;
235
+ const auto& parentA = a->parent;
236
+ const auto& parentB = b->parent;
160
237
  if (a->returnState == b->returnState) { // a == b
161
- Ref<PredictionContext> parent = merge(parentA, parentB, rootIsWildcard, mergeCache);
238
+ auto parent = merge(parentA, parentB, rootIsWildcard, mergeCache);
162
239
 
163
240
  // If parent is same as existing a or b parent or reduced to a parent, return it.
164
241
  if (parent == parentA) { // ax + bx = ax, if a=b
@@ -172,55 +249,55 @@ Ref<PredictionContext> PredictionContext::mergeSingletons(const Ref<SingletonPre
172
249
  // merge parents x and y, giving array node with x,y then remainders
173
250
  // of those graphs. dup a, a' points at merged array
174
251
  // new joined parent so create new singleton pointing to it, a'
175
- Ref<PredictionContext> a_ = SingletonPredictionContext::create(parent, a->returnState);
176
- if (mergeCache != nullptr) {
177
- mergeCache->put(a, b, a_);
178
- }
179
- return a_;
180
- } else {
181
- // a != b payloads differ
182
- // see if we can collapse parents due to $+x parents if local ctx
183
- Ref<PredictionContext> singleParent;
184
- if (a == b || (*parentA == *parentB)) { // ax + bx = [a,b]x
185
- singleParent = parentA;
186
- }
187
- if (singleParent) { // parents are same, sort payloads and use same parent
188
- std::vector<size_t> payloads = { a->returnState, b->returnState };
189
- if (a->returnState > b->returnState) {
190
- payloads[0] = b->returnState;
191
- payloads[1] = a->returnState;
192
- }
193
- std::vector<Ref<PredictionContext>> parents = { singleParent, singleParent };
194
- Ref<PredictionContext> a_ = std::make_shared<ArrayPredictionContext>(parents, payloads);
195
- if (mergeCache != nullptr) {
196
- mergeCache->put(a, b, a_);
197
- }
198
- return a_;
199
- }
200
-
201
- // parents differ and can't merge them. Just pack together
202
- // into array; can't merge.
203
- // ax + by = [ax,by]
204
- Ref<PredictionContext> a_;
205
- if (a->returnState > b->returnState) { // sort by payload
206
- std::vector<size_t> payloads = { b->returnState, a->returnState };
207
- std::vector<Ref<PredictionContext>> parents = { b->parent, a->parent };
208
- a_ = std::make_shared<ArrayPredictionContext>(parents, payloads);
209
- } else {
210
- std::vector<size_t> payloads = {a->returnState, b->returnState};
211
- std::vector<Ref<PredictionContext>> parents = { a->parent, b->parent };
212
- a_ = std::make_shared<ArrayPredictionContext>(parents, payloads);
213
- }
214
-
215
- if (mergeCache != nullptr) {
216
- mergeCache->put(a, b, a_);
217
- }
218
- return a_;
219
- }
252
+ auto c = SingletonPredictionContext::create(std::move(parent), a->returnState);
253
+ if (mergeCache) {
254
+ return mergeCache->put(a, b, std::move(c));
255
+ }
256
+ return c;
257
+ }
258
+ // a != b payloads differ
259
+ // see if we can collapse parents due to $+x parents if local ctx
260
+ Ref<const PredictionContext> singleParent;
261
+ if (a == b || (*parentA == *parentB)) { // ax + bx = [a,b]x
262
+ singleParent = parentA;
263
+ }
264
+ if (singleParent) { // parents are same, sort payloads and use same parent
265
+ std::vector<size_t> payloads = { a->returnState, b->returnState };
266
+ if (a->returnState > b->returnState) {
267
+ payloads[0] = b->returnState;
268
+ payloads[1] = a->returnState;
269
+ }
270
+ std::vector<Ref<const PredictionContext>> parents = { singleParent, singleParent };
271
+ auto c = std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
272
+ if (mergeCache) {
273
+ return mergeCache->put(a, b, std::move(c));
274
+ }
275
+ return c;
276
+ }
277
+
278
+ // parents differ and can't merge them. Just pack together
279
+ // into array; can't merge.
280
+ // ax + by = [ax,by]
281
+ if (a->returnState > b->returnState) { // sort by payload
282
+ std::vector<size_t> payloads = { b->returnState, a->returnState };
283
+ std::vector<Ref<const PredictionContext>> parents = { b->parent, a->parent };
284
+ auto c = std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
285
+ if (mergeCache) {
286
+ return mergeCache->put(a, b, std::move(c));
287
+ }
288
+ return c;
289
+ }
290
+ std::vector<size_t> payloads = {a->returnState, b->returnState};
291
+ std::vector<Ref<const PredictionContext>> parents = { a->parent, b->parent };
292
+ auto c = std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
293
+ if (mergeCache) {
294
+ return mergeCache->put(a, b, std::move(c));
295
+ }
296
+ return c;
220
297
  }
221
298
 
222
- Ref<PredictionContext> PredictionContext::mergeRoot(const Ref<SingletonPredictionContext> &a,
223
- const Ref<SingletonPredictionContext> &b, bool rootIsWildcard) {
299
+ Ref<const PredictionContext> PredictionContext::mergeRoot(Ref<const SingletonPredictionContext> a, Ref<const SingletonPredictionContext> b,
300
+ bool rootIsWildcard) {
224
301
  if (rootIsWildcard) {
225
302
  if (a == EMPTY) { // * + b = *
226
303
  return EMPTY;
@@ -234,24 +311,22 @@ Ref<PredictionContext> PredictionContext::mergeRoot(const Ref<SingletonPredictio
234
311
  }
235
312
  if (a == EMPTY) { // $ + x = [$,x]
236
313
  std::vector<size_t> payloads = { b->returnState, EMPTY_RETURN_STATE };
237
- std::vector<Ref<PredictionContext>> parents = { b->parent, nullptr };
238
- Ref<PredictionContext> joined = std::make_shared<ArrayPredictionContext>(parents, payloads);
239
- return joined;
314
+ std::vector<Ref<const PredictionContext>> parents = { b->parent, nullptr };
315
+ return std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
240
316
  }
241
317
  if (b == EMPTY) { // x + $ = [$,x] ($ is always first if present)
242
318
  std::vector<size_t> payloads = { a->returnState, EMPTY_RETURN_STATE };
243
- std::vector<Ref<PredictionContext>> parents = { a->parent, nullptr };
244
- Ref<PredictionContext> joined = std::make_shared<ArrayPredictionContext>(parents, payloads);
245
- return joined;
319
+ std::vector<Ref<const PredictionContext>> parents = { a->parent, nullptr };
320
+ return std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
246
321
  }
247
322
  }
248
323
  return nullptr;
249
324
  }
250
325
 
251
- Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionContext> &a,
252
- const Ref<ArrayPredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
326
+ Ref<const PredictionContext> PredictionContext::mergeArrays(Ref<const ArrayPredictionContext> a, Ref<const ArrayPredictionContext> b,
327
+ bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
253
328
 
254
- if (mergeCache != nullptr) {
329
+ if (mergeCache) {
255
330
  auto existing = mergeCache->get(a, b);
256
331
  if (existing) {
257
332
  return existing;
@@ -268,36 +343,33 @@ Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionC
268
343
  size_t k = 0; // walks target M array
269
344
 
270
345
  std::vector<size_t> mergedReturnStates(a->returnStates.size() + b->returnStates.size());
271
- std::vector<Ref<PredictionContext>> mergedParents(a->returnStates.size() + b->returnStates.size());
346
+ std::vector<Ref<const PredictionContext>> mergedParents(a->returnStates.size() + b->returnStates.size());
272
347
 
273
348
  // walk and merge to yield mergedParents, mergedReturnStates
274
349
  while (i < a->returnStates.size() && j < b->returnStates.size()) {
275
- Ref<PredictionContext> a_parent = a->parents[i];
276
- Ref<PredictionContext> b_parent = b->parents[j];
350
+ const auto& parentA = a->parents[i];
351
+ const auto& parentB = b->parents[j];
277
352
  if (a->returnStates[i] == b->returnStates[j]) {
278
353
  // same payload (stack tops are equal), must yield merged singleton
279
354
  size_t payload = a->returnStates[i];
280
355
  // $+$ = $
281
- bool both$ = payload == EMPTY_RETURN_STATE && !a_parent && !b_parent;
282
- bool ax_ax = (a_parent && b_parent) && *a_parent == *b_parent; // ax+ax -> ax
356
+ bool both$ = payload == EMPTY_RETURN_STATE && !parentA && !parentB;
357
+ bool ax_ax = (parentA && parentB) && *parentA == *parentB; // ax+ax -> ax
283
358
  if (both$ || ax_ax) {
284
- mergedParents[k] = a_parent; // choose left
359
+ mergedParents[k] = parentA; // choose left
285
360
  mergedReturnStates[k] = payload;
286
- }
287
- else { // ax+ay -> a'[x,y]
288
- Ref<PredictionContext> mergedParent = merge(a_parent, b_parent, rootIsWildcard, mergeCache);
289
- mergedParents[k] = mergedParent;
361
+ } else { // ax+ay -> a'[x,y]
362
+ mergedParents[k] = merge(parentA, parentB, rootIsWildcard, mergeCache);
290
363
  mergedReturnStates[k] = payload;
291
364
  }
292
365
  i++; // hop over left one as usual
293
366
  j++; // but also skip one in right side since we merge
294
367
  } else if (a->returnStates[i] < b->returnStates[j]) { // copy a[i] to M
295
- mergedParents[k] = a_parent;
368
+ mergedParents[k] = parentA;
296
369
  mergedReturnStates[k] = a->returnStates[i];
297
370
  i++;
298
- }
299
- else { // b > a, copy b[j] to M
300
- mergedParents[k] = b_parent;
371
+ } else { // b > a, copy b[j] to M
372
+ mergedParents[k] = parentB;
301
373
  mergedReturnStates[k] = b->returnStates[j];
302
374
  j++;
303
375
  }
@@ -306,13 +378,13 @@ Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionC
306
378
 
307
379
  // copy over any payloads remaining in either array
308
380
  if (i < a->returnStates.size()) {
309
- for (std::vector<int>::size_type p = i; p < a->returnStates.size(); p++) {
381
+ for (auto p = i; p < a->returnStates.size(); p++) {
310
382
  mergedParents[k] = a->parents[p];
311
383
  mergedReturnStates[k] = a->returnStates[p];
312
384
  k++;
313
385
  }
314
386
  } else {
315
- for (std::vector<int>::size_type p = j; p < b->returnStates.size(); p++) {
387
+ for (auto p = j; p < b->returnStates.size(); p++) {
316
388
  mergedParents[k] = b->parents[p];
317
389
  mergedReturnStates[k] = b->returnStates[p];
318
390
  k++;
@@ -322,63 +394,42 @@ Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionC
322
394
  // trim merged if we combined a few that had same stack tops
323
395
  if (k < mergedParents.size()) { // write index < last position; trim
324
396
  if (k == 1) { // for just one merged element, return singleton top
325
- Ref<PredictionContext> a_ = SingletonPredictionContext::create(mergedParents[0], mergedReturnStates[0]);
326
- if (mergeCache != nullptr) {
327
- mergeCache->put(a, b, a_);
397
+ auto c = SingletonPredictionContext::create(std::move(mergedParents[0]), mergedReturnStates[0]);
398
+ if (mergeCache) {
399
+ return mergeCache->put(a, b, std::move(c));
328
400
  }
329
- return a_;
401
+ return c;
330
402
  }
331
403
  mergedParents.resize(k);
332
404
  mergedReturnStates.resize(k);
333
405
  }
334
406
 
335
- Ref<ArrayPredictionContext> M = std::make_shared<ArrayPredictionContext>(mergedParents, mergedReturnStates);
407
+ ArrayPredictionContext m(std::move(mergedParents), std::move(mergedReturnStates));
336
408
 
337
409
  // if we created same array as a or b, return that instead
338
410
  // TODO: track whether this is possible above during merge sort for speed
339
- if (*M == *a) {
340
- if (mergeCache != nullptr) {
341
- mergeCache->put(a, b, a);
411
+ if (m == *a) {
412
+ if (mergeCache) {
413
+ return mergeCache->put(a, b, a);
342
414
  }
343
415
  return a;
344
416
  }
345
- if (*M == *b) {
346
- if (mergeCache != nullptr) {
347
- mergeCache->put(a, b, b);
417
+ if (m == *b) {
418
+ if (mergeCache) {
419
+ return mergeCache->put(a, b, b);
348
420
  }
349
421
  return b;
350
422
  }
351
423
 
352
- // ml: this part differs from Java code. We have to recreate the context as the parents array is copied on creation.
353
- if (combineCommonParents(mergedParents)) {
354
- mergedReturnStates.resize(mergedParents.size());
355
- M = std::make_shared<ArrayPredictionContext>(mergedParents, mergedReturnStates);
356
- }
357
-
358
- if (mergeCache != nullptr) {
359
- mergeCache->put(a, b, M);
360
- }
361
- return M;
362
- }
363
-
364
- bool PredictionContext::combineCommonParents(std::vector<Ref<PredictionContext>> &parents) {
365
-
366
- std::set<Ref<PredictionContext>> uniqueParents;
367
- for (size_t p = 0; p < parents.size(); ++p) {
368
- Ref<PredictionContext> parent = parents[p];
369
- if (uniqueParents.find(parent) == uniqueParents.end()) { // don't replace
370
- uniqueParents.insert(parent);
371
- }
372
- }
373
-
374
- for (size_t p = 0; p < parents.size(); ++p) {
375
- parents[p] = *uniqueParents.find(parents[p]);
424
+ combineCommonParents(m.parents);
425
+ auto c = std::make_shared<ArrayPredictionContext>(std::move(m));
426
+ if (mergeCache) {
427
+ return mergeCache->put(a, b, std::move(c));
376
428
  }
377
-
378
- return true;
429
+ return c;
379
430
  }
380
431
 
381
- std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context) {
432
+ std::string PredictionContext::toDOTString(const Ref<const PredictionContext> &context) {
382
433
  if (context == nullptr) {
383
434
  return "";
384
435
  }
@@ -386,24 +437,23 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
386
437
  std::stringstream ss;
387
438
  ss << "digraph G {\n" << "rankdir=LR;\n";
388
439
 
389
- std::vector<Ref<PredictionContext>> nodes = getAllContextNodes(context);
390
- std::sort(nodes.begin(), nodes.end(), [](const Ref<PredictionContext> &o1, const Ref<PredictionContext> &o2) {
391
- return o1->id - o2->id;
392
- });
440
+ std::vector<Ref<const PredictionContext>> nodes = getAllContextNodes(context);
441
+ std::unordered_map<const PredictionContext*, size_t> nodeIds;
442
+ size_t nodeId = 0;
393
443
 
394
- for (auto current : nodes) {
395
- if (is<SingletonPredictionContext>(current)) {
396
- std::string s = std::to_string(current->id);
444
+ for (const auto &current : nodes) {
445
+ if (current->getContextType() == PredictionContextType::SINGLETON) {
446
+ std::string s = std::to_string(insertOrAssignNodeId(nodeIds, nodeId, current.get()));
397
447
  ss << " s" << s;
398
448
  std::string returnState = std::to_string(current->getReturnState(0));
399
- if (is<EmptyPredictionContext>(current)) {
449
+ if (current == PredictionContext::EMPTY) {
400
450
  returnState = "$";
401
451
  }
402
452
  ss << " [label=\"" << returnState << "\"];\n";
403
453
  continue;
404
454
  }
405
- Ref<ArrayPredictionContext> arr = std::static_pointer_cast<ArrayPredictionContext>(current);
406
- ss << " s" << arr->id << " [shape=box, label=\"" << "[";
455
+ Ref<const ArrayPredictionContext> arr = std::static_pointer_cast<const ArrayPredictionContext>(current);
456
+ ss << " s" << insertOrAssignNodeId(nodeIds, nodeId, arr.get()) << " [shape=box, label=\"" << "[";
407
457
  bool first = true;
408
458
  for (auto inv : arr->returnStates) {
409
459
  if (!first) {
@@ -420,7 +470,7 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
420
470
  ss << "\"];\n";
421
471
  }
422
472
 
423
- for (auto current : nodes) {
473
+ for (const auto &current : nodes) {
424
474
  if (current == EMPTY) {
425
475
  continue;
426
476
  }
@@ -428,7 +478,7 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
428
478
  if (!current->getParent(i)) {
429
479
  continue;
430
480
  }
431
- ss << " s" << current->id << "->" << "s" << current->getParent(i)->id;
481
+ ss << " s" << insertOrAssignNodeId(nodeIds, nodeId, current.get()) << "->" << "s" << insertOrAssignNodeId(nodeIds, nodeId, current->getParent(i).get());
432
482
  if (current->size() > 1) {
433
483
  ss << " [label=\"parent[" << i << "]\"];\n";
434
484
  } else {
@@ -442,112 +492,31 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
442
492
  }
443
493
 
444
494
  // The "visited" map is just a temporary structure to control the retrieval process (which is recursive).
445
- Ref<PredictionContext> PredictionContext::getCachedContext(const Ref<PredictionContext> &context,
446
- PredictionContextCache &contextCache, std::map<Ref<PredictionContext>, Ref<PredictionContext>> &visited) {
447
- if (context->isEmpty()) {
448
- return context;
449
- }
450
-
451
- {
452
- auto iterator = visited.find(context);
453
- if (iterator != visited.end())
454
- return iterator->second; // Not necessarly the same as context.
455
- }
456
-
457
- auto iterator = contextCache.find(context);
458
- if (iterator != contextCache.end()) {
459
- visited[context] = *iterator;
460
-
461
- return *iterator;
462
- }
463
-
464
- bool changed = false;
465
-
466
- std::vector<Ref<PredictionContext>> parents(context->size());
467
- for (size_t i = 0; i < parents.size(); i++) {
468
- Ref<PredictionContext> parent = getCachedContext(context->getParent(i), contextCache, visited);
469
- if (changed || parent != context->getParent(i)) {
470
- if (!changed) {
471
- parents.clear();
472
- for (size_t j = 0; j < context->size(); j++) {
473
- parents.push_back(context->getParent(j));
474
- }
475
-
476
- changed = true;
477
- }
478
-
479
- parents[i] = parent;
480
- }
481
- }
482
-
483
- if (!changed) {
484
- contextCache.insert(context);
485
- visited[context] = context;
486
-
487
- return context;
488
- }
489
-
490
- Ref<PredictionContext> updated;
491
- if (parents.empty()) {
492
- updated = EMPTY;
493
- } else if (parents.size() == 1) {
494
- updated = SingletonPredictionContext::create(parents[0], context->getReturnState(0));
495
- contextCache.insert(updated);
496
- } else {
497
- updated = std::make_shared<ArrayPredictionContext>(parents, std::dynamic_pointer_cast<ArrayPredictionContext>(context)->returnStates);
498
- contextCache.insert(updated);
499
- }
500
-
501
- visited[updated] = updated;
502
- visited[context] = updated;
503
-
504
- return updated;
495
+ Ref<const PredictionContext> PredictionContext::getCachedContext(const Ref<const PredictionContext> &context,
496
+ PredictionContextCache &contextCache) {
497
+ std::unordered_map<Ref<const PredictionContext>, Ref<const PredictionContext>> visited;
498
+ return getCachedContextImpl(context, contextCache, visited);
505
499
  }
506
500
 
507
- std::vector<Ref<PredictionContext>> PredictionContext::getAllContextNodes(const Ref<PredictionContext> &context) {
508
- std::vector<Ref<PredictionContext>> nodes;
509
- std::set<PredictionContext *> visited;
510
- getAllContextNodes_(context, nodes, visited);
501
+ std::vector<Ref<const PredictionContext>> PredictionContext::getAllContextNodes(const Ref<const PredictionContext> &context) {
502
+ std::vector<Ref<const PredictionContext>> nodes;
503
+ std::unordered_set<const PredictionContext*> visited;
504
+ getAllContextNodesImpl(context, nodes, visited);
511
505
  return nodes;
512
506
  }
513
507
 
514
-
515
- void PredictionContext::getAllContextNodes_(const Ref<PredictionContext> &context, std::vector<Ref<PredictionContext>> &nodes,
516
- std::set<PredictionContext *> &visited) {
517
-
518
- if (visited.find(context.get()) != visited.end()) {
519
- return; // Already done.
520
- }
521
-
522
- visited.insert(context.get());
523
- nodes.push_back(context);
524
-
525
- for (size_t i = 0; i < context->size(); i++) {
526
- getAllContextNodes_(context->getParent(i), nodes, visited);
527
- }
528
- }
529
-
530
- std::string PredictionContext::toString() const {
531
-
532
- return antlrcpp::toString(this);
533
- }
534
-
535
- std::string PredictionContext::toString(Recognizer * /*recog*/) const {
536
- return toString();
537
- }
538
-
539
- std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, int currentState) {
508
+ std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, int currentState) const {
540
509
  return toStrings(recognizer, EMPTY, currentState);
541
510
  }
542
511
 
543
- std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, const Ref<PredictionContext> &stop, int currentState) {
512
+ std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, const Ref<const PredictionContext> &stop, int currentState) const {
544
513
 
545
514
  std::vector<std::string> result;
546
515
 
547
516
  for (size_t perm = 0; ; perm++) {
548
517
  size_t offset = 0;
549
518
  bool last = true;
550
- PredictionContext *p = this;
519
+ const PredictionContext *p = this;
551
520
  size_t stateNumber = currentState;
552
521
 
553
522
  std::stringstream ss;
@@ -608,55 +577,3 @@ std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, co
608
577
 
609
578
  return result;
610
579
  }
611
-
612
- //----------------- PredictionContextMergeCache ------------------------------------------------------------------------
613
-
614
- Ref<PredictionContext> PredictionContextMergeCache::put(Ref<PredictionContext> const& key1, Ref<PredictionContext> const& key2,
615
- Ref<PredictionContext> const& value) {
616
- Ref<PredictionContext> previous;
617
-
618
- auto iterator = _data.find(key1);
619
- if (iterator == _data.end())
620
- _data[key1][key2] = value;
621
- else {
622
- auto iterator2 = iterator->second.find(key2);
623
- if (iterator2 != iterator->second.end())
624
- previous = iterator2->second;
625
- iterator->second[key2] = value;
626
- }
627
-
628
- return previous;
629
- }
630
-
631
- Ref<PredictionContext> PredictionContextMergeCache::get(Ref<PredictionContext> const& key1, Ref<PredictionContext> const& key2) {
632
- auto iterator = _data.find(key1);
633
- if (iterator == _data.end())
634
- return nullptr;
635
-
636
- auto iterator2 = iterator->second.find(key2);
637
- if (iterator2 == iterator->second.end())
638
- return nullptr;
639
-
640
- return iterator2->second;
641
- }
642
-
643
- void PredictionContextMergeCache::clear() {
644
- _data.clear();
645
- }
646
-
647
- std::string PredictionContextMergeCache::toString() const {
648
- std::string result;
649
- for (auto pair : _data)
650
- for (auto pair2 : pair.second)
651
- result += pair2.second->toString() + "\n";
652
-
653
- return result;
654
- }
655
-
656
- size_t PredictionContextMergeCache::count() const {
657
- size_t result = 0;
658
- for (auto entry : _data)
659
- result += entry.second.size();
660
- return result;
661
- }
662
-