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 d3032cce..592420c4 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 @@ -103,6 +103,10 @@ public Box clone() { } return new Box(id, description, volume, weight, stackValues); } + + public StackValue getStackValue(int index) { + return stackValues[index]; + } @Override public long getMinimumArea() { diff --git a/api/src/main/java/com/github/skjolber/packing/api/DefaultContainer.java b/api/src/main/java/com/github/skjolber/packing/api/DefaultContainer.java index 32f97f9e..783a85ab 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/DefaultContainer.java +++ b/api/src/main/java/com/github/skjolber/packing/api/DefaultContainer.java @@ -29,6 +29,10 @@ public ContainerStackValue[] getStackValues() { public Stack getStack() { return stack; } + + public ContainerStackValue getStackValue(int index) { + return stackValues[index]; + } @Override public DefaultContainer clone() { diff --git a/api/src/main/java/com/github/skjolber/packing/api/Stackable.java b/api/src/main/java/com/github/skjolber/packing/api/Stackable.java index 42f1f2ec..d7f4b89a 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/Stackable.java +++ b/api/src/main/java/com/github/skjolber/packing/api/Stackable.java @@ -29,6 +29,8 @@ public List fitsInside(Dimension bound) { return list; } + + public abstract StackValue getStackValue(int index); @Override public abstract Stackable clone(); diff --git a/api/src/main/java/com/github/skjolber/packing/api/StackableItem.java b/api/src/main/java/com/github/skjolber/packing/api/StackableItem.java index f0670a00..abd0226e 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/StackableItem.java +++ b/api/src/main/java/com/github/skjolber/packing/api/StackableItem.java @@ -11,8 +11,8 @@ public class StackableItem implements Serializable { private static final long serialVersionUID = 1L; - private final int count; - private final Stackable stackable; + protected int count; + protected final Stackable stackable; public StackableItem(Stackable box) { this(box, 1); @@ -36,5 +36,18 @@ public Stackable getStackable() { public String toString() { return String.format("%dx%s", count, stackable); } + + public void decrement() { + count--; + } + + public boolean isEmpty() { + return count == 0; + } + + public void decrement(int value) { + this.count = this.count - value; + } + } diff --git a/api/src/main/java/com/github/skjolber/packing/api/StackableItemGroup.java b/api/src/main/java/com/github/skjolber/packing/api/StackableItemGroup.java index f4aed522..3bd78f63 100644 --- a/api/src/main/java/com/github/skjolber/packing/api/StackableItemGroup.java +++ b/api/src/main/java/com/github/skjolber/packing/api/StackableItemGroup.java @@ -14,6 +14,12 @@ public class StackableItemGroup { private List items; + public StackableItemGroup(String id, List items) { + super(); + this.id = id; + this.items = items; + } + public String getId() { return id; } @@ -37,4 +43,33 @@ public int size() { public StackableItem get(int i) { return items.get(i); } + + public int loadableItemsCount() { + int count = 0; + for (StackableItem loadableItem : items) { + count += loadableItem.getCount(); + } + return count; + } + + public boolean isEmpty() { + for (StackableItem loadableItem : items) { + if(!loadableItem.isEmpty()) { + return false; + } + } + + return true; + } + + public void removeEmpty() { + for (int j = 0; j < items.size(); j++) { + StackableItem 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/BoundedStackable.java b/api/src/main/java/com/github/skjolber/packing/api/packager/BoundedStackable.java index de8235b0..38a25517 100644 --- 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 @@ -1,5 +1,7 @@ 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; @@ -27,6 +29,10 @@ public BoundedStackable(Stackable stackable, StackValue[] stackValues) { this.maximumArea = getMinimumArea(stackValues); } + public BoundedStackable(Stackable stackable, List stackValues) { + this(stackable, stackValues.toArray(new StackValue[stackValues.size()])); + } + public Stackable getStackable() { return stackable; } 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 45cec6c7..bfffa8db 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 @@ -10,8 +10,6 @@ import com.github.skjolber.packing.api.StackableItem; import com.github.skjolber.packing.api.StackableItemGroup; 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 +55,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 +64,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); @@ -94,12 +92,12 @@ protected List toMatrix() { BoundedStackable loadable = new BoundedStackable(stackable, boundRotations); - loadableItems.add(new BoundedStackableItem(loadable, item.getCount(), offset)); + loadableItems.add(new IndexedStackableItem(loadable, item.getCount(), offset)); offset++; } if(!loadableItems.isEmpty()) { - results.add(new BoundedStackableItemGroup(group.getId(), loadableItems)); + results.add(new StackableItemGroup(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 9e3597df..4eb8433e 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 @@ -8,7 +8,6 @@ import com.github.skjolber.packing.api.Stackable; import com.github.skjolber.packing.api.StackableItem; import com.github.skjolber.packing.api.packager.BoundedStackable; -import com.github.skjolber.packing.api.packager.BoundedStackableItem; import com.github.skjolber.packing.api.packager.StackableItems; /** @@ -55,8 +54,8 @@ public B withStackableItems(List stackableItems) { return (B)this; } - protected BoundedStackableItem[] toMatrix() { - BoundedStackableItem[] results = new BoundedStackableItem[stackableItems.size()]; + protected IndexedStackableItem[] toMatrix() { + IndexedStackableItem[] results = new IndexedStackableItem[stackableItems.size()]; for (int i = 0; i < stackableItems.size(); i++) { StackableItem item = stackableItems.get(i); @@ -85,7 +84,7 @@ protected BoundedStackableItem[] toMatrix() { BoundedStackable loadable = new BoundedStackable(stackable, boundRotations); - results[i] = new BoundedStackableItem(loadable, item.getCount(), i); + results[i] = new IndexedStackableItem(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 babdf4a2..93d3d95a 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,17 @@ import com.github.skjolber.packing.api.StackValue; import com.github.skjolber.packing.api.StackableItem; -import com.github.skjolber.packing.api.packager.BoundedStackableItem; public abstract class AbstractLoadablePermutationRotationIterator implements LoadableItemPermutationRotationIterator { - protected final BoundedStackableItem[] loadableItems; // by index + protected final IndexedStackableItem[] loadableItems; // by index protected int[] reset; - public AbstractLoadablePermutationRotationIterator(BoundedStackableItem[] matrix) { + public AbstractLoadablePermutationRotationIterator(IndexedStackableItem[] matrix) { this.loadableItems = matrix; } - public BoundedStackableItem[] getMatrix() { + public IndexedStackableItem[] getMatrix() { return loadableItems; } @@ -63,7 +62,7 @@ public List get(PermutationRotationState state, int length) { List results = new ArrayList(length); for (int i = 0; i < length; i++) { - results.add(loadableItems[permutations[i]].getLoadable().getStackValue(rotations[i])); + results.add(loadableItems[permutations[i]].getStackable().getStackValue(rotations[i])); } return results; } 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 6b95fee0..51698aa6 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.BoundedStackableItem; -import com.github.skjolber.packing.api.packager.BoundedStackableItemGroup; +import com.github.skjolber.packing.api.StackableItem; +import com.github.skjolber.packing.api.StackableItemGroup; 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 (BoundedStackableItemGroup loadableItemGroup : groups) { + List matrix = new ArrayList<>(); + for (StackableItemGroup loadableItemGroup : groups) { matrix.addAll(loadableItemGroup.getItems()); } - return new DefaultLoadableItemGroupPermutationRotationIterator(groups, matrix.toArray(new BoundedStackableItem[matrix.size()])); + return new DefaultLoadableItemGroupPermutationRotationIterator(groups, matrix.toArray(new IndexedStackableItem[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, BoundedStackableItem[] matrix) { + public DefaultLoadableItemGroupPermutationRotationIterator(List groups, IndexedStackableItem[] matrix) { super(matrix); this.groups = groups; int count = 0; - for (BoundedStackableItem loadableItem : matrix) { + for (IndexedStackableItem loadableItem : matrix) { if(loadableItem != null) { count += loadableItem.getCount(); } @@ -65,13 +65,13 @@ public DefaultLoadableItemGroupPermutationRotationIterator(List= offset; i--) { - long volume = loadableItems[permutations[i]].getLoadable().getStackValue(rotations[i]).getVolume(); + long volume = loadableItems[permutations[i]].getStackable().getStackValue(rotations[i]).getVolume(); if(volume < minStackableVolume[i + 1]) { minStackableVolume[i] = volume; @@ -153,7 +153,7 @@ protected long[] getMinStackableVolume() { public void removePermutations(List removed) { for (Integer i : removed) { - BoundedStackableItem loadableItem = loadableItems[i]; + IndexedStackableItem 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++) { - BoundedStackableItemGroup group = groups.get(i); + StackableItemGroup group = groups.get(i); group.removeEmpty(); if(group.isEmpty()) { @@ -185,7 +185,7 @@ public int nextRotation() { public int nextRotation(int maxIndex) { // next rotation for (int i = maxIndex; i >= 0; i--) { - if(rotations[i] < loadableItems[permutations[i]].getLoadable().getValues().size() - 1) { + if(rotations[i] < loadableItems[permutations[i]].getStackable().getStackValues().length - 1) { rotations[i]++; System.arraycopy(reset, 0, rotations, i + 1, rotations.length - (i + 1)); @@ -209,12 +209,12 @@ protected void resetRotations() { public long countRotations() { long n = 1; for (int i = 0; i < permutations.length; i++) { - BoundedStackableItem value = loadableItems[permutations[i]]; - if(Long.MAX_VALUE / value.getLoadable().getValues().size() <= n) { + IndexedStackableItem value = loadableItems[permutations[i]]; + if(Long.MAX_VALUE / value.getStackable().getStackValues().length <= n) { return -1L; } - n = n * value.getLoadable().getValues().size(); + n = n * value.getStackable().getStackValues().length; } return n; } @@ -232,14 +232,14 @@ public long countPermutations() { // fit within the container volume long n = 1; - for (BoundedStackableItemGroup loadableItemGroup : groups) { + for (StackableItemGroup loadableItemGroup : groups) { - List items = loadableItemGroup.getItems(); + List items = loadableItemGroup.getItems(); int count = loadableItemGroup.loadableItemsCount(); int maxCount = 0; - for (BoundedStackableItem value : items) { + for (StackableItem 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 (BoundedStackableItem value : items) { + for (StackableItem 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--) { - BoundedStackableItemGroup loadableItemGroup = groups.get(g); + StackableItemGroup loadableItemGroup = groups.get(g); // Find longest non-increasing suffix int startIndex = limit - loadableItemGroup.loadableItemsCount(); @@ -343,9 +343,10 @@ public int nextPermutation(int maxIndex) { // TODO system arraycopy? int i = startIndex; - for (BoundedStackableItem loadableItem : loadableItemGroup.getItems()) { - for(int k = 0; k < loadableItem.getCount(); k++) { - permutations[i] = loadableItem.getIndex(); + for (StackableItem loadableItem : loadableItemGroup.getItems()) { + IndexedStackableItem indexedStackableItem = (IndexedStackableItem)loadableItem; + for(int k = 0; k < indexedStackableItem.getCount(); k++) { + permutations[i] = indexedStackableItem.getIndex(); i++; } @@ -367,7 +368,7 @@ public int nextPermutation() { for(int g = groups.size() - 1; g >= 0; g--) { - BoundedStackableItemGroup loadableItemGroup = groups.get(g); + StackableItemGroup loadableItemGroup = groups.get(g); int[] permutations = this.permutations; @@ -385,9 +386,10 @@ public int nextPermutation() { // TODO system arraycopy? i = startIndex; - for (BoundedStackableItem loadableItem : loadableItemGroup.getItems()) { - for(int k = 0; k < loadableItem.getCount(); k++) { - permutations[i] = loadableItem.getIndex(); + for (StackableItem loadableItem : loadableItemGroup.getItems()) { + IndexedStackableItem indexedStackableItem = (IndexedStackableItem)loadableItem; + for(int k = 0; k < indexedStackableItem.getCount(); k++) { + permutations[i] = indexedStackableItem.getIndex(); i++; } @@ -443,7 +445,7 @@ public PermutationRotationState getState() { return new PermutationRotationState(rotations, permutations); } - public BoundedStackableItem getPermutation(int index) { + public IndexedStackableItem 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 44886b0e..86a4da6e 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,6 @@ import java.util.List; import com.github.skjolber.packing.api.StackValue; -import com.github.skjolber.packing.api.packager.BoundedStackableItem; public class DefaultLoadableItemPermutationRotationIterator extends AbstractLoadablePermutationRotationIterator { @@ -22,7 +21,7 @@ public DefaultLoadableItemPermutationRotationIterator build() { throw new IllegalStateException(); } - BoundedStackableItem[] matrix = toMatrix(); + IndexedStackableItem[] matrix = toMatrix(); return new DefaultLoadableItemPermutationRotationIterator(matrix); } @@ -37,12 +36,12 @@ public DefaultLoadableItemPermutationRotationIterator build() { // minimum volume from index i and above protected long[] minStackableVolume; - public DefaultLoadableItemPermutationRotationIterator(BoundedStackableItem[] matrix) { + public DefaultLoadableItemPermutationRotationIterator(IndexedStackableItem[] matrix) { super(matrix); int count = 0; - for (BoundedStackableItem loadableItem : matrix) { + for (IndexedStackableItem loadableItem : matrix) { if(loadableItem != null) { count += loadableItem.getCount(); } @@ -54,13 +53,13 @@ public DefaultLoadableItemPermutationRotationIterator(BoundedStackableItem[] mat } public StackValue getStackValue(int index) { - return loadableItems[permutations[index]].getLoadable().getStackValue(rotations[index]); + return loadableItems[permutations[index]].getStackable().getStackValue(rotations[index]); } public void removePermutations(int count) { // discard a number of items from the front for(int i = 0; i < count; i++) { - BoundedStackableItem loadableItem = loadableItems[permutations[i]]; + IndexedStackableItem loadableItem = loadableItems[permutations[i]]; loadableItem.decrement(); @@ -81,7 +80,7 @@ protected void initiatePermutation(int remainingCount) { int offset = 0; for (int j = 0; j < loadableItems.length; j++) { - BoundedStackableItem value = loadableItems[j]; + IndexedStackableItem value = loadableItems[j]; if(value != null && !value.isEmpty()) { for (int k = 0; k < value.getCount(); k++) { permutations[offset] = j; @@ -98,12 +97,12 @@ protected void initiatePermutation(int remainingCount) { } protected void calculateMinStackableVolume(int offset) { - StackValue last = loadableItems[permutations[permutations.length - 1]].getLoadable().getStackValue(rotations[permutations.length - 1]); + StackValue last = loadableItems[permutations[permutations.length - 1]].getStackable().getStackValue(rotations[permutations.length - 1]); minStackableVolume[permutations.length - 1] = last.getVolume(); for (int i = permutations.length - 2; i >= offset; i--) { - long volume = loadableItems[permutations[i]].getLoadable().getStackValue(rotations[i]).getVolume(); + long volume = loadableItems[permutations[i]].getStackable().getStackValue(rotations[i]).getVolume(); if(volume < minStackableVolume[i + 1]) { minStackableVolume[i] = volume; @@ -129,7 +128,7 @@ protected long[] getMinStackableVolume() { public void removePermutations(List removed) { for (Integer i : removed) { - BoundedStackableItem loadableItem = loadableItems[i]; + IndexedStackableItem loadableItem = loadableItems[i]; loadableItem.decrement(); @@ -150,7 +149,7 @@ public int nextRotation() { public int nextRotation(int maxIndex) { // next rotation for (int i = maxIndex; i >= 0; i--) { - if(rotations[i] < loadableItems[permutations[i]].getLoadable().getValues().size() - 1) { + if(rotations[i] < loadableItems[permutations[i]].getStackable().getStackValues().length - 1) { rotations[i]++; System.arraycopy(reset, 0, rotations, i + 1, rotations.length - (i + 1)); @@ -174,12 +173,12 @@ protected void resetRotations() { public long countRotations() { long n = 1; for (int i = 0; i < permutations.length; i++) { - BoundedStackableItem value = loadableItems[permutations[i]]; - if(Long.MAX_VALUE / value.getLoadable().getValues().size() <= n) { + IndexedStackableItem value = loadableItems[permutations[i]]; + if(Long.MAX_VALUE / value.getStackable().getStackValues().length <= n) { return -1L; } - n = n * value.getLoadable().getValues().size(); + n = n * value.getStackable().getStackValues().length; } return n; } @@ -197,7 +196,7 @@ public long countPermutations() { // fit within the container volume int maxCount = 0; - for (BoundedStackableItem value : loadableItems) { + for (IndexedStackableItem value : loadableItems) { if(value != null) { if(maxCount < value.getCount()) { maxCount = value.getCount(); @@ -208,7 +207,7 @@ public long countPermutations() { long n = 1; if(maxCount > 1) { int[] factors = new int[maxCount]; - for (BoundedStackableItem value : loadableItems) { + for (IndexedStackableItem value : loadableItems) { if(value != null) { for (int k = 0; k < value.getCount(); k++) { factors[k]++; @@ -345,7 +344,7 @@ public PermutationRotationState getState() { return new PermutationRotationState(rotations, permutations); } - public BoundedStackableItem getPermutation(int index) { + public IndexedStackableItem getPermutation(int index) { return loadableItems[permutations[index]]; } diff --git a/core/src/main/java/com/github/skjolber/packing/iterator/IndexedStackableItem.java b/core/src/main/java/com/github/skjolber/packing/iterator/IndexedStackableItem.java new file mode 100644 index 00000000..7b6deadf --- /dev/null +++ b/core/src/main/java/com/github/skjolber/packing/iterator/IndexedStackableItem.java @@ -0,0 +1,30 @@ +package com.github.skjolber.packing.iterator; + +import com.github.skjolber.packing.api.Stackable; +import com.github.skjolber.packing.api.StackableItem; +import com.github.skjolber.packing.api.packager.BoundedStackable; + +/** + * + * Stackable item which fit within certain bounds, i.e. load dimensions of a container. + * + */ + +public class IndexedStackableItem extends StackableItem { + + protected int index; + + public IndexedStackableItem(Stackable loadable, int count, int index) { + super(loadable, count); + this.index = index; + } + + public boolean isEmpty() { + return count == 0; + } + + public int getIndex() { + return 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 342438aa..7ae036d4 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,13 +1,11 @@ package com.github.skjolber.packing.iterator; -import com.github.skjolber.packing.api.packager.BoundedStackableItem; +public class MutableLoadableItem extends IndexedStackableItem { -public class MutableLoadableItem extends BoundedStackableItem { + public final IndexedStackableItem source; - public final BoundedStackableItem source; - - public MutableLoadableItem(BoundedStackableItem loadableItem) { - super(loadableItem.getLoadable(), loadableItem.getCount(), loadableItem.getIndex()); + public MutableLoadableItem(IndexedStackableItem loadableItem) { + super(loadableItem.getStackable(), 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 c719f2b1..cc59db74 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,7 +4,7 @@ import java.util.List; import com.github.skjolber.packing.api.StackValue; -import com.github.skjolber.packing.api.packager.BoundedStackableItem; +import com.github.skjolber.packing.api.StackableItem; import com.github.skjolber.packing.api.packager.StackableItems; /** @@ -32,7 +32,7 @@ public MutableLoadableItemPermutationRotationIterator build() { throw new IllegalStateException(); } - BoundedStackableItem[] matrix = toMatrix(); + IndexedStackableItem[] matrix = toMatrix(); return new MutableLoadableItemPermutationRotationIterator(matrix); } @@ -50,9 +50,9 @@ public MutableLoadableItemPermutationRotationIterator build() { protected final DefaultLoadableItemPermutationRotationIterator iterator; - protected final BoundedStackableItem[] loadableItems; // by index + protected final IndexedStackableItem[] loadableItems; // by index - public MutableLoadableItemPermutationRotationIterator(BoundedStackableItem[] loadableItems) { + public MutableLoadableItemPermutationRotationIterator(IndexedStackableItem[] 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++) { - BoundedStackableItem loadableItem = loadableItems[i]; + IndexedStackableItem loadableItem = loadableItems[i]; if(loadableItem != null && !loadableItem.isEmpty()) { mutableLoadableItems.add(new MutableLoadableItem(loadableItem)); } @@ -80,13 +80,13 @@ protected void resetFromIterator() { } - public BoundedStackableItem get(int index) { + public IndexedStackableItem get(int index) { return mutableLoadableItems.get(index); } @Override public StackValue getStackValue(int index) { - return loadableItems[mutablePermutations[index]].getLoadable().getStackValue(mutableRotations[index]); + return loadableItems[mutablePermutations[index]].getStackable().getStackValue(mutableRotations[index]); } @Override @@ -119,7 +119,7 @@ public int nextRotation(int maxIndex) { @Override public void remove(int index, int count) { - BoundedStackableItem loadableItem = mutableLoadableItems.get(index); + IndexedStackableItem loadableItem = mutableLoadableItems.get(index); loadableItem.decrement(count); if(loadableItem.isEmpty()) { @@ -249,12 +249,12 @@ public long countRotations() { public long countMutableRotations() { long n = 1; for (int i = 0; i < mutablePermutations.length; i++) { - BoundedStackableItem value = loadableItems[mutablePermutations[i]]; - if(Long.MAX_VALUE / value.getLoadable().getValues().size() <= n) { + IndexedStackableItem value = loadableItems[mutablePermutations[i]]; + if(Long.MAX_VALUE / value.getStackable().getStackValues().length <= n) { return -1L; } - n = n * value.getLoadable().getValues().size(); + n = n * value.getStackable().getStackValues().length; } return n; } @@ -271,7 +271,7 @@ public long countMutablePermutations() { // fit within the container volume int maxCount = 0; - for (BoundedStackableItem value : loadableItems) { + for (IndexedStackableItem 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 (BoundedStackableItem value : loadableItems) { + for (IndexedStackableItem 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/DefaultLoadableItemGroupPermutationRotationIteratorTest.java b/core/src/test/java/com/github/skjolber/packing/iterator/DefaultLoadableItemGroupPermutationRotationIteratorTest.java index bbc7b644..2be91a6c 100644 --- a/core/src/test/java/com/github/skjolber/packing/iterator/DefaultLoadableItemGroupPermutationRotationIteratorTest.java +++ b/core/src/test/java/com/github/skjolber/packing/iterator/DefaultLoadableItemGroupPermutationRotationIteratorTest.java @@ -23,24 +23,17 @@ void testPermutations() { List groups = new ArrayList<>(); - StackableItemGroup group1 = new StackableItemGroup(); List products1 = new ArrayList<>(); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("0").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("1").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("2").withWeight(1).build())); - group1.setItems(products1); - group1.setId("1"); - groups.add(group1); + groups.add(new StackableItemGroup("1", products1)); - StackableItemGroup group2 = new StackableItemGroup(); List products2 = new ArrayList<>(); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("3").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("4").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("5").withWeight(1).build())); - group2.setItems(products2); - group2.setId("2"); - - groups.add(group2); + groups.add(new StackableItemGroup("2", products2)); DefaultLoadableItemGroupPermutationRotationIterator rotator = DefaultLoadableItemGroupPermutationRotationIterator.newBuilder() .withLoadSize(container) @@ -65,26 +58,19 @@ void testPermutationsRepeatedItems() { List groups = new ArrayList<>(); - StackableItemGroup group1 = new StackableItemGroup(); List products1 = new ArrayList<>(); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("0").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("1").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("2").withWeight(1).build())); - group1.setItems(products1); - group1.setId("1"); - groups.add(group1); + groups.add(new StackableItemGroup("1", products1)); - StackableItemGroup group2 = new StackableItemGroup(); List products2 = new ArrayList<>(); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("3").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("4").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("5").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("6").withWeight(1).build(), 2)); - group2.setItems(products2); - group2.setId("2"); - - groups.add(group2); + groups.add(new StackableItemGroup("2", products2)); DefaultLoadableItemGroupPermutationRotationIterator rotator = DefaultLoadableItemGroupPermutationRotationIterator.newBuilder() .withLoadSize(container) @@ -109,25 +95,18 @@ void testRemovePermutations() { List groups = new ArrayList<>(); - StackableItemGroup group1 = new StackableItemGroup(); List products1 = new ArrayList<>(); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("0").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("1").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("2").withWeight(1).build())); - group1.setItems(products1); - group1.setId("1"); - groups.add(group1); + groups.add(new StackableItemGroup("1", products1)); - StackableItemGroup group2 = new StackableItemGroup(); List products2 = new ArrayList<>(); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("3").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("4").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("5").withWeight(1).build())); - group2.setItems(products2); - group2.setId("2"); - - groups.add(group2); + groups.add(new StackableItemGroup("2", products2)); DefaultLoadableItemGroupPermutationRotationIterator rotator = DefaultLoadableItemGroupPermutationRotationIterator.newBuilder() .withLoadSize(container) @@ -159,28 +138,21 @@ void testNexPermutationMaxIndexGroup1() { List groups = new ArrayList<>(); - StackableItemGroup group1 = new StackableItemGroup(); List products1 = new ArrayList<>(); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("0").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("1").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("2").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("3").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("4").withWeight(1).build())); - group1.setItems(products1); - group1.setId("1"); - groups.add(group1); + groups.add(new StackableItemGroup("1", products1)); - StackableItemGroup group2 = new StackableItemGroup(); List products2 = new ArrayList<>(); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("5").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("6").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("7").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("8").withWeight(1).build())); - group2.setItems(products2); - group2.setId("2"); - - groups.add(group2); + groups.add(new StackableItemGroup("2", products2)); DefaultLoadableItemGroupPermutationRotationIterator iterator = DefaultLoadableItemGroupPermutationRotationIterator.newBuilder() .withLoadSize(container) @@ -223,28 +195,20 @@ void testNexPermutationMaxIndexGroup2() { List groups = new ArrayList<>(); - StackableItemGroup group1 = new StackableItemGroup(); List products1 = new ArrayList<>(); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("0").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("1").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("2").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("3").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("4").withWeight(1).build())); - group1.setItems(products1); - group1.setId("1"); - groups.add(group1); - + groups.add(new StackableItemGroup("1", products1)); - StackableItemGroup group2 = new StackableItemGroup(); List products2 = new ArrayList<>(); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("5").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("6").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("7").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("8").withWeight(1).build())); - group2.setItems(products2); - group2.setId("2"); - - groups.add(group2); + groups.add(new StackableItemGroup("2", products2)); DefaultLoadableItemGroupPermutationRotationIterator iterator = DefaultLoadableItemGroupPermutationRotationIterator.newBuilder() .withLoadSize(container) @@ -287,28 +251,21 @@ void testNexPermutationMaxIndexTransitionGroup() { List groups = new ArrayList<>(); - StackableItemGroup group1 = new StackableItemGroup(); List products1 = new ArrayList<>(); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("0").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("1").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("2").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("3").withWeight(1).build())); products1.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("4").withWeight(1).build())); - group1.setItems(products1); - group1.setId("1"); - groups.add(group1); + groups.add(new StackableItemGroup("1", products1)); - StackableItemGroup group2 = new StackableItemGroup(); List products2 = new ArrayList<>(); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("5").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("6").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("7").withWeight(1).build())); products2.add(new StackableItem(Box.newBuilder().withRotate3D().withSize(1, 1, 3).withDescription("8").withWeight(1).build())); - group2.setItems(products2); - group2.setId("2"); - - groups.add(group2); + groups.add(new StackableItemGroup("2", products2)); DefaultLoadableItemGroupPermutationRotationIterator iterator = DefaultLoadableItemGroupPermutationRotationIterator.newBuilder() .withLoadSize(container) 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 0a0e454f..721615e8 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,7 +12,6 @@ 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.BoundedStackableItem; import com.github.skjolber.packing.api.packager.StackableItems; class MutableLoadablePermutationRotationIteratorTest extends AbstractLoadablePermutationRotationIteratorTest { @@ -59,8 +58,8 @@ void testMutableRotationCount() { items.remove(0, 1); for(int k = 0; k < items.size(); k++) { - BoundedStackableItem loadableItem = items.get(k); - assertFalse(loadableItem.getLoadable().getStackable().getId().equals("0")); + StackableItem loadableItem = items.get(k); + assertFalse(loadableItem.getStackable().getId().equals("0")); } rotate++;