Utils: added cloneCallback() and cloneObjectArray() to reduce list copying boilerplate

This commit is contained in:
Dylan K. Taylor 2019-07-19 19:19:04 +01:00
parent 47b120fa0e
commit 1e057394c0
6 changed files with 23 additions and 12 deletions

View File

@ -36,6 +36,7 @@ use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Facing; use pocketmine\math\Facing;
use pocketmine\math\Vector3; use pocketmine\math\Vector3;
use pocketmine\player\Player; use pocketmine\player\Player;
use pocketmine\utils\Utils;
use pocketmine\world\BlockTransaction; use pocketmine\world\BlockTransaction;
use function assert; use function assert;
use function floor; use function floor;
@ -65,7 +66,7 @@ class Banner extends Transparent{
} }
public function __clone(){ public function __clone(){
$this->patterns = $this->patterns->map(function(BannerPattern $pattern) : BannerPattern{ return clone $pattern; }); $this->patterns = $this->patterns->map(Utils::cloneCallback());
} }
public function getId() : int{ public function getId() : int{

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\utils\RegistryTrait; use pocketmine\utils\RegistryTrait;
use function array_map; use pocketmine\utils\Utils;
use function assert; use function assert;
/** /**
@ -689,7 +689,7 @@ final class VanillaBlocks{
* @return Block[] * @return Block[]
*/ */
public static function getAll() : array{ public static function getAll() : array{
return array_map(function(Block $member){ return clone $member; }, self::_registryGetAll()); return Utils::cloneObjectArray(self::_registryGetAll());
} }
protected static function setup() : void{ protected static function setup() : void{

View File

@ -25,7 +25,7 @@ namespace pocketmine\crafting;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\ItemFactory; use pocketmine\item\ItemFactory;
use function array_map; use pocketmine\utils\Utils;
use function array_values; use function array_values;
use function count; use function count;
use function implode; use function implode;
@ -95,7 +95,7 @@ class ShapedRecipe implements CraftingRecipe{
$this->ingredientList[$char] = clone $i; $this->ingredientList[$char] = clone $i;
} }
$this->results = array_map(function(Item $item) : Item{ return clone $item; }, $results); $this->results = Utils::cloneObjectArray($results);
} }
public function getWidth() : int{ public function getWidth() : int{
@ -110,7 +110,7 @@ class ShapedRecipe implements CraftingRecipe{
* @return Item[] * @return Item[]
*/ */
public function getResults() : array{ public function getResults() : array{
return array_map(function(Item $item) : Item{ return clone $item; }, $this->results); return Utils::cloneObjectArray($this->results);
} }
/** /**

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\crafting; namespace pocketmine\crafting;
use pocketmine\item\Item; use pocketmine\item\Item;
use function array_map; use pocketmine\utils\Utils;
use function count; use function count;
class ShapelessRecipe implements CraftingRecipe{ class ShapelessRecipe implements CraftingRecipe{
@ -49,11 +49,11 @@ class ShapelessRecipe implements CraftingRecipe{
} }
} }
$this->results = array_map(function(Item $item) : Item{ return clone $item; }, $results); $this->results = Utils::cloneObjectArray($results);
} }
public function getResults() : array{ public function getResults() : array{
return array_map(function(Item $item) : Item{ return clone $item; }, $this->results); return Utils::cloneObjectArray($this->results);
} }
public function getResultsFor(CraftingGrid $grid) : array{ public function getResultsFor(CraftingGrid $grid) : array{
@ -64,7 +64,7 @@ class ShapelessRecipe implements CraftingRecipe{
* @return Item[] * @return Item[]
*/ */
public function getIngredientList() : array{ public function getIngredientList() : array{
return array_map(function(Item $item) : Item{ return clone $item; }, $this->ingredients); return Utils::cloneObjectArray($this->ingredients);
} }
/** /**

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\item; namespace pocketmine\item;
use pocketmine\utils\RegistryTrait; use pocketmine\utils\RegistryTrait;
use function array_map; use pocketmine\utils\Utils;
use function assert; use function assert;
/** /**
@ -317,7 +317,7 @@ final class VanillaItems{
* @return Item[] * @return Item[]
*/ */
public static function getAll() : array{ public static function getAll() : array{
return array_map(function(Item $member){ return clone $member; }, self::_registryGetAll()); return Utils::cloneObjectArray(self::_registryGetAll());
} }
protected static function setup() : void{ protected static function setup() : void{

View File

@ -142,6 +142,16 @@ class Utils{
return $reflect->getName(); return $reflect->getName();
} }
public static function cloneCallback() : \Closure{
return static function(object $o){
return clone $o;
};
}
public static function cloneObjectArray(array $array) : array{
return array_map(self::cloneCallback(), $array);
}
/** /**
* Gets this machine / server instance unique ID * Gets this machine / server instance unique ID
* Returns a hash, the first 32 characters (or 16 if raw) * Returns a hash, the first 32 characters (or 16 if raw)