* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace Fidry\CpuCoreCounter; use Fidry\CpuCoreCounter\Finder\CpuCoreFinder; use Fidry\CpuCoreCounter\Finder\FinderRegistry; final class CpuCoreCounter { /** * @var list */ private $finders; /** * @var positive-int|null */ private $count; /** * @param list|null $finders */ public function __construct(?array $finders = null) { $this->finders = $finders ?? FinderRegistry::getDefaultLogicalFinders(); } /** * @throws NumberOfCpuCoreNotFound * * @return positive-int */ public function getCount(): int { // Memoize result if (null === $this->count) { $this->count = $this->findCount(); } return $this->count; } /** * @throws NumberOfCpuCoreNotFound * * @return positive-int */ private function findCount(): int { foreach ($this->finders as $finder) { $cores = $finder->find(); if (null !== $cores) { return $cores; } } throw NumberOfCpuCoreNotFound::create(); } /** * @throws NumberOfCpuCoreNotFound * * @return array{CpuCoreFinder, positive-int} */ public function getFinderAndCores(): array { foreach ($this->finders as $finder) { $cores = $finder->find(); if (null !== $cores) { return [$finder, $cores]; } } throw NumberOfCpuCoreNotFound::create(); } }