Refactored Comparators instructions and added documentation

This commit is contained in:
Netkas 2022-12-30 03:01:38 -05:00
parent f071d1dc72
commit 671958063c
12 changed files with 321 additions and 71 deletions

View file

@ -1,11 +1,11 @@
# equals # eq
Returns true if the two values are equal, false otherwise. Returns true if the two values are equal, false otherwise.
## Parameters ## Parameters
* a (`integer`, `float`, `double`, `string`, `boolean`, `instruction`) - The first value to compare. * a (`integer`, `float`, `double`, `string`, `boolean`) - The first value to compare.
* b (`integer`, `float`, `double`, `string`, `boolean`, `instruction`) - The second value to compare. * b (`integer`, `float`, `double`, `string`, `boolean`) - The second value to compare.
## Return ## Return
@ -21,7 +21,7 @@ Returns true if the two values are equal, false otherwise.
```json ```json
{ {
"type": "equals", "type": "eq",
"_": { "_": {
"a": "foo", "a": "foo",
"b": "foo" "b": "foo"
@ -31,5 +31,5 @@ Returns true if the two values are equal, false otherwise.
### Last Updated ### Last Updated
Monday, December 29th, 2022. Monday, December 30th, 2022.
Written by [Netkas](https://git.n64.cc/netkas) Written by [Netkas](https://git.n64.cc/netkas)

View file

@ -1,11 +1,11 @@
# greater_than # gt
Returns true if the first argument is greater than the second argument. Returns true if the first argument is greater than the second argument.
## Parameters ## Parameters
* a (`integer`, `float`, `double`, `instruction`) - The first number. * a (`integer`, `float`, `double`) - The first number.
* b (`integer`, `float`, `double`, `instruction`) - The second number. * b (`integer`, `float`, `double`) - The second number.
## Return ## Return
@ -20,7 +20,7 @@ Returns true if the first argument is greater than the second argument.
```json ```json
{ {
"type": "greater_than", "type": "gt",
"_": { "_": {
"a": 10, "a": 10,
"b": 2 "b": 2
@ -30,5 +30,5 @@ Returns true if the first argument is greater than the second argument.
### Last Updated ### Last Updated
Monday, December 29th, 2022. Monday, December 30th, 2022.
Written by [Netkas](https://git.n64.cc/netkas) Written by [Netkas](https://git.n64.cc/netkas)

View file

@ -1,11 +1,11 @@
# greater_than_or_equals # gte
Returns true if the first argument is greater than or equal to the second argument. Returns true if the first argument is greater than or equal to the second argument.
## Parameters ## Parameters
* a (`integer`, `float`, `double`, `instruction`) - The first number. * a (`integer`, `float`, `double`) - The first number.
* b (`integer`, `float`, `double`, `instruction`) - The second number. * b (`integer`, `float`, `double`) - The second number.
## Return ## Return
@ -20,7 +20,7 @@ Returns true if the first argument is greater than or equal to the second argume
```json ```json
{ {
"type": "greater_than_or_equals", "type": "gte",
"_": { "_": {
"a": 10, "a": 10,
"b": 2 "b": 2
@ -30,5 +30,5 @@ Returns true if the first argument is greater than or equal to the second argume
### Last Updated ### Last Updated
Monday, December 29th, 2022. Monday, December 30th, 2022.
Written by [Netkas](https://git.n64.cc/netkas) Written by [Netkas](https://git.n64.cc/netkas)

View file

@ -0,0 +1,34 @@
# lt
Returns true if the first argument is less than the second argument.
## Parameters
* a (`integer`, `float`, `double`) - The first number.
* b (`integer`, `float`, `double`) - The second number.
## Return
(`boolean`) - True if the first argument is less than the second argument.
## Exceptions
* `EvaluationException` - If there was an error while evaluating one or more parameters.
* `TypeException` - If one or more parameters are not of the expected type.
## Instruction Example
```json
{
"type": "lt",
"_": {
"a": 10,
"b": 2
}
}
```
### Last Updated
Monday, December 30th, 2022.
Written by [Netkas](https://git.n64.cc/netkas)

View file

@ -0,0 +1,34 @@
# lte
Returns true if the first argument is less than or equal to the second argument.
## Parameters
* a (`integer`, `float`, `double`) - The first number.
* b (`integer`, `float`, `double`) - The second number.
## Return
(`boolean`) - True if the first argument is less than or equal to the second argument.
## Exceptions
* `EvaluationException` - If there was an error while evaluating one or more parameters.
* `TypeException` - If one or more parameters are not of the expected type.
## Instruction Example
```json
{
"type": "lte",
"_": {
"a": 10,
"b": 2
}
}
```
### Last Updated
Monday, December 30th, 2022.
Written by [Netkas](https://git.n64.cc/netkas)

View file

@ -0,0 +1,35 @@
# neq
Returns true if the first argument is not equal to the second argument.
## Parameters
* a (`integer`, `float`, `double`, `string`, `boolean`) - The first value to compare.
* b (`integer`, `float`, `double`, `string`, `boolean`) - The second value to compare.
## Return
(`boolean`) - True if the first argument is not equal to the second argument.
## Exceptions
* `EvaluationException` - If there was an error while evaluating one or more parameters.
* `TypeException` - If one or more parameters are not of the expected type.
## Instruction Example
```json
{
"type": "neq",
"_": {
"a": "foo",
"b": "foo"
}
}
```
### Last Updated
Monday, December 30th, 2022.
Written by [Netkas](https://git.n64.cc/netkas)

View file

@ -2,7 +2,7 @@
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
namespace RTEX\Objects\Program\Instructions; namespace RTEX\Objects\Program\Instructions\Comparators;
use RTEX\Abstracts\InstructionType; use RTEX\Abstracts\InstructionType;
use RTEX\Classes\InstructionBuilder; use RTEX\Classes\InstructionBuilder;
@ -83,7 +83,7 @@
public function __toString(): string public function __toString(): string
{ {
return sprintf( return sprintf(
self::getType() . ' (%s==%s)', self::getType() . ' %s == %s',
Utilities::entityToString($this->A), Utilities::entityToString($this->A),
Utilities::entityToString($this->B) Utilities::entityToString($this->B)
); );

View file

@ -2,7 +2,7 @@
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
namespace RTEX\Objects\Program\Instructions; namespace RTEX\Objects\Program\Instructions\Comparators;
use RTEX\Abstracts\InstructionType; use RTEX\Abstracts\InstructionType;
use RTEX\Classes\InstructionBuilder; use RTEX\Classes\InstructionBuilder;
@ -65,21 +65,22 @@
/** /**
* @param Engine $engine * @param Engine $engine
* @return int * @return bool
* @throws EvaluationException * @throws EvaluationException
* @throws TypeException * @throws TypeException
*/ */
public function eval(Engine $engine): int public function eval(Engine $engine): bool
{ {
/** @noinspection DuplicatedCode */
$a = $engine->eval($this->A); $a = $engine->eval($this->A);
$b = $engine->eval($this->B); $b = $engine->eval($this->B);
if (!is_numeric($a)) if (!(is_int($a) || is_float($a)) || is_double($a))
throw new TypeException(sprintf('Parameter "a" must be numeric, %s given', Utilities::getType($a))); throw new TypeException(sprintf('Cannot compare a non-numeric value \'A\' of type \'%s\'', Utilities::getType($a, true)));
if (!is_numeric($b)) if (!(is_int($b) || is_float($b)) || is_double($b))
throw new TypeException(sprintf('Parameter "b" must be numeric, %s given', Utilities::getType($b))); throw new TypeException(sprintf('Cannot compare a non-numeric value \'B\' of type \'%s\'', Utilities::getType($b, true)));
return (intval($engine->eval($this->A)) > intval($engine->eval($this->B))); return ($a > $b);
} }
/** /**
@ -90,7 +91,7 @@
public function __toString(): string public function __toString(): string
{ {
return sprintf( return sprintf(
self::getType() . ' (%s>%s)', self::getType() . ' %s > %s',
Utilities::entityToString($this->A), Utilities::entityToString($this->A),
Utilities::entityToString($this->B) Utilities::entityToString($this->B)
); );

View file

@ -2,7 +2,7 @@
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
namespace RTEX\Objects\Program\Instructions; namespace RTEX\Objects\Program\Instructions\Comparators;
use RTEX\Abstracts\InstructionType; use RTEX\Abstracts\InstructionType;
use RTEX\Classes\InstructionBuilder; use RTEX\Classes\InstructionBuilder;
@ -65,21 +65,22 @@
/** /**
* @param Engine $engine * @param Engine $engine
* @return int * @return bool
* @throws TypeException
* @throws EvaluationException * @throws EvaluationException
* @throws TypeException
*/ */
public function eval(Engine $engine): int public function eval(Engine $engine): bool
{ {
/** @noinspection DuplicatedCode */
$a = $engine->eval($this->A); $a = $engine->eval($this->A);
$b = $engine->eval($this->B); $b = $engine->eval($this->B);
if (!is_numeric($a)) if (!(is_int($a) || is_float($a)) || is_double($a))
throw new TypeException(sprintf('Parameter "a" must be numeric, %s given', Utilities::getType($a))); throw new TypeException(sprintf('Cannot compare a non-numeric value \'A\' of type \'%s\'', Utilities::getType($a, true)));
if (!is_numeric($b)) if (!(is_int($b) || is_float($b)) || is_double($b))
throw new TypeException(sprintf('Parameter "b" must be numeric, %s given', Utilities::getType($b))); throw new TypeException(sprintf('Cannot compare a non-numeric value \'B\' of type \'%s\'', Utilities::getType($b, true)));
return (intval($engine->eval($this->A)) >= intval($engine->eval($this->B))); return ($a >= $b);
} }
/** /**
@ -90,7 +91,7 @@
public function __toString(): string public function __toString(): string
{ {
return sprintf( return sprintf(
self::getType() . ' (%s>=%s)', self::getType() . ' %s >= %s',
Utilities::entityToString($this->A), Utilities::entityToString($this->A),
Utilities::entityToString($this->B) Utilities::entityToString($this->B)
); );

View file

@ -0,0 +1,141 @@
<?php
/** @noinspection PhpMissingFieldTypeInspection */
namespace RTEX\Objects\Program\Instructions\Comparators;
use RTEX\Abstracts\InstructionType;
use RTEX\Classes\InstructionBuilder;
use RTEX\Classes\Utilities;
use RTEX\Engine;
use RTEX\Exceptions\EvaluationException;
use RTEX\Exceptions\InstructionException;
use RTEX\Exceptions\Runtime\TypeException;
use RTEX\Interfaces\InstructionInterface;
class LessThan implements InstructionInterface
{
/**
* @var mixed
*/
private $A;
/**
* @var mixed
*/
private $B;
/**
* Returns the type of instruction
*
* @return string
*/
public function getType(): string
{
return InstructionType::LessThan;
}
/**
* Returns an array representation of the instruction
*
* @return array
*/
public function toArray(): array
{
return InstructionBuilder::toRaw(self::getType(), [
'a' => $this->A,
'b' => $this->B
]);
}
/**
* Constructs a new instance of this class from an array representation
*
* @param array $data
* @return InstructionInterface
* @throws InstructionException
*/
public static function fromArray(array $data): InstructionInterface
{
$instruction = new self();
$instruction->setA($data['a'] ?? null);
$instruction->setB($data['b'] ?? null);
return $instruction;
}
/**
* @param Engine $engine
* @return bool
* @throws EvaluationException
* @throws TypeException
*/
public function eval(Engine $engine): bool
{
/** @noinspection DuplicatedCode */
$a = $engine->eval($this->A);
$b = $engine->eval($this->B);
if (!(is_int($a) || is_float($a)) || is_double($a))
throw new TypeException(sprintf('Cannot compare a non-numeric value \'A\' of type \'%s\'', Utilities::getType($a, true)));
if (!(is_int($b) || is_float($b)) || is_double($b))
throw new TypeException(sprintf('Cannot compare a non-numeric value \'B\' of type \'%s\'', Utilities::getType($b, true)));
return ($a < $b);
}
/**
* Returns the string representation of the instruction
*
* @return string
*/
public function __toString(): string
{
return sprintf(
self::getType() . ' %s < %s',
Utilities::entityToString($this->A),
Utilities::entityToString($this->B)
);
}
/**
* Gets the value of A
*
* @return mixed
*/
public function getA(): mixed
{
return $this->A;
}
/**
* Sets the value of A
*
* @param mixed $A
* @throws InstructionException
*/
public function setA(mixed $A): void
{
$this->A = InstructionBuilder::fromRaw($A);
}
/**
* Gets the value of B
*
* @return mixed
*/
public function getB(): mixed
{
return $this->B;
}
/**
* Sets the value of B
*
* @param mixed $B
* @throws InstructionException
*/
public function setB(mixed $B): void
{
$this->B = InstructionBuilder::fromRaw($B);
}
}

View file

@ -2,14 +2,15 @@
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
namespace RTEX\Objects\Program\Instructions; namespace RTEX\Objects\Program\Instructions\Comparators;
use RTEX\Abstracts\InstructionType; use RTEX\Abstracts\InstructionType;
use RTEX\Classes\InstructionBuilder; use RTEX\Classes\InstructionBuilder;
use RTEX\Classes\Utilities; use RTEX\Classes\Utilities;
use RTEX\Engine; use RTEX\Engine;
use RTEX\Exceptions\Core\MalformedInstructionException; use RTEX\Exceptions\EvaluationException;
use RTEX\Exceptions\Core\UnsupportedVariableType; use RTEX\Exceptions\InstructionException;
use RTEX\Exceptions\Runtime\TypeException;
use RTEX\Interfaces\InstructionInterface; use RTEX\Interfaces\InstructionInterface;
class LessThanOrEquals implements InstructionInterface class LessThanOrEquals implements InstructionInterface
@ -31,14 +32,13 @@
*/ */
public function getType(): string public function getType(): string
{ {
return InstructionType::Divide; return InstructionType::LessThanOrEquals;
} }
/** /**
* Returns an array representation of the instruction * Returns an array representation of the instruction
* *
* @return array * @return array
* @throws UnsupportedVariableType
*/ */
public function toArray(): array public function toArray(): array
{ {
@ -53,8 +53,7 @@
* *
* @param array $data * @param array $data
* @return InstructionInterface * @return InstructionInterface
* @throws MalformedInstructionException * @throws InstructionException
* @throws UnsupportedVariableType
*/ */
public static function fromArray(array $data): InstructionInterface public static function fromArray(array $data): InstructionInterface
{ {
@ -66,24 +65,33 @@
/** /**
* @param Engine $engine * @param Engine $engine
* @return int * @return bool
* @throws UnsupportedVariableType * @throws EvaluationException
* @throws TypeException
*/ */
public function eval(Engine $engine): int public function eval(Engine $engine): bool
{ {
return (intval($engine->eval($this->A)) <= intval($engine->eval($this->B))); /** @noinspection DuplicatedCode */
$a = $engine->eval($this->A);
$b = $engine->eval($this->B);
if (!(is_int($a) || is_float($a)) || is_double($a))
throw new TypeException(sprintf('Cannot compare a non-numeric value \'A\' of type \'%s\'', Utilities::getType($a, true)));
if (!(is_int($b) || is_float($b)) || is_double($b))
throw new TypeException(sprintf('Cannot compare a non-numeric value \'B\' of type \'%s\'', Utilities::getType($b, true)));
return ($a <= $b);
} }
/** /**
* Returns the string representation of the instruction * Returns the string representation of the instruction
* *
* @return string * @return string
* @throws UnsupportedVariableType
*/ */
public function __toString(): string public function __toString(): string
{ {
return sprintf( return sprintf(
self::getType() . ' (%s<=%s)', self::getType() . ' %s <= %s',
Utilities::entityToString($this->A), Utilities::entityToString($this->A),
Utilities::entityToString($this->B) Utilities::entityToString($this->B)
); );
@ -103,8 +111,7 @@
* Sets the value of A * Sets the value of A
* *
* @param mixed $A * @param mixed $A
* @throws UnsupportedVariableType * @throws InstructionException
* @throws MalformedInstructionException
*/ */
public function setA(mixed $A): void public function setA(mixed $A): void
{ {
@ -125,8 +132,7 @@
* Sets the value of B * Sets the value of B
* *
* @param mixed $B * @param mixed $B
* @throws MalformedInstructionException * @throws InstructionException
* @throws UnsupportedVariableType
*/ */
public function setB(mixed $B): void public function setB(mixed $B): void
{ {

View file

@ -2,17 +2,17 @@
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
namespace RTEX\Objects\Program\Instructions; namespace RTEX\Objects\Program\Instructions\Comparators;
use RTEX\Abstracts\InstructionType; use RTEX\Abstracts\InstructionType;
use RTEX\Classes\InstructionBuilder; use RTEX\Classes\InstructionBuilder;
use RTEX\Classes\Utilities; use RTEX\Classes\Utilities;
use RTEX\Engine; use RTEX\Engine;
use RTEX\Exceptions\Core\MalformedInstructionException; use RTEX\Exceptions\EvaluationException;
use RTEX\Exceptions\Core\UnsupportedVariableType; use RTEX\Exceptions\InstructionException;
use RTEX\Interfaces\InstructionInterface; use RTEX\Interfaces\InstructionInterface;
class LessThan implements InstructionInterface class NotEquals implements InstructionInterface
{ {
/** /**
* @var mixed * @var mixed
@ -31,14 +31,13 @@
*/ */
public function getType(): string public function getType(): string
{ {
return InstructionType::LessThan; return InstructionType::NotEquals;
} }
/** /**
* Returns an array representation of the instruction * Returns an array representation of the instruction
* *
* @return array * @return array
* @throws UnsupportedVariableType
*/ */
public function toArray(): array public function toArray(): array
{ {
@ -53,8 +52,7 @@
* *
* @param array $data * @param array $data
* @return InstructionInterface * @return InstructionInterface
* @throws MalformedInstructionException * @throws InstructionException
* @throws UnsupportedVariableType
*/ */
public static function fromArray(array $data): InstructionInterface public static function fromArray(array $data): InstructionInterface
{ {
@ -66,24 +64,26 @@
/** /**
* @param Engine $engine * @param Engine $engine
* @return int * @return bool
* @throws UnsupportedVariableType * @throws EvaluationException
*/ */
public function eval(Engine $engine): int public function eval(Engine $engine): bool
{ {
return (intval($engine->eval($this->A)) < intval($engine->eval($this->B))); $a = $engine->eval($this->A);
$b = $engine->eval($this->B);
return ($a !== $b);
} }
/** /**
* Returns the string representation of the instruction * Returns the string representation of the instruction
* *
* @return string * @return string
* @throws UnsupportedVariableType
*/ */
public function __toString(): string public function __toString(): string
{ {
return sprintf( return sprintf(
self::getType() . ' (%s<%s)', self::getType() . ' $s !== $s',
Utilities::entityToString($this->A), Utilities::entityToString($this->A),
Utilities::entityToString($this->B) Utilities::entityToString($this->B)
); );
@ -103,8 +103,7 @@
* Sets the value of A * Sets the value of A
* *
* @param mixed $A * @param mixed $A
* @throws UnsupportedVariableType * @throws InstructionException
* @throws MalformedInstructionException
*/ */
public function setA(mixed $A): void public function setA(mixed $A): void
{ {
@ -125,8 +124,7 @@
* Sets the value of B * Sets the value of B
* *
* @param mixed $B * @param mixed $B
* @throws MalformedInstructionException * @throws InstructionException
* @throws UnsupportedVariableType
*/ */
public function setB(mixed $B): void public function setB(mixed $B): void
{ {