Gradle Upgrades and Clipboard Refactoring

This commit is contained in:
MattBDev 2020-03-02 17:43:27 -05:00
parent e1b946d0da
commit b7b11cc478
12 changed files with 61 additions and 116 deletions

View File

@ -35,6 +35,5 @@ dependencies {
implementation("com.github.jengelman.gradle.plugins:shadow:5.1.0") implementation("com.github.jengelman.gradle.plugins:shadow:5.1.0")
implementation("net.ltgt.apt-eclipse:net.ltgt.apt-eclipse.gradle.plugin:0.21") implementation("net.ltgt.apt-eclipse:net.ltgt.apt-eclipse.gradle.plugin:0.21")
implementation("net.ltgt.apt-idea:net.ltgt.apt-idea.gradle.plugin:0.21") implementation("net.ltgt.apt-idea:net.ltgt.apt-idea.gradle.plugin:0.21")
implementation("org.jfrog.buildinfo:build-info-extractor-gradle:4.9.7")
implementation("gradle.plugin.com.mendhak.gradlecrowdin:plugin:0.1.0") implementation("gradle.plugin.com.mendhak.gradlecrowdin:plugin:0.1.0")
} }

View File

@ -1,40 +0,0 @@
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.named
import org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention
import org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask
private const val ARTIFACTORY_CONTEXT_URL = "artifactory_contextUrl"
private const val ARTIFACTORY_USER = "artifactory_user"
private const val ARTIFACTORY_PASSWORD = "artifactory_password"
fun Project.applyRootArtifactoryConfig() {
if (!project.hasProperty(ARTIFACTORY_CONTEXT_URL)) ext[ARTIFACTORY_CONTEXT_URL] = "http://localhost"
if (!project.hasProperty(ARTIFACTORY_USER)) ext[ARTIFACTORY_USER] = "guest"
if (!project.hasProperty(ARTIFACTORY_PASSWORD)) ext[ARTIFACTORY_PASSWORD] = ""
apply(plugin = "com.jfrog.artifactory")
configure<ArtifactoryPluginConvention> {
setContextUrl("${project.property(ARTIFACTORY_CONTEXT_URL)}")
clientConfig.publisher.run {
repoKey = when {
"${project.version}".contains("SNAPSHOT") -> "libs-snapshot-local"
else -> "libs-release-local"
}
username = "${project.property(ARTIFACTORY_USER)}"
password = "${project.property(ARTIFACTORY_PASSWORD)}"
isMaven = true
isIvy = false
}
}
tasks.named<ArtifactoryTask>("artifactoryPublish") {
isSkip = true
}
}
fun Project.applyCommonArtifactoryConfig() {
tasks.named<ArtifactoryTask>("artifactoryPublish") {
publishConfigs("archives")
}
}

View File

