xref: /plugin/combo/vendor/antlr/antlr4-php-runtime/src/PredictionContexts/PredictionContextCache.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
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