forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
68 lines
1.3 KiB
PHP
68 lines
1.3 KiB
PHP
<?php declare(strict_types=1);
|
|
/**
|
|
* This file is part of the Phootwork package.
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*
|
|
* @license MIT License
|
|
* @copyright Thomas Gossmann
|
|
*/
|
|
namespace phootwork\lang\parts;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
/**
|
|
* Internal Text methods
|
|
*
|
|
* @author Thomas Gossmann
|
|
* @author Cristiano Cinotti
|
|
*/
|
|
trait InternalPart {
|
|
abstract public function length(): int;
|
|
|
|
/**
|
|
* @internal
|
|
*
|
|
* @param int $offset
|
|
*
|
|
* @return int
|
|
*/
|
|
protected function prepareOffset(int $offset): int {
|
|
$len = $this->length();
|
|
if ($offset < -$len || $offset > $len) {
|
|
throw new InvalidArgumentException("Offset must be in range [-$len, $len]");
|
|
}
|
|
|
|
if ($offset < 0) {
|
|
$offset += $len;
|
|
}
|
|
|
|
return $offset;
|
|
}
|
|
|
|
/**
|
|
* @param int $offset
|
|
* @param int|null $length
|
|
*
|
|
* @return int
|
|
*
|
|
* @internal
|
|
*
|
|
*/
|
|
protected function prepareLength(int $offset, ?int $length): int {
|
|
$length = (null === $length) ? ($this->length() - $offset) : (
|
|
($length < 0) ? ($length + $this->length() - $offset) : $length
|
|
);
|
|
|
|
if ($length < 0) {
|
|
throw new InvalidArgumentException('Length too small');
|
|
}
|
|
|
|
if ($offset + $length > $this->length()) {
|
|
throw new InvalidArgumentException('Length too large');
|
|
}
|
|
|
|
return $length;
|
|
}
|
|
}
|