1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeaudeclare(strict_types=1); 4*37748cd8SNickeau 5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\PredictionContexts; 6*37748cd8SNickeau 7*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Utils\Map; 8*37748cd8SNickeau 9*37748cd8SNickeau/** 10*37748cd8SNickeau * Used to cache {@see PredictionContext} objects. Its used for the shared 11*37748cd8SNickeau * context cash associated with contexts in DFA states. This cache 12*37748cd8SNickeau * can be used for both lexers and parsers. 13*37748cd8SNickeau */ 14*37748cd8SNickeauclass PredictionContextCache 15*37748cd8SNickeau{ 16*37748cd8SNickeau /** @var Map */ 17*37748cd8SNickeau protected $cache; 18*37748cd8SNickeau 19*37748cd8SNickeau public function __construct() 20*37748cd8SNickeau { 21*37748cd8SNickeau $this->cache = new Map(); 22*37748cd8SNickeau } 23*37748cd8SNickeau 24*37748cd8SNickeau /** 25*37748cd8SNickeau * Add a context to the cache and return it. If the context already exists, 26*37748cd8SNickeau * return that one instead and do not add a new context to the cache. 27*37748cd8SNickeau * Protect shared cache from unsafe thread access. 28*37748cd8SNickeau */ 29*37748cd8SNickeau public function add(PredictionContext $ctx) : PredictionContext 30*37748cd8SNickeau { 31*37748cd8SNickeau if ($ctx === PredictionContext::empty()) { 32*37748cd8SNickeau return $ctx; 33*37748cd8SNickeau } 34*37748cd8SNickeau 35*37748cd8SNickeau $existing = $this->cache->get($ctx); 36*37748cd8SNickeau 37*37748cd8SNickeau if ($existing !== null) { 38*37748cd8SNickeau return $existing; 39*37748cd8SNickeau } 40*37748cd8SNickeau 41*37748cd8SNickeau $this->cache->put($ctx, $ctx); 42*37748cd8SNickeau 43*37748cd8SNickeau return $ctx; 44*37748cd8SNickeau } 45*37748cd8SNickeau 46*37748cd8SNickeau public function get(PredictionContext $ctx) : ?PredictionContext 47*37748cd8SNickeau { 48*37748cd8SNickeau return $this->cache->get($ctx); 49*37748cd8SNickeau } 50*37748cd8SNickeau 51*37748cd8SNickeau public function length() : int 52*37748cd8SNickeau { 53*37748cd8SNickeau return $this->cache->count(); 54*37748cd8SNickeau } 55*37748cd8SNickeau} 56