@ -20,12 +20,10 @@ import org.gradle.kotlin.dsl.withType
fun Project.applyPlatformAndCoreConfiguration() { fun Project.applyPlatformAndCoreConfiguration() {
applyCommonConfiguration() applyCommonConfiguration()
apply(plugin = "java") apply(plugin = "java")
apply(plugin = "eclipse")
apply(plugin = "idea") apply(plugin = "idea")
apply(plugin = "maven") apply(plugin = "maven")
//apply(plugin = "checkstyle") //apply(plugin = "checkstyle")
apply(plugin = "com.github.johnrengelman.shadow") apply(plugin = "com.github.johnrengelman.shadow")
//apply(plugin = "com.jfrog.artifactory")
ext["internalVersion"] = "$version;${rootProject.ext["gitCommitHash"]}" ext["internalVersion"] = "$version;${rootProject.ext["gitCommitHash"]}"
@ -44,7 +42,7 @@ fun Project.applyPlatformAndCoreConfiguration() {
} }
dependencies { dependencies {
"compileOnly"("org.jetbrains:annotations:18.0.0") "compileOnly"("org.jetbrains:annotations:19.0.0")
"testImplementation"("org.junit.jupiter:junit-jupiter-api:${Versions.JUNIT}") "testImplementation"("org.junit.jupiter:junit-jupiter-api:${Versions.JUNIT}")
"testImplementation"("org.junit.jupiter:junit-jupiter-params:${Versions.JUNIT}") "testImplementation"("org.junit.jupiter:junit-jupiter-params:${Versions.JUNIT}")
"testImplementation"("org.mockito:mockito-core:${Versions.MOCKITO}") "testImplementation"("org.mockito:mockito-core:${Versions.MOCKITO}")

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -114,7 +114,7 @@ tasks.named<ShadowJar>("shadowJar") {
val crowdinApiKey = "crowdin_apikey" val crowdinApiKey = "crowdin_apikey"
if (project.hasProperty(crowdinApiKey)) { if (project.hasProperty(crowdinApiKey) && !gradle.startParameter.isOffline) {
tasks.named<UploadSourceFileTask>("crowdinUpload") { tasks.named<UploadSourceFileTask>("crowdinUpload") {
apiKey = "${project.property(crowdinApiKey)}" apiKey = "${project.property(crowdinApiKey)}"
projectId = "worldedit-core" projectId = "worldedit-core"
@ -126,12 +126,19 @@ if (project.hasProperty(crowdinApiKey)) {
) )
} }
tasks.named<DownloadTranslationsTask>("crowdinDownload") { val dlTranslationsTask = tasks.named<DownloadTranslationsTask>("crowdinDownload") {
apiKey = "${project.property(crowdinApiKey)}" apiKey = "${project.property(crowdinApiKey)}"
destination = "${file("build/resources/main/lang")}" destination = "${buildDir.resolve("crowdin-i18n")}"
projectId = "worldedit-core" projectId = "worldedit-core"
} }
tasks.named<Copy>("processResources") {
dependsOn(dlTranslationsTask)
from(dlTranslationsTask.get().destination) {
into("lang")
}
}
tasks.named("classes").configure { tasks.named("classes").configure {
dependsOn("crowdinDownload") dependsOn("crowdinDownload")
} }

View File

@ -1,47 +1,50 @@
package com.boydti.fawe.object.brush; package com.boydti.fawe.object.brush;
import com.boydti.fawe.object.clipboard.CPUOptimizedClipboard; import com.boydti.fawe.object.clipboard.CPUOptimizedClipboard;
import com.boydti.fawe.object.clipboard.LinearClipboard;
import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.command.tool.brush.Brush;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.Arrays; import java.util.Arrays;
public class ErodeBrush implements Brush { public class ErodeBrush implements Brush {
private static final BlockVector3[] FACES_TO_CHECK = Direction.valuesOf(Direction.Flag.CARDINAL).stream().map(Direction::toBlockVector).toArray(BlockVector3[]::new); private static final BlockVector3[] FACES_TO_CHECK = Direction.valuesOf(Direction.Flag.CARDINAL).stream().map(Direction::toBlockVector).toArray(BlockVector3[]::new);
private final int erodeFaces, erodeRec, fillFaces, fillRec; private final int erodeFaces, erodeRecursion, fillFaces, fillRecursion;
public ErodeBrush() { public ErodeBrush() {
this(2, 1, 5, 1); this(2, 1, 5, 1);
} }
public ErodeBrush(int erodeFaces, int erodeRec, int fillFaces, int fillRec) { public ErodeBrush(int erodeFaces, int erodeRecursion, int fillFaces, int fillRecursion) {
this.erodeFaces = erodeFaces; this.erodeFaces = erodeFaces;
this.erodeRec = erodeRec; this.erodeRecursion = erodeRecursion;
this.fillFaces = fillFaces; this.fillFaces = fillFaces;
this.fillRec = fillRec; this.fillRecursion = fillRecursion;
} }
@Override @Override
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws MaxChangedBlocksException { public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws MaxChangedBlocksException {
this.erosion(editSession, erodeFaces, erodeRec, fillFaces, fillRec, position, size); this.erosion(editSession, erodeFaces, erodeRecursion, fillFaces, fillRecursion, position, size);
} }
public void erosion(final EditSession es, int erodeFaces, int erodeRec, int fillFaces, int fillRec, BlockVector3 target, double size) { public void erosion(final EditSession es, int erodeFaces, int erodeRecursion, int fillFaces, int fillRecursion, BlockVector3 target, double size) {
int brushSize = (int) size + 1; int brushSize = (int) size;
int brushSizeSquared = (int) (size * size); int brushSizeSquared = (int) (size * size);
BlockVector3 dimension = BlockVector3.ONE.multiply(brushSize * 2 + 1); Location min = new Location(es.getWorld(), target.toVector3().subtract(size, size, size));
Clipboard buffer1 = new CPUOptimizedClipboard(dimension); Location max = new Location(es.getWorld(), target.toVector3().add(size, size, size));
Clipboard buffer2 = new CPUOptimizedClipboard(dimension); Region region = new CuboidRegion(es.getWorld(), min.toBlockPoint(), max.toBlockPoint());
Clipboard buffer1 = new CPUOptimizedClipboard(region);
Clipboard buffer2 = new CPUOptimizedClipboard(region);
final int bx = target.getBlockX(); final int bx = target.getBlockX();
final int by = target.getBlockY(); final int by = target.getBlockY();
@ -61,12 +64,12 @@ public class ErodeBrush implements Brush {
} }
int swap = 0; int swap = 0;
for (int i = 0; i < erodeRec; ++i) { for (int i = 0; i < erodeRecursion; ++i) {
erosionIteration(brushSize, brushSizeSquared, erodeFaces, swap % 2 == 0 ? buffer1 : buffer2, swap % 2 == 1 ? buffer1 : buffer2); erosionIteration(brushSize, brushSizeSquared, erodeFaces, swap % 2 == 0 ? buffer1 : buffer2, swap % 2 == 1 ? buffer1 : buffer2);
swap++; swap++;
} }
for (int i = 0; i < fillRec; ++i) { for (int i = 0; i < fillRecursion; ++i) {
fillIteration(brushSize, brushSizeSquared, fillFaces, swap % 2 == 0 ? buffer1 : buffer2, swap % 2 == 1 ? buffer1 : buffer2); fillIteration(brushSize, brushSizeSquared, fillFaces, swap % 2 == 0 ? buffer1 : buffer2, swap % 2 == 1 ? buffer1 : buffer2);
swap++; swap++;
} }
@ -95,14 +98,14 @@ public class ErodeBrush implements Brush {
if (state.getBlockType().getMaterial().isMovementBlocker()) { if (state.getBlockType().getMaterial().isMovementBlocker()) {
continue; continue;
} }
int total = 0;
int highest = 1;
BaseBlock highestState = state; BaseBlock highestState = state;
if (frequency == null) { if (frequency == null) {
frequency = new int[BlockTypes.size()]; frequency = new int[BlockTypes.size()];
} else { } else {
Arrays.fill(frequency, 0); Arrays.fill(frequency, 0);
} }
int total = 0;
int highest = 1;
for (BlockVector3 offs : FACES_TO_CHECK) { for (BlockVector3 offs : FACES_TO_CHECK) {
BaseBlock next = current.getFullBlock(relx + offs.getBlockX(), rely + offs.getBlockY(), relz + offs.getBlockZ()); BaseBlock next = current.getFullBlock(relx + offs.getBlockX(), rely + offs.getBlockY(), relz + offs.getBlockZ());
if (!next.getBlockType().getMaterial().isMovementBlocker()) { if (!next.getBlockType().getMaterial().isMovementBlocker()) {
@ -140,14 +143,14 @@ public class ErodeBrush implements Brush {
if (!state.getMaterial().isMovementBlocker()) { if (!state.getMaterial().isMovementBlocker()) {
continue; continue;
} }
int total = 0;
int highest = 1;
BaseBlock highestState = state; BaseBlock highestState = state;
if (frequency == null) { if (frequency == null) {
frequency = new int[BlockTypes.size()]; frequency = new int[BlockTypes.size()];
} else { } else {
Arrays.fill(frequency, 0); Arrays.fill(frequency, 0);
} }
int highest = 1;
int total = 0;
for (BlockVector3 offs : FACES_TO_CHECK) { for (BlockVector3 offs : FACES_TO_CHECK) {
BaseBlock next = current.getFullBlock(relx + offs.getBlockX(), rely + offs.getBlockY(), relz + offs.getBlockZ()); BaseBlock next = current.getFullBlock(relx + offs.getBlockX(), rely + offs.getBlockY(), relz + offs.getBlockZ());
if (next.getMaterial().isMovementBlocker()) { if (next.getMaterial().isMovementBlocker()) {

View File

@ -37,17 +37,13 @@ public class CPUOptimizedClipboard extends LinearClipboard {
private final HashMap<Integer, CompoundTag> nbtMapIndex; private final HashMap<Integer, CompoundTag> nbtMapIndex;
public CPUOptimizedClipboard(BlockVector3 dimensions) { public CPUOptimizedClipboard(Region region) {
super(dimensions); super(region.getDimensions());
this.states = new char[getVolume()]; this.states = new char[getVolume()];
nbtMapLoc = new HashMap<>(); nbtMapLoc = new HashMap<>();
nbtMapIndex = new HashMap<>(); nbtMapIndex = new HashMap<>();
} }
public CPUOptimizedClipboard(Region region) {
this(region.getDimensions());
}
@Override @Override
public boolean hasBiomes() { public boolean hasBiomes() {
return biomes != null; return biomes != null;

View File

@ -62,8 +62,8 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable
private FileChannel fileChannel; private FileChannel fileChannel;
private boolean hasBiomes; private boolean hasBiomes;
public DiskOptimizedClipboard(BlockVector3 dimensions, UUID uuid) { public DiskOptimizedClipboard(Region region, UUID uuid) {
this(dimensions, MainUtil.getFile(Fawe.get() != null ? Fawe.imp().getDirectory() : new File("."), Settings.IMP.PATHS.CLIPBOARD + File.separator + uuid + ".bd")); this(region.getDimensions(), MainUtil.getFile(Fawe.get() != null ? Fawe.imp().getDirectory() : new File("."), Settings.IMP.PATHS.CLIPBOARD + File.separator + uuid + ".bd"));
} }
public DiskOptimizedClipboard(BlockVector3 dimensions) { public DiskOptimizedClipboard(BlockVector3 dimensions) {
@ -108,11 +108,7 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
public DiskOptimizedClipboard(Region region, UUID uuid) {
this(region.getDimensions(), uuid);
}
@Override @Override
public URI getURI() { public URI getURI() {
return file.toURI(); return file.toURI();

View File

@ -36,23 +36,23 @@ public abstract class TaskManager {
/** /**
* Run a repeating task asynchronously * Run a repeating task asynchronously
* *
* @param runnable * @param runnable the task to run
* @param interval in ticks * @param interval in ticks
* @return * @return the task id number
*/ */
public abstract int repeatAsync(@NotNull final Runnable runnable, final int interval); public abstract int repeatAsync(@NotNull final Runnable runnable, final int interval);
/** /**
* Run a task asynchronously * Run a task asynchronously
* *
* @param runnable * @param runnable the task to run
*/ */
public abstract void async(@NotNull final Runnable runnable); public abstract void async(@NotNull final Runnable runnable);
/** /**
* Run a task on the main thread * Run a task on the main thread
* *
* @param runnable * @param runnable the task to run
*/ */
public abstract void task(@NotNull final Runnable runnable); public abstract void task(@NotNull final Runnable runnable);
@ -153,10 +153,10 @@ public abstract class TaskManager {
/** /**
* Run a task on the current thread or asynchronously * Run a task on the current thread or asynchronously
* - If it's already the main thread, it will jst call run() * - If it's already the main thread, it will just call run()
* *
* @param runnable * @param runnable the task to run
* @param async * @param async whether the task should run on the main thread
*/ */
public void taskNow(@NotNull final Runnable runnable, boolean async) { public void taskNow(@NotNull final Runnable runnable, boolean async) {
if (async) { if (async) {
@ -170,7 +170,7 @@ public abstract class TaskManager {
* Run a task as soon as possible on the main thread * Run a task as soon as possible on the main thread
* - Non blocking if not calling from the main thread * - Non blocking if not calling from the main thread
* *
* @param runnable * @param runnable the task to run
*/ */
public void taskNowMain(@NotNull final Runnable runnable) { public void taskNowMain(@NotNull final Runnable runnable) {
if (Fawe.isMainThread()) { if (Fawe.isMainThread()) {
@ -183,8 +183,8 @@ public abstract class TaskManager {
/** /**
* Run a task as soon as possible not on the main thread * Run a task as soon as possible not on the main thread
* *
* @param runnable * @param runnable the task to run
* @see com.boydti.fawe.Fawe#isMainThread() * @see Fawe#isMainThread()
*/ */
public void taskNowAsync(@NotNull final Runnable runnable) { public void taskNowAsync(@NotNull final Runnable runnable) {
taskNow(runnable, Fawe.isMainThread()); taskNow(runnable, Fawe.isMainThread());
@ -193,8 +193,8 @@ public abstract class TaskManager {
/** /**
* Run a task on the main thread at the next tick or now async * Run a task on the main thread at the next tick or now async
* *
* @param runnable * @param runnable the task to run.
* @param async * @param async whether the task should run on the main thread
*/ */
public void taskSoonMain(@NotNull final Runnable runnable, boolean async) { public void taskSoonMain(@NotNull final Runnable runnable, boolean async) {
if (async) { if (async) {
@ -208,7 +208,7 @@ public abstract class TaskManager {
/** /**
* Run a task later on the main thread * Run a task later on the main thread
* *
* @param runnable * @param runnable the task to run
* @param delay in ticks * @param delay in ticks
*/ */
public abstract void later(@NotNull final Runnable runnable, final int delay); public abstract void later(@NotNull final Runnable runnable, final int delay);
@ -216,7 +216,7 @@ public abstract class TaskManager {
/** /**
* Run a task later asynchronously * Run a task later asynchronously
* *
* @param runnable * @param runnable the task to run
* @param delay in ticks * @param delay in ticks
*/ */
public abstract void laterAsync(@NotNull final Runnable runnable, final int delay); public abstract void laterAsync(@NotNull final Runnable runnable, final int delay);
@ -224,7 +224,7 @@ public abstract class TaskManager {
/** /**
* Cancel a task * Cancel a task
* *
* @param task * @param task the id of the task to cancel
*/ */
public abstract void cancel(final int task); public abstract void cancel(final int task);

View File

@ -10,7 +10,6 @@ public interface Metadatable {
* *
* @param key * @param key
* @param value * @param value
* @return previous value
*/ */
void setMeta(String key, Object value); void setMeta(String key, Object value);

View File

@ -38,6 +38,7 @@ import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.DataFixer; import com.sk89q.worldedit.world.DataFixer;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;

View File

@ -124,8 +124,8 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
if (pos1 == null || pos2 == null) { if (pos1 == null || pos2 == null) {
return; return;
} }
pos1 = pos1.clampY(world == null ? 0 : 0, world == null ? FaweCache.IMP.WORLD_MAX_Y : world.getMaxY()); pos1 = pos1.clampY(0, world == null ? 255 : world.getMaxY());
pos2 = pos2.clampY(world == null ? 0 : 0, world == null ? FaweCache.IMP.WORLD_MAX_Y : world.getMaxY()); pos2 = pos2.clampY(0, world == null ? 255 : world.getMaxY());
minX = Math.min(pos1.getX(), pos2.getX()); minX = Math.min(pos1.getX(), pos2.getX());
minY = Math.min(pos1.getY(), pos2.getY()); minY = Math.min(pos1.getY(), pos2.getY());
minZ = Math.min(pos1.getZ(), pos2.getZ()); minZ = Math.min(pos1.getZ(), pos2.getZ());
@ -397,9 +397,8 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
if (o instanceof BlockVector2) { if (o instanceof BlockVector2) {
BlockVector2 cv = (BlockVector2) o; BlockVector2 cv = (BlockVector2) o;
return cv.getX() >= minX && cv.getX() <= maxX && cv.getZ() >= minZ && cv.getZ() <= maxZ; return cv.getX() >= minX && cv.getX() <= maxX && cv.getZ() >= minZ && cv.getZ() <= maxZ;
} else {
return false;
} }
return false;
} }
}; };
} }
@ -422,15 +421,11 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
return chunks; return chunks;
} }
/* Slow and unnecessary
@Override @Override
public boolean contains(BlockVector3 position) { public boolean contains(BlockVector3 position) {
BlockVector3 min = getMinimumPoint(); return contains(position.getX(), position.getY(), position.getZ());
BlockVector3 max = getMaximumPoint();
return position.containedWithin(min, max);
} }
*/
@Override @Override
public boolean contains(int x, int y, int z) { public boolean contains(int x, int y, int z) {
@ -442,11 +437,6 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
return x >= this.minX && x <= this.maxX && z >= this.minZ && z <= this.maxZ; return x >= this.minX && x <= this.maxX && z >= this.minZ && z <= this.maxZ;
} }
@Override
public boolean contains(BlockVector3 position) {
return contains(position.getX(), position.getY(), position.getZ());
}
@Override @Override
public Iterator<BlockVector3> iterator() { public Iterator<BlockVector3> iterator() {
if (Settings.IMP.HISTORY.COMPRESSION_LEVEL >= 9) { if (Settings.IMP.HISTORY.COMPRESSION_LEVEL >= 9) {
@ -543,7 +533,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
@Override @Override
public boolean hasNext() { public boolean hasNext() {
return hasNext; return (hasNext);
} }
@Override @Override
@ -596,10 +586,6 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
return answer; return answer;
} }
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}; };
} }