1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeaudeclare(strict_types=1); 4*37748cd8SNickeau 5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\Utils; 6*37748cd8SNickeau 7*37748cd8SNickeaufinal class DoubleKeyMap 8*37748cd8SNickeau{ 9*37748cd8SNickeau /** 10*37748cd8SNickeau * Map<primaryKey, Map<secondaryKey, value>> 11*37748cd8SNickeau * 12*37748cd8SNickeau * @var Map 13*37748cd8SNickeau */ 14*37748cd8SNickeau private $data; 15*37748cd8SNickeau 16*37748cd8SNickeau public function __construct() 17*37748cd8SNickeau { 18*37748cd8SNickeau $this->data = new Map(); 19*37748cd8SNickeau } 20*37748cd8SNickeau 21*37748cd8SNickeau /** 22*37748cd8SNickeau * @param mixed $primaryKey 23*37748cd8SNickeau * @param mixed $secondaryKey 24*37748cd8SNickeau * @param mixed $value 25*37748cd8SNickeau */ 26*37748cd8SNickeau public function set($primaryKey, $secondaryKey, $value) : void 27*37748cd8SNickeau { 28*37748cd8SNickeau $secondaryData = $this->data->get($primaryKey); 29*37748cd8SNickeau 30*37748cd8SNickeau if ($secondaryData === null) { 31*37748cd8SNickeau $secondaryData = new Map(); 32*37748cd8SNickeau 33*37748cd8SNickeau $this->data->put($primaryKey, $secondaryData); 34*37748cd8SNickeau } 35*37748cd8SNickeau 36*37748cd8SNickeau $secondaryData->put($secondaryKey, $value); 37*37748cd8SNickeau } 38*37748cd8SNickeau 39*37748cd8SNickeau /** 40*37748cd8SNickeau * @param mixed $primaryKey 41*37748cd8SNickeau * @param mixed $secondaryKey 42*37748cd8SNickeau * 43*37748cd8SNickeau * @return mixed 44*37748cd8SNickeau */ 45*37748cd8SNickeau public function getByTwoKeys($primaryKey, $secondaryKey) 46*37748cd8SNickeau { 47*37748cd8SNickeau $data2 = $this->data->get($primaryKey); 48*37748cd8SNickeau 49*37748cd8SNickeau if ($data2 === null) { 50*37748cd8SNickeau return null; 51*37748cd8SNickeau } 52*37748cd8SNickeau 53*37748cd8SNickeau return $data2->get($secondaryKey); 54*37748cd8SNickeau } 55*37748cd8SNickeau 56*37748cd8SNickeau /** 57*37748cd8SNickeau * @param mixed $primaryKey 58*37748cd8SNickeau */ 59*37748cd8SNickeau public function getByOneKey($primaryKey) : Map 60*37748cd8SNickeau { 61*37748cd8SNickeau return $this->data->get($primaryKey); 62*37748cd8SNickeau } 63*37748cd8SNickeau 64*37748cd8SNickeau /** 65*37748cd8SNickeau * @param mixed $primaryKey 66*37748cd8SNickeau * 67*37748cd8SNickeau * @return array<mixed>|null 68*37748cd8SNickeau */ 69*37748cd8SNickeau public function values($primaryKey) : ?array 70*37748cd8SNickeau { 71*37748cd8SNickeau $secondaryData = $this->data->get($primaryKey); 72*37748cd8SNickeau 73*37748cd8SNickeau if ($secondaryData === null) { 74*37748cd8SNickeau return null; 75*37748cd8SNickeau } 76*37748cd8SNickeau 77*37748cd8SNickeau return $secondaryData->getValues(); 78*37748cd8SNickeau } 79*37748cd8SNickeau 80*37748cd8SNickeau /** 81*37748cd8SNickeau * @return array<mixed> 82*37748cd8SNickeau */ 83*37748cd8SNickeau public function primaryKeys() : array 84*37748cd8SNickeau { 85*37748cd8SNickeau return $this->data->getKeys(); 86*37748cd8SNickeau } 87*37748cd8SNickeau 88*37748cd8SNickeau /** 89*37748cd8SNickeau * @param mixed $primaryKey 90*37748cd8SNickeau * 91*37748cd8SNickeau * @return array<mixed>|null 92*37748cd8SNickeau */ 93*37748cd8SNickeau public function secondaryKeys($primaryKey) : ?array 94*37748cd8SNickeau { 95*37748cd8SNickeau $secondaryData = $this->data->get($primaryKey); 96*37748cd8SNickeau 97*37748cd8SNickeau if ($secondaryData === null) { 98*37748cd8SNickeau return null; 99*37748cd8SNickeau } 100*37748cd8SNickeau 101*37748cd8SNickeau return $secondaryData->getKeys(); 102*37748cd8SNickeau } 103*37748cd8SNickeau} 104