diff --git a/api/src/main/java/com/github/skjolber/packing/api/Box.java b/api/src/main/java/com/github/skjolber/packing/api/Box.java index 25c9cd14..d3032cce 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/Box.java +++ b/api/src/main/java/com/github/skjolber/packing/api/Box.java @@ -52,8 +52,13 @@ protected BoxStackValue newStackValue(int dx, int dy, int dz, StackConstraint co protected final long minimumArea; protected final long maximumArea; - public Box(String id, String name, long volume, int weight, BoxStackValue[] stackValues) { - super(id, name); + protected final String id; + protected final String description; + + public Box(String id, String description, long volume, int weight, BoxStackValue[] stackValues) { + this.id = id; + this.description = description; + this.volume = volume; this.weight = weight; this.stackValues = stackValues; @@ -65,6 +70,16 @@ public Box(String id, String name, long volume, int weight, BoxStackValue[] stac boxStackValue.setStackable(this); } } + + @Override + public String getDescription() { + return description; + } + + @Override + public String getId() { + return id; + } @Override public int getWeight() { diff --git a/api/src/main/java/com/github/skjolber/packing/api/Container.java b/api/src/main/java/com/github/skjolber/packing/api/Container.java index d81efa1d..7302d3bc 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/Container.java +++ b/api/src/main/java/com/github/skjolber/packing/api/Container.java @@ -147,9 +147,13 @@ protected ContainerStackValue[] getStackValues() { protected final long minArea; protected final long maxArea; - public Container(String id, String name, long volume, int emptyWeight, long maxLoadVolume, int maxLoadWeight, long minArea, long maxArea) { - super(id, name); + protected final String id; + protected final String description; + public Container(String id, String description, long volume, int emptyWeight, long maxLoadVolume, int maxLoadWeight, long minArea, long maxArea) { + this.id = id; + this.description = description; + this.emptyWeight = emptyWeight; this.maxLoadVolume = maxLoadVolume; this.maxLoadWeight = maxLoadWeight; @@ -159,6 +163,16 @@ public Container(String id, String name, long volume, int emptyWeight, long maxL this.maxArea = maxArea; } + @Override + public String getDescription() { + return description; + } + + @Override + public String getId() { + return id; + } + @Override public int getWeight() { return emptyWeight + getStack().getWeight(); diff --git a/api/src/main/java/com/github/skjolber/packing/api/ContainerConstraint.java b/api/src/main/java/com/github/skjolber/packing/api/ContainerConstraint.java index c11a04c1..a148ac6d 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/ContainerConstraint.java +++ b/api/src/main/java/com/github/skjolber/packing/api/ContainerConstraint.java @@ -1,6 +1,6 @@ package com.github.skjolber.packing.api; -import com.github.skjolber.packing.api.packager.LoadableItemFilterBuilder; +import com.github.skjolber.packing.api.packager.StackableItemsFilterBuilder; /** * @@ -10,6 +10,6 @@ public interface ContainerConstraint { - LoadableItemFilterBuilder newLoadableFilterBuilder(); + StackableItemsFilterBuilder newLoadableFilterBuilder(); } diff --git a/api/src/main/java/com/github/skjolber/packing/api/PlacementSupportBuilder.java b/api/src/main/java/com/github/skjolber/packing/api/PlacementSupportBuilder.java index de0725f6..5fa8b736 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/PlacementSupportBuilder.java +++ b/api/src/main/java/com/github/skjolber/packing/api/PlacementSupportBuilder.java @@ -13,7 +13,6 @@ public abstract class PlacementSupportBuilder fitsInside(Dimension bound) { List list = new ArrayList<>(); diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/BoundedStackable.java b/api/src/main/java/com/github/skjolber/packing/api/packager/BoundedStackable.java new file mode 100644 index 00000000..de8235b0 --- /dev/null +++ b/api/src/main/java/com/github/skjolber/packing/api/packager/BoundedStackable.java @@ -0,0 +1,77 @@ +package com.github.skjolber.packing.api.packager; + +import com.github.skjolber.packing.api.StackValue; +import com.github.skjolber.packing.api.Stackable; + +/** + * + * Stackable item which fit within certain bounds, i.e. load dimensions of a container. + * + */ + +public class BoundedStackable extends Stackable { + + private static final long serialVersionUID = 1L; + + protected final StackValue[] values; + protected final Stackable stackable; + + protected final long minimumArea; + protected final long maximumArea; + + public BoundedStackable(Stackable stackable, StackValue[] stackValues) { + this.values = stackValues; + this.stackable = stackable; + + this.minimumArea = getMinimumArea(stackValues); + this.maximumArea = getMinimumArea(stackValues); + } + + public Stackable getStackable() { + return stackable; + } + + public StackValue getStackValue(int index) { + return values[index]; + } + + @Override + public long getVolume() { + return stackable.getVolume(); + } + + @Override + public int getWeight() { + return stackable.getWeight(); + } + + @Override + public StackValue[] getStackValues() { + return values; + } + + @Override + public String getDescription() { + return stackable.getDescription(); + } + + @Override + public String getId() { + return stackable.getId(); + } + + @Override + public Stackable clone() { + return new BoundedStackable(stackable.clone(), values); + } + + @Override + public long getMinimumArea() { + return minimumArea; + } + + @Override + public long getMaximumArea() { + return maximumArea; + } +} diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/DefaultLoadableItemFilter.java b/api/src/main/java/com/github/skjolber/packing/api/packager/DefaultLoadableItemFilter.java deleted file mode 100644 index d3f33131..00000000 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/DefaultLoadableItemFilter.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.github.skjolber.packing.api.packager; - -public class DefaultLoadableItemFilter implements LoadableItemFilter { - - protected final LoadableItems loadableItems; - - public DefaultLoadableItemFilter(LoadableItems loadableItems) { - this.loadableItems = loadableItems; - } - - @Override - public void loaded(int index) { - // do nothing - } - -} \ No newline at end of file diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/DefaultStackableItemsFilter.java b/api/src/main/java/com/github/skjolber/packing/api/packager/DefaultStackableItemsFilter.java new file mode 100644 index 00000000..fa40fe81 --- /dev/null +++ b/api/src/main/java/com/github/skjolber/packing/api/packager/DefaultStackableItemsFilter.java @@ -0,0 +1,16 @@ +package com.github.skjolber.packing.api.packager; + +public class DefaultStackableItemsFilter implements StackableItemsFilter { + + protected final StackableItems loadableItems; + + public DefaultStackableItemsFilter(StackableItems loadableItems) { + this.loadableItems = loadableItems; + } + + @Override + public void loaded(int index) { + // do nothing + } + +} \ No newline at end of file diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/Loadable.java b/api/src/main/java/com/github/skjolber/packing/api/packager/Loadable.java deleted file mode 100644 index e27f7c0f..00000000 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/Loadable.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.github.skjolber.packing.api.packager; - -import java.util.List; - -import com.github.skjolber.packing.api.StackValue; -import com.github.skjolber.packing.api.Stackable; - -/** - * - * Stackable item which fit within certain bounds, i.e. load dimensions of a container. - * - */ - -public class Loadable { - - protected final List values; - protected final Stackable stackable; - - protected final long minVolumeLimit; - protected final long minAreaLimit; - - public Loadable(Stackable stackable, List stackValues) { - this.values = stackValues; - this.stackable = stackable; - - long minVolumeLimit = Long.MAX_VALUE; - long minAreaLimit = Long.MAX_VALUE; - - for (int i = 0; i < values.size(); i++) { - StackValue stackValue = values.get(i); - - if(minVolumeLimit > stackValue.getVolume()) { - minVolumeLimit = stackValue.getVolume(); - } - - if(minAreaLimit > stackValue.getArea()) { - minAreaLimit = stackValue.getArea(); - } - } - - this.minAreaLimit = minAreaLimit; - this.minVolumeLimit = minVolumeLimit; - } - - public List getValues() { - return values; - } - - public long getMinAreaLimit() { - return minAreaLimit; - } - - public long getMinVolumeLimit() { - return minVolumeLimit; - } - - public Stackable getStackable() { - return stackable; - } - - public StackValue getStackValue(int index) { - return values.get(index); - } -} diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItem.java b/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItem.java deleted file mode 100644 index e2d43aa0..00000000 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItem.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.github.skjolber.packing.api.packager; - -/** - * - * Stackable item which fit within certain bounds, i.e. load dimensions of a container. - * - */ - -public class LoadableItem { - - protected Loadable loadable; - protected int count; - protected int index; - - public LoadableItem(Loadable loadable, int count, int index) { - this.loadable = loadable; - this.count = count; - this.index = index; - } - - public Loadable getLoadable() { - return loadable; - } - - public void setLoadable(Loadable loadable) { - this.loadable = loadable; - } - - public int getCount() { - return count; - } - - public void decrement() { - count--; - } - - public boolean isEmpty() { - return count == 0; - } - - public int getIndex() { - return index; - } - - public void decrement(int value) { - this.count = this.count - value; - } -} diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemGroup.java b/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemGroup.java deleted file mode 100644 index e00bbb66..00000000 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemGroup.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.github.skjolber.packing.api.packager; - -import java.util.List; - -/** - * - * Items which belong together, for example different parts of a single product or order. - * - */ - -public class LoadableItemGroup { - - private String id; - private List items; - - public LoadableItemGroup(String id, List items) { - super(); - this.id = id; - this.items = items; - } - - public String getId() { - return id; - } - - public List getItems() { - return items; - } - - public void setId(String id) { - this.id = id; - } - - public void setItems(List items) { - this.items = items; - } - - public int size() { - return items.size(); - } - - public int loadableItemsCount() { - int count = 0; - for (LoadableItem loadableItem : items) { - count += loadableItem.getCount(); - } - return count; - } - - public boolean isEmpty() { - for (LoadableItem loadableItem : items) { - if(!loadableItem.isEmpty()) { - return false; - } - } - - return true; - } - - public void removeEmpty() { - for (int j = 0; j < items.size(); j++) { - LoadableItem loadableItem = items.get(j); - - if(loadableItem.isEmpty()) { - items.remove(j); - j--; - } - } - } -} \ No newline at end of file diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadComparator.java b/api/src/main/java/com/github/skjolber/packing/api/packager/PlacementComparator.java similarity index 82% rename from api/src/main/java/com/github/skjolber/packing/api/packager/LoadComparator.java rename to api/src/main/java/com/github/skjolber/packing/api/packager/PlacementComparator.java index f542f6b0..14980053 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadComparator.java +++ b/api/src/main/java/com/github/skjolber/packing/api/packager/PlacementComparator.java @@ -4,9 +4,10 @@ import com.github.skjolber.packing.api.StackValue; import com.github.skjolber.packing.api.Stackable; +import com.github.skjolber.packing.api.ep.Point3D; @FunctionalInterface -public interface LoadComparator { +public interface PlacementComparator { /** * See {@linkplain Comparator#compare(Object, Object)}.
@@ -25,6 +26,6 @@ public interface LoadComparator { * being compared by this comparator. */ - int compare(Stackable s1, StackValue sv1, L l1, Stackable s2, StackValue sv2, L l2); + int compare(Stackable s1, StackValue sv1, Point3D l1, Stackable s2, StackValue sv2, Point3D l2); } diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItems.java b/api/src/main/java/com/github/skjolber/packing/api/packager/StackableItems.java similarity index 62% rename from api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItems.java rename to api/src/main/java/com/github/skjolber/packing/api/packager/StackableItems.java index 66c3af90..191c2416 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItems.java +++ b/api/src/main/java/com/github/skjolber/packing/api/packager/StackableItems.java @@ -1,16 +1,18 @@ package com.github.skjolber.packing.api.packager; +import com.github.skjolber.packing.api.StackableItem; + /** * * The items which are available for load into some particular container. * */ -public interface LoadableItems { +public interface StackableItems { int size(); - LoadableItem get(int index); + StackableItem get(int index); void remove(int index, int count); diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemFilter.java b/api/src/main/java/com/github/skjolber/packing/api/packager/StackableItemsFilter.java similarity index 79% rename from api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemFilter.java rename to api/src/main/java/com/github/skjolber/packing/api/packager/StackableItemsFilter.java index 70d98d34..6ec9d7f4 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemFilter.java +++ b/api/src/main/java/com/github/skjolber/packing/api/packager/StackableItemsFilter.java @@ -6,11 +6,11 @@ * */ -public interface LoadableItemFilter { +public interface StackableItemsFilter { /** * - * Notify loadable was loaded + * Notify stackable was loaded * * @param index * @return true if some loadable item was excluded due to this loaded item diff --git a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemFilterBuilder.java b/api/src/main/java/com/github/skjolber/packing/api/packager/StackableItemsFilterBuilder.java similarity index 78% rename from api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemFilterBuilder.java rename to api/src/main/java/com/github/skjolber/packing/api/packager/StackableItemsFilterBuilder.java index 6d76ac40..db00a119 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/packager/LoadableItemFilterBuilder.java +++ b/api/src/main/java/com/github/skjolber/packing/api/packager/StackableItemsFilterBuilder.java @@ -12,14 +12,14 @@ */ @SuppressWarnings("unchecked") -public abstract class LoadableItemFilterBuilder> { +public abstract class StackableItemsFilterBuilder> { protected Stack stack; protected Container container; protected ContainerStackValue stackValue; - protected LoadableItems loadableItems; + protected StackableItems loadableItems; - public B withLoadableItems(LoadableItems loadableItems) { + public B withLoadableItems(StackableItems loadableItems) { this.loadableItems = loadableItems; return (B)this; } @@ -39,7 +39,7 @@ public B withStackValue(ContainerStackValue stackValue) { return (B)this; } - public abstract LoadableItemFilter build(); + public abstract StackableItemsFilter build(); diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableItemGroupIteratorBuilder.java b/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableItemGroupIteratorBuilder.java index 0ee6a955..45cec6c7 100644 --- a/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableItemGroupIteratorBuilder.java +++ b/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableItemGroupIteratorBuilder.java @@ -9,9 +9,9 @@ import com.github.skjolber.packing.api.Stackable; import com.github.skjolber.packing.api.StackableItem; import com.github.skjolber.packing.api.StackableItemGroup; -import com.github.skjolber.packing.api.packager.Loadable; -import com.github.skjolber.packing.api.packager.LoadableItem; -import com.github.skjolber.packing.api.packager.LoadableItemGroup; +import com.github.skjolber.packing.api.packager.BoundedStackable; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; +import com.github.skjolber.packing.api.packager.BoundedStackableItemGroup; /** * Builder scaffold. @@ -57,8 +57,8 @@ public B withStackableItemGroups(List stackableItems) { return (B)this; } - protected List toMatrix() { - List results = new ArrayList<>(stackableItemGroups.size()); + protected List toMatrix() { + List results = new ArrayList<>(stackableItemGroups.size()); int offset = 0; @@ -66,7 +66,7 @@ protected List toMatrix() { StackableItemGroup group = stackableItemGroups.get(i); - List loadableItems = new ArrayList<>(group.size()); + List loadableItems = new ArrayList<>(group.size()); for (int k = 0; k < group.size(); k++) { StackableItem item = group.get(k); @@ -92,14 +92,14 @@ protected List toMatrix() { continue; } - Loadable loadable = new Loadable(stackable, boundRotations); + BoundedStackable loadable = new BoundedStackable(stackable, boundRotations); - loadableItems.add(new LoadableItem(loadable, item.getCount(), offset)); + loadableItems.add(new BoundedStackableItem(loadable, item.getCount(), offset)); offset++; } if(!loadableItems.isEmpty()) { - results.add(new LoadableItemGroup(group.getId(), loadableItems)); + results.add(new BoundedStackableItemGroup(group.getId(), loadableItems)); } } return results; diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableIteratorBuilder.java b/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableIteratorBuilder.java index 285457cf..9e3597df 100644 --- a/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableIteratorBuilder.java +++ b/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadableIteratorBuilder.java @@ -7,9 +7,9 @@ import com.github.skjolber.packing.api.StackValue; import com.github.skjolber.packing.api.Stackable; import com.github.skjolber.packing.api.StackableItem; -import com.github.skjolber.packing.api.packager.Loadable; -import com.github.skjolber.packing.api.packager.LoadableItem; -import com.github.skjolber.packing.api.packager.LoadableItems; +import com.github.skjolber.packing.api.packager.BoundedStackable; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; +import com.github.skjolber.packing.api.packager.StackableItems; /** * Builder scaffold. @@ -55,8 +55,8 @@ public B withStackableItems(List stackableItems) { return (B)this; } - protected LoadableItem[] toMatrix() { - LoadableItem[] results = new LoadableItem[stackableItems.size()]; + protected BoundedStackableItem[] toMatrix() { + BoundedStackableItem[] results = new BoundedStackableItem[stackableItems.size()]; for (int i = 0; i < stackableItems.size(); i++) { StackableItem item = stackableItems.get(i); @@ -83,9 +83,9 @@ protected LoadableItem[] toMatrix() { continue; } - Loadable loadable = new Loadable(stackable, boundRotations); + BoundedStackable loadable = new BoundedStackable(stackable, boundRotations); - results[i] = new LoadableItem(loadable, item.getCount(), i); + results[i] = new BoundedStackableItem(loadable, item.getCount(), i); } return results; } diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadablePermutationRotationIterator.java b/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadablePermutationRotationIterator.java index 34db4ee4..babdf4a2 100644 --- a/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadablePermutationRotationIterator.java +++ b/core/src/main/java/com/github/skjolber/packing/iterator/AbstractLoadablePermutationRotationIterator.java @@ -5,18 +5,18 @@ import com.github.skjolber.packing.api.StackValue; import com.github.skjolber.packing.api.StackableItem; -import com.github.skjolber.packing.api.packager.LoadableItem; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; public abstract class AbstractLoadablePermutationRotationIterator implements LoadableItemPermutationRotationIterator { - protected final LoadableItem[] loadableItems; // by index + protected final BoundedStackableItem[] loadableItems; // by index protected int[] reset; - public AbstractLoadablePermutationRotationIterator(LoadableItem[] matrix) { + public AbstractLoadablePermutationRotationIterator(BoundedStackableItem[] matrix) { this.loadableItems = matrix; } - public LoadableItem[] getMatrix() { + public BoundedStackableItem[] getMatrix() { return loadableItems; } diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemGroupPermutationRotationIterator.java b/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemGroupPermutationRotationIterator.java index 6465a66e..6b95fee0 100644 --- a/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemGroupPermutationRotationIterator.java +++ b/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemGroupPermutationRotationIterator.java @@ -5,8 +5,8 @@ import java.util.List; import com.github.skjolber.packing.api.StackValue; -import com.github.skjolber.packing.api.packager.LoadableItem; -import com.github.skjolber.packing.api.packager.LoadableItemGroup; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; +import com.github.skjolber.packing.api.packager.BoundedStackableItemGroup; public class DefaultLoadableItemGroupPermutationRotationIterator extends AbstractLoadablePermutationRotationIterator { @@ -24,14 +24,14 @@ public DefaultLoadableItemGroupPermutationRotationIterator build() { throw new IllegalStateException(); } - List groups = toMatrix(); + List groups = toMatrix(); - List matrix = new ArrayList<>(); - for (LoadableItemGroup loadableItemGroup : groups) { + List matrix = new ArrayList<>(); + for (BoundedStackableItemGroup loadableItemGroup : groups) { matrix.addAll(loadableItemGroup.getItems()); } - return new DefaultLoadableItemGroupPermutationRotationIterator(groups, matrix.toArray(new LoadableItem[matrix.size()])); + return new DefaultLoadableItemGroupPermutationRotationIterator(groups, matrix.toArray(new BoundedStackableItem[matrix.size()])); } } @@ -44,16 +44,16 @@ public DefaultLoadableItemGroupPermutationRotationIterator build() { // minimum volume from index i and above protected long[] minStackableVolume; - protected List groups; + protected List groups; - public DefaultLoadableItemGroupPermutationRotationIterator(List groups, LoadableItem[] matrix) { + public DefaultLoadableItemGroupPermutationRotationIterator(List groups, BoundedStackableItem[] matrix) { super(matrix); this.groups = groups; int count = 0; - for (LoadableItem loadableItem : matrix) { + for (BoundedStackableItem loadableItem : matrix) { if(loadableItem != null) { count += loadableItem.getCount(); } @@ -71,7 +71,7 @@ public StackValue getStackValue(int index) { public void removePermutations(int count) { // discard a number of items from the front for(int i = 0; i < count; i++) { - LoadableItem loadableItem = loadableItems[permutations[i]]; + BoundedStackableItem loadableItem = loadableItems[permutations[i]]; loadableItem.decrement(); @@ -81,7 +81,7 @@ public void removePermutations(int count) { } for(int i = 0; i < groups.size(); i++) { - LoadableItemGroup group = groups.get(i); + BoundedStackableItemGroup group = groups.get(i); group.removeEmpty(); @@ -105,7 +105,7 @@ protected void initiatePermutation(int remainingCount) { int offset = 0; for (int j = 0; j < loadableItems.length; j++) { - LoadableItem value = loadableItems[j]; + BoundedStackableItem value = loadableItems[j]; if(value != null && !value.isEmpty()) { for (int k = 0; k < value.getCount(); k++) { permutations[offset] = j; @@ -153,7 +153,7 @@ protected long[] getMinStackableVolume() { public void removePermutations(List removed) { for (Integer i : removed) { - LoadableItem loadableItem = loadableItems[i]; + BoundedStackableItem loadableItem = loadableItems[i]; loadableItem.decrement(); @@ -164,7 +164,7 @@ public void removePermutations(List removed) { // go through all groups and clean up for(int i = 0; i < groups.size(); i++) { - LoadableItemGroup group = groups.get(i); + BoundedStackableItemGroup group = groups.get(i); group.removeEmpty(); if(group.isEmpty()) { @@ -209,7 +209,7 @@ protected void resetRotations() { public long countRotations() { long n = 1; for (int i = 0; i < permutations.length; i++) { - LoadableItem value = loadableItems[permutations[i]]; + BoundedStackableItem value = loadableItems[permutations[i]]; if(Long.MAX_VALUE / value.getLoadable().getValues().size() <= n) { return -1L; } @@ -232,14 +232,14 @@ public long countPermutations() { // fit within the container volume long n = 1; - for (LoadableItemGroup loadableItemGroup : groups) { + for (BoundedStackableItemGroup loadableItemGroup : groups) { - List items = loadableItemGroup.getItems(); + List items = loadableItemGroup.getItems(); int count = loadableItemGroup.loadableItemsCount(); int maxCount = 0; - for (LoadableItem value : items) { + for (BoundedStackableItem value : items) { if(value != null) { if(maxCount < value.getCount()) { maxCount = value.getCount(); @@ -249,7 +249,7 @@ public long countPermutations() { if(maxCount > 1) { int[] factors = new int[maxCount]; - for (LoadableItem value : items) { + for (BoundedStackableItem value : items) { if(value != null) { for (int k = 0; k < value.getCount(); k++) { factors[k]++; @@ -297,7 +297,7 @@ public int nextPermutation(int maxIndex) { int limit = permutations.length; for(int g = groups.size() - 1; g >= 0; g--) { - LoadableItemGroup loadableItemGroup = groups.get(g); + BoundedStackableItemGroup loadableItemGroup = groups.get(g); // Find longest non-increasing suffix int startIndex = limit - loadableItemGroup.loadableItemsCount(); @@ -343,7 +343,7 @@ public int nextPermutation(int maxIndex) { // TODO system arraycopy? int i = startIndex; - for (LoadableItem loadableItem : loadableItemGroup.getItems()) { + for (BoundedStackableItem loadableItem : loadableItemGroup.getItems()) { for(int k = 0; k < loadableItem.getCount(); k++) { permutations[i] = loadableItem.getIndex(); @@ -367,7 +367,7 @@ public int nextPermutation() { for(int g = groups.size() - 1; g >= 0; g--) { - LoadableItemGroup loadableItemGroup = groups.get(g); + BoundedStackableItemGroup loadableItemGroup = groups.get(g); int[] permutations = this.permutations; @@ -385,7 +385,7 @@ public int nextPermutation() { // TODO system arraycopy? i = startIndex; - for (LoadableItem loadableItem : loadableItemGroup.getItems()) { + for (BoundedStackableItem loadableItem : loadableItemGroup.getItems()) { for(int k = 0; k < loadableItem.getCount(); k++) { permutations[i] = loadableItem.getIndex(); @@ -443,7 +443,7 @@ public PermutationRotationState getState() { return new PermutationRotationState(rotations, permutations); } - public LoadableItem getPermutation(int index) { + public BoundedStackableItem getPermutation(int index) { return loadableItems[permutations[index]]; } diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemPermutationRotationIterator.java b/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemPermutationRotationIterator.java index 1c597101..44886b0e 100644 --- a/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemPermutationRotationIterator.java +++ b/core/src/main/java/com/github/skjolber/packing/iterator/DefaultLoadableItemPermutationRotationIterator.java @@ -4,7 +4,7 @@ import java.util.List; import com.github.skjolber.packing.api.StackValue; -import com.github.skjolber.packing.api.packager.LoadableItem; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; public class DefaultLoadableItemPermutationRotationIterator extends AbstractLoadablePermutationRotationIterator { @@ -22,7 +22,7 @@ public DefaultLoadableItemPermutationRotationIterator build() { throw new IllegalStateException(); } - LoadableItem[] matrix = toMatrix(); + BoundedStackableItem[] matrix = toMatrix(); return new DefaultLoadableItemPermutationRotationIterator(matrix); } @@ -37,12 +37,12 @@ public DefaultLoadableItemPermutationRotationIterator build() { // minimum volume from index i and above protected long[] minStackableVolume; - public DefaultLoadableItemPermutationRotationIterator(LoadableItem[] matrix) { + public DefaultLoadableItemPermutationRotationIterator(BoundedStackableItem[] matrix) { super(matrix); int count = 0; - for (LoadableItem loadableItem : matrix) { + for (BoundedStackableItem loadableItem : matrix) { if(loadableItem != null) { count += loadableItem.getCount(); } @@ -60,7 +60,7 @@ public StackValue getStackValue(int index) { public void removePermutations(int count) { // discard a number of items from the front for(int i = 0; i < count; i++) { - LoadableItem loadableItem = loadableItems[permutations[i]]; + BoundedStackableItem loadableItem = loadableItems[permutations[i]]; loadableItem.decrement(); @@ -81,7 +81,7 @@ protected void initiatePermutation(int remainingCount) { int offset = 0; for (int j = 0; j < loadableItems.length; j++) { - LoadableItem value = loadableItems[j]; + BoundedStackableItem value = loadableItems[j]; if(value != null && !value.isEmpty()) { for (int k = 0; k < value.getCount(); k++) { permutations[offset] = j; @@ -129,7 +129,7 @@ protected long[] getMinStackableVolume() { public void removePermutations(List removed) { for (Integer i : removed) { - LoadableItem loadableItem = loadableItems[i]; + BoundedStackableItem loadableItem = loadableItems[i]; loadableItem.decrement(); @@ -174,7 +174,7 @@ protected void resetRotations() { public long countRotations() { long n = 1; for (int i = 0; i < permutations.length; i++) { - LoadableItem value = loadableItems[permutations[i]]; + BoundedStackableItem value = loadableItems[permutations[i]]; if(Long.MAX_VALUE / value.getLoadable().getValues().size() <= n) { return -1L; } @@ -197,7 +197,7 @@ public long countPermutations() { // fit within the container volume int maxCount = 0; - for (LoadableItem value : loadableItems) { + for (BoundedStackableItem value : loadableItems) { if(value != null) { if(maxCount < value.getCount()) { maxCount = value.getCount(); @@ -208,7 +208,7 @@ public long countPermutations() { long n = 1; if(maxCount > 1) { int[] factors = new int[maxCount]; - for (LoadableItem value : loadableItems) { + for (BoundedStackableItem value : loadableItems) { if(value != null) { for (int k = 0; k < value.getCount(); k++) { factors[k]++; @@ -345,7 +345,7 @@ public PermutationRotationState getState() { return new PermutationRotationState(rotations, permutations); } - public LoadableItem getPermutation(int index) { + public BoundedStackableItem getPermutation(int index) { return loadableItems[permutations[index]]; } diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItem.java b/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItem.java index ffce5b50..342438aa 100644 --- a/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItem.java +++ b/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItem.java @@ -1,12 +1,12 @@ package com.github.skjolber.packing.iterator; -import com.github.skjolber.packing.api.packager.LoadableItem; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; -public class MutableLoadableItem extends LoadableItem { +public class MutableLoadableItem extends BoundedStackableItem { - public final LoadableItem source; + public final BoundedStackableItem source; - public MutableLoadableItem(LoadableItem loadableItem) { + public MutableLoadableItem(BoundedStackableItem loadableItem) { super(loadableItem.getLoadable(), loadableItem.getCount(), loadableItem.getIndex()); this.source = loadableItem; diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItemPermutationRotationIterator.java b/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItemPermutationRotationIterator.java index 901cf498..c719f2b1 100644 --- a/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItemPermutationRotationIterator.java +++ b/core/src/main/java/com/github/skjolber/packing/iterator/MutableLoadableItemPermutationRotationIterator.java @@ -4,8 +4,8 @@ import java.util.List; import com.github.skjolber.packing.api.StackValue; -import com.github.skjolber.packing.api.packager.LoadableItem; -import com.github.skjolber.packing.api.packager.LoadableItems; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; +import com.github.skjolber.packing.api.packager.StackableItems; /** * @@ -16,7 +16,7 @@ */ -public class MutableLoadableItemPermutationRotationIterator implements LoadableItems, LoadableItemPermutationRotationIterator { +public class MutableLoadableItemPermutationRotationIterator implements StackableItems, LoadableItemPermutationRotationIterator { public static Builder newMutableBuilder() { return new Builder(); @@ -32,7 +32,7 @@ public MutableLoadableItemPermutationRotationIterator build() { throw new IllegalStateException(); } - LoadableItem[] matrix = toMatrix(); + BoundedStackableItem[] matrix = toMatrix(); return new MutableLoadableItemPermutationRotationIterator(matrix); } @@ -50,9 +50,9 @@ public MutableLoadableItemPermutationRotationIterator build() { protected final DefaultLoadableItemPermutationRotationIterator iterator; - protected final LoadableItem[] loadableItems; // by index + protected final BoundedStackableItem[] loadableItems; // by index - public MutableLoadableItemPermutationRotationIterator(LoadableItem[] loadableItems) { + public MutableLoadableItemPermutationRotationIterator(BoundedStackableItem[] loadableItems) { iterator = new DefaultLoadableItemPermutationRotationIterator(loadableItems); this.loadableItems = loadableItems; @@ -65,7 +65,7 @@ protected void resetFromIterator() { mutableLoadableItems = new ArrayList<>(); for (int i = 0; i < loadableItems.length; i++) { - LoadableItem loadableItem = loadableItems[i]; + BoundedStackableItem loadableItem = loadableItems[i]; if(loadableItem != null && !loadableItem.isEmpty()) { mutableLoadableItems.add(new MutableLoadableItem(loadableItem)); } @@ -80,7 +80,7 @@ protected void resetFromIterator() { } - public LoadableItem get(int index) { + public BoundedStackableItem get(int index) { return mutableLoadableItems.get(index); } @@ -119,7 +119,7 @@ public int nextRotation(int maxIndex) { @Override public void remove(int index, int count) { - LoadableItem loadableItem = mutableLoadableItems.get(index); + BoundedStackableItem loadableItem = mutableLoadableItems.get(index); loadableItem.decrement(count); if(loadableItem.isEmpty()) { @@ -249,7 +249,7 @@ public long countRotations() { public long countMutableRotations() { long n = 1; for (int i = 0; i < mutablePermutations.length; i++) { - LoadableItem value = loadableItems[mutablePermutations[i]]; + BoundedStackableItem value = loadableItems[mutablePermutations[i]]; if(Long.MAX_VALUE / value.getLoadable().getValues().size() <= n) { return -1L; } @@ -271,7 +271,7 @@ public long countMutablePermutations() { // fit within the container volume int maxCount = 0; - for (LoadableItem value : loadableItems) { + for (BoundedStackableItem value : loadableItems) { if(value != null) { if(maxCount < value.getCount()) { maxCount = value.getCount(); @@ -282,7 +282,7 @@ public long countMutablePermutations() { long n = 1; if(maxCount > 1) { int[] factors = new int[maxCount]; - for (LoadableItem value : loadableItems) { + for (BoundedStackableItem value : loadableItems) { if(value != null) { for (int k = 0; k < value.getCount(); k++) { factors[k]++; diff --git a/core/src/test/java/com/github/skjolber/packing/iterator/MutableLoadablePermutationRotationIteratorTest.java b/core/src/test/java/com/github/skjolber/packing/iterator/MutableLoadablePermutationRotationIteratorTest.java index 4a99ba60..0a0e454f 100644 --- a/core/src/test/java/com/github/skjolber/packing/iterator/MutableLoadablePermutationRotationIteratorTest.java +++ b/core/src/test/java/com/github/skjolber/packing/iterator/MutableLoadablePermutationRotationIteratorTest.java @@ -12,8 +12,8 @@ import com.github.skjolber.packing.api.Box; import com.github.skjolber.packing.api.Dimension; import com.github.skjolber.packing.api.StackableItem; -import com.github.skjolber.packing.api.packager.LoadableItem; -import com.github.skjolber.packing.api.packager.LoadableItems; +import com.github.skjolber.packing.api.packager.BoundedStackableItem; +import com.github.skjolber.packing.api.packager.StackableItems; class MutableLoadablePermutationRotationIteratorTest extends AbstractLoadablePermutationRotationIteratorTest { @@ -44,7 +44,7 @@ void testMutableRotationCount() { .withMaxLoadWeight(products1.size()) .build(); - LoadableItems items = rotator; + StackableItems items = rotator; long unmodifiedRotationsCount = rotator.countRotations(); @@ -59,7 +59,7 @@ void testMutableRotationCount() { items.remove(0, 1); for(int k = 0; k < items.size(); k++) { - LoadableItem loadableItem = items.get(k); + BoundedStackableItem loadableItem = items.get(k); assertFalse(loadableItem.getLoadable().getStackable().getId().equals("0")); }