This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-imaging.git

commit 83e7540bc9654001825e0c2325801b1387bbe5ad
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Sat May 13 17:50:37 2023 -0400

    Smarter allocation checking
---
 pom.xml                                            |  6 +++
 .../apache/commons/imaging/common/Allocator.java   |  7 ++--
 .../commons/imaging/common/BasicCParser.java       |  2 +-
 .../commons/imaging/common/RationalNumber.java     |  2 +
 .../imaging/formats/ico/IcoImageParser.java        |  7 ++--
 .../imaging/formats/jpeg/decoder/Block.java        |  1 +
 .../imaging/formats/jpeg/decoder/JpegDecoder.java  |  6 +--
 .../formats/jpeg/decoder/JpegInputStream.java      |  1 +
 .../imaging/formats/jpeg/segments/SofnSegment.java |  3 +-
 .../imaging/formats/jpeg/segments/SosSegment.java  |  3 +-
 .../formats/tiff/fieldtypes/FieldTypeAscii.java    |  2 +-
 .../formats/tiff/fieldtypes/FieldTypeRational.java |  6 ++-
 .../formats/tiff/taginfos/TagInfoAscii.java        |  2 +-
 .../formats/tiff/write/ImageDataOffsets.java       |  2 +-
 .../commons/imaging/icc/IccProfileParser.java      |  2 +-
 .../commons/imaging/palette/ColorSpaceSubset.java  |  1 +
 .../commons/imaging/palette/QuantizedPalette.java  |  2 +-
 .../imaging/formats/ico/PrintShallowSizes.java}    | 22 +++--------
 .../formats/jpeg/decoder/PrintShallowSizes.java}   | 21 +++-------
 .../formats/tiff/write/PrintShallowSizes.java}     | 21 +++-------
 .../imaging/palette/PrintShallowSizes.java}        | 21 +++-------
 .../imaging/test/util/PrintShallowObjectSizes.java | 45 ++++++++++++++++++++++
 22 files changed, 101 insertions(+), 84 deletions(-)

diff --git a/pom.xml b/pom.xml
index f724a2e5..d720bd4f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -229,6 +229,12 @@
       <artifactId>commons-io</artifactId>
       <version>2.11.0</version>
     </dependency>
+    <dependency>
+      <groupId>org.openjdk.jol</groupId>
+      <artifactId>jol-core</artifactId>
+      <version>0.17</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <reporting>
diff --git a/src/main/java/org/apache/commons/imaging/common/Allocator.java 
b/src/main/java/org/apache/commons/imaging/common/Allocator.java
index 873250e9..979adeb4 100644
--- a/src/main/java/org/apache/commons/imaging/common/Allocator.java
+++ b/src/main/java/org/apache/commons/imaging/common/Allocator.java
@@ -55,14 +55,13 @@ public class Allocator {
      * @param <T> The return array type
      * @param request The requested size.
      * @param factory The array factory.
+     * @param shallowByteSize The shallow byte size.
      * @return a new byte array.
      * @throws AllocationRequestException Thrown when the request exceeds the 
limit.
      * @see #check(int)
      */
-    public static <T> T[] array(final int request, final IntFunction<T[]> 
factory) {
-        // We could pass in a shallow object byte size to multiply with the 
request.
-        // The shallow byte size would need to be computed and hard-coded in 
statics.
-        return factory.apply(check(request));
+    public static <T> T[] array(final int request, final IntFunction<T[]> 
factory, final int shallowByteSize) {
+        return factory.apply(check(request * shallowByteSize));
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/imaging/common/BasicCParser.java 
b/src/main/java/org/apache/commons/imaging/common/BasicCParser.java
index 2b4d67c6..3fbd432c 100644
--- a/src/main/java/org/apache/commons/imaging/common/BasicCParser.java
+++ b/src/main/java/org/apache/commons/imaging/common/BasicCParser.java
@@ -353,7 +353,7 @@ public class BasicCParser {
                 ++numLiveTokens;
             }
         }
-        final String[] liveTokens = Allocator.array(numLiveTokens, 
String[]::new);
+        final String[] liveTokens = Allocator.array(numLiveTokens, 
String[]::new, 24);
         int next = 0;
         for (final String token : tokens) {
             if (token != null && !token.isEmpty()) {
diff --git 
a/src/main/java/org/apache/commons/imaging/common/RationalNumber.java 
b/src/main/java/org/apache/commons/imaging/common/RationalNumber.java
index 4e4eccf3..5312bce5 100644
--- a/src/main/java/org/apache/commons/imaging/common/RationalNumber.java
+++ b/src/main/java/org/apache/commons/imaging/common/RationalNumber.java
@@ -182,6 +182,8 @@ public class RationalNumber extends Number {
 
     public final boolean unsignedType;
 
+    public static final int SHALLOW_SIZE = 32;
+
     /**
      * Constructs an instance based on signed integers
      * @param numerator a 32-bit signed integer
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
index f650ce80..aaf16562 100644
--- a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
@@ -161,7 +161,7 @@ public class IcoImageParser extends 
ImageParser<IcoImagingParameters> {
                 throws ImageReadException;
     }
 
-    private static class IconInfo {
+    static class IconInfo {
         public final byte width;
         public final byte height;
         public final byte colorCount;
@@ -170,6 +170,7 @@ public class IcoImageParser extends 
ImageParser<IcoImagingParameters> {
         public final int bitCount;
         public final int imageSize;
         public final int imageOffset;
+        static final int SHALLOW_SIZE = 32;
 
         IconInfo(final byte width, final byte height,
                 final byte colorCount, final byte reserved, final int planes,
@@ -580,12 +581,12 @@ public class IcoImageParser extends 
ImageParser<IcoImagingParameters> {
         try (InputStream is = byteSource.getInputStream()) {
             final FileHeader fileHeader = readFileHeader(is);
 
-            final IconInfo[] fIconInfos = 
Allocator.array(fileHeader.iconCount, IconInfo[]::new);
+            final IconInfo[] fIconInfos = 
Allocator.array(fileHeader.iconCount, IconInfo[]::new, IconInfo.SHALLOW_SIZE);
             for (int i = 0; i < fileHeader.iconCount; i++) {
                 fIconInfos[i] = readIconInfo(is);
             }
 
-            final IconData[] fIconDatas = 
Allocator.array(fileHeader.iconCount, IconData[]::new);
+            final IconData[] fIconDatas = 
Allocator.array(fileHeader.iconCount, IconData[]::new, 32);
             for (int i = 0; i < fileHeader.iconCount; i++) {
                 final byte[] iconData = byteSource.getBlock(
                         fIconInfos[i].imageOffset, fIconInfos[i].imageSize);
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java
index 8fa21961..281f9b7e 100644
--- a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java
+++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java
@@ -21,6 +21,7 @@ final class Block {
     final int[] samples;
     final int width;
     final int height;
+    static final int SHALLOW_SIZE = 24;
 
     Block(final int width, final int height) {
         this.samples = Allocator.intArray(width * height);
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java
 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java
index 75d9aeee..d91f3f0a 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java
@@ -109,7 +109,7 @@ public class JpegDecoder extends BinaryFileParser 
implements JpegUtils.Visitor {
         final List<Integer> intervalStarts = 
getIntervalStartPositions(scanPayload);
         // get number of intervals in payload to init an array of appropriate 
length
         final int intervalCount = intervalStarts.size();
-        final JpegInputStream[] streams = Allocator.array(intervalCount, 
JpegInputStream[]::new);
+        final JpegInputStream[] streams = Allocator.array(intervalCount, 
JpegInputStream[]::new, JpegInputStream.SHALLOW_SIZE);
         for (int i = 0; i < intervalCount; i++) {
             final int from = intervalStarts.get(i);
             int to;
@@ -142,7 +142,7 @@ public class JpegDecoder extends BinaryFileParser 
implements JpegUtils.Visitor {
     private final float[] block = new float[64];
 
     private Block[] allocateMCUMemory() throws ImageReadException {
-        final Block[] mcu = Allocator.array(sosSegment.numberOfComponents, 
Block[]::new);
+        final Block[] mcu = Allocator.array(sosSegment.numberOfComponents, 
Block[]::new, 24);
         for (int i = 0; i < sosSegment.numberOfComponents; i++) {
             final SosSegment.Component scanComponent = 
sosSegment.getComponents(i);
             SofnSegment.Component frameComponent = null;
@@ -445,7 +445,7 @@ public class JpegDecoder extends BinaryFileParser 
implements JpegUtils.Visitor {
             final int xMCUs = (sofnSegment.width + hSize - 1) / hSize;
             final int yMCUs = (sofnSegment.height + vSize - 1) / vSize;
             final Block[] mcu = allocateMCUMemory();
-            final Block[] scaledMCU = Allocator.array(mcu.length, 
Block[]::new);
+            final Block[] scaledMCU = Allocator.array(mcu.length, 
Block[]::new, Block.SHALLOW_SIZE);
             Arrays.setAll(scaledMCU, i -> new Block(hSize, vSize));
             final int[] preds = 
Allocator.intArray(sofnSegment.numberOfComponents);
             ColorModel colorModel;
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java
 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java
index a6fa6fcf..67cfbe98 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java
@@ -27,6 +27,7 @@ class JpegInputStream {
     private int nextPos;
     private int cnt;
     private int b;
+    static final int SHALLOW_SIZE = 32;
 
     JpegInputStream(final int[] interval) {
         this.interval = Arrays.copyOf(interval, interval.length);
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java
 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java
index 99278825..72f0aa27 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java
@@ -36,6 +36,7 @@ public class SofnSegment extends Segment {
         public final int horizontalSamplingFactor;
         public final int verticalSamplingFactor;
         public final int quantTabDestSelector;
+        static final int SHALLOW_SIZE = 32;
 
         public Component(final int componentIdentifier, final int 
horizontalSamplingFactor,
                 final int veritcalSamplingFactor, final int 
quantTabDestSelector) {
@@ -74,7 +75,7 @@ public class SofnSegment extends Segment {
         if (numberOfComponents < 0) {
             throw new ImageReadException("The number of components in a 
SOF0Segment cannot be less than 0!");
         }
-        components = Allocator.array(numberOfComponents, Component[]::new);
+        components = Allocator.array(numberOfComponents, Component[]::new, 
Component.SHALLOW_SIZE);
         for (int i = 0; i < numberOfComponents; i++) {
             final int componentIdentifier = readByte("ComponentIdentifier", is,
                     "Not a Valid JPEG File");
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java
 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java
index 620c885f..61a74532 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java
@@ -32,6 +32,7 @@ public class SosSegment extends Segment {
         public final int scanComponentSelector;
         public final int dcCodingTableSelector;
         public final int acCodingTableSelector;
+        static final int SHALLOW_SIZE = 24;
 
         public Component(final int scanComponentSelector, final int 
dcCodingTableSelector,
                 final int acCodingTableSelector) {
@@ -68,7 +69,7 @@ public class SosSegment extends Segment {
         // Debug.debug("number_of_components_in_scan",
         // numberOfComponents);
 
-        components = Allocator.array(numberOfComponents, Component[]::new);
+        components = Allocator.array(numberOfComponents, Component[]::new, 
Component.SHALLOW_SIZE);
         for (int i = 0; i < numberOfComponents; i++) {
             final int scanComponentSelector = 
readByte("scanComponentSelector", is, "Not a Valid JPEG File");
             // Debug.debug("scanComponentSelector", scanComponentSelector);
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java
 
b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java
index 5b354783..5ec277c5 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java
@@ -40,7 +40,7 @@ public class FieldTypeAscii extends FieldType {
                 nullCount++;
             }
         }
-        final String[] strings = Allocator.array(nullCount, String[]::new);
+        final String[] strings = Allocator.array(nullCount, String[]::new, 24);
         int stringsAdded = 0;
         strings[0] = ""; // if we have a 0 length string
         int nextStringPos = 0;
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java
 
b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java
index 04572b81..a0ae6839 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java
@@ -57,7 +57,8 @@ public class FieldTypeRational extends FieldType {
         }
         if (o instanceof Number[]) {
             final Number[] numbers = (Number[]) o;
-            final RationalNumber[] rationalNumbers = 
Allocator.array(numbers.length, RationalNumber[]::new);
+            final RationalNumber[] rationalNumbers = 
Allocator.array(numbers.length, RationalNumber[]::new,
+                    RationalNumber.SHALLOW_SIZE);
             Arrays.setAll(rationalNumbers, RationalNumber::valueOf);
             return ByteConversions.toBytes(rationalNumbers, byteOrder);
         }
@@ -65,7 +66,8 @@ public class FieldTypeRational extends FieldType {
             throw new ImageWriteException("Invalid data", o);
         }
         final double[] numbers = (double[]) o;
-        final RationalNumber[] rationalNumbers = 
Allocator.array(numbers.length, RationalNumber[]::new);
+        final RationalNumber[] rationalNumbers = 
Allocator.array(numbers.length, RationalNumber[]::new,
+                RationalNumber.SHALLOW_SIZE);
         Arrays.setAll(rationalNumbers, RationalNumber::valueOf);
         return ByteConversions.toBytes(rationalNumbers, byteOrder);
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java
 
b/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java
index 2f14e99f..e7e52d12 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java
@@ -42,7 +42,7 @@ public class TagInfoAscii extends TagInfo {
                 nullCount++;
             }
         }
-        final String[] strings = Allocator.array(nullCount + 1, String[]::new);
+        final String[] strings = Allocator.array(nullCount + 1, String[]::new, 
24);
         int stringsAdded = 0;
         strings[0] = ""; // if we have a 0 length string
         int nextStringPos = 0;
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
 
b/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
index 8511009d..bc1f24e5 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
+++ 
b/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
@@ -30,7 +30,7 @@ class ImageDataOffsets {
         this.imageDataOffsets = imageDataOffsets;
         this.imageDataOffsetsField = imageDataOffsetsField;
 
-        outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new);
+        outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new, 
24);
         Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image 
data", imageData[i].getData()));
 
     }
diff --git a/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java 
b/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java
index 90b85c62..559aea3e 100644
--- a/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java
+++ b/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java
@@ -249,7 +249,7 @@ public class IccProfileParser extends BinaryFileParser {
             final int tagCount = read4Bytes("TagCount", is, "Not a Valid ICC 
Profile", getByteOrder());
 
             // List tags = new ArrayList();
-            final IccTag[] tags = Allocator.array(tagCount, IccTag[]::new);
+            final IccTag[] tags = Allocator.array(tagCount, IccTag[]::new, 40);
 
             for (int i = 0; i < tagCount; i++) {
                 final int tagSignature = read4Bytes("TagSignature[" + i + "]", 
is, "Not a Valid ICC Profile", getByteOrder());
diff --git 
a/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java 
b/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java
index b96328f4..0bb19a1e 100644
--- a/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java
+++ b/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java
@@ -43,6 +43,7 @@ class ColorSpaceSubset {
 
     // the index in the palette.
     private int index;
+    static final int SHALLOW_SIZE = 40;
 
     ColorSpaceSubset(final int total, final int precision) {
         this.total = total;
diff --git 
a/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java 
b/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java
index 4595bf29..80fe80db 100644
--- a/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java
+++ b/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java
@@ -32,7 +32,7 @@ public class QuantizedPalette implements Palette {
         this.subsets = subsets == null ? Collections.emptyList() : 
Collections.unmodifiableList(subsets);
         this.precision = precision;
 
-        straight = Allocator.array(1 << (precision * 3), 
ColorSpaceSubset[]::new);
+        straight = Allocator.array(1 << (precision * 3), 
ColorSpaceSubset[]::new, ColorSpaceSubset.SHALLOW_SIZE);
 
         for (int i = 0; i < this.subsets.size(); i++) {
             final ColorSpaceSubset subset = subsets.get(i);
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
 b/src/test/java/org/apache/commons/imaging/formats/ico/PrintShallowSizes.java
similarity index 50%
copy from 
src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
copy to 
src/test/java/org/apache/commons/imaging/formats/ico/PrintShallowSizes.java
index 8511009d..cdfc6fb2 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
+++ 
b/src/test/java/org/apache/commons/imaging/formats/ico/PrintShallowSizes.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.imaging.formats.tiff.write;
 
-import java.util.Arrays;
+package org.apache.commons.imaging.formats.ico;
 
-import org.apache.commons.imaging.common.Allocator;
-import org.apache.commons.imaging.formats.tiff.TiffElement;
+import org.apache.commons.imaging.formats.ico.IcoImageParser.IconInfo;
+import org.apache.commons.imaging.test.util.PrintShallowObjectSizes;
 
-class ImageDataOffsets {
-    final int[] imageDataOffsets;
-    final TiffOutputField imageDataOffsetsField;
-    final TiffOutputItem[] outputItems;
-
-    ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] 
imageDataOffsets, final TiffOutputField imageDataOffsetsField) {
-        this.imageDataOffsets = imageDataOffsets;
-        this.imageDataOffsetsField = imageDataOffsetsField;
-
-        outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new);
-        Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image 
data", imageData[i].getData()));
+public class PrintShallowSizes {
 
+    public static void main(final String[] args) {
+        PrintShallowObjectSizes.print(IconInfo.class);
     }
-
 }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
 
b/src/test/java/org/apache/commons/imaging/formats/jpeg/decoder/PrintShallowSizes.java
similarity index 50%
copy from 
src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
copy to 
src/test/java/org/apache/commons/imaging/formats/jpeg/decoder/PrintShallowSizes.java
index 8511009d..16d6d957 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
+++ 
b/src/test/java/org/apache/commons/imaging/formats/jpeg/decoder/PrintShallowSizes.java
@@ -14,25 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.imaging.formats.tiff.write;
 
-import java.util.Arrays;
+package org.apache.commons.imaging.formats.jpeg.decoder;
 
-import org.apache.commons.imaging.common.Allocator;
-import org.apache.commons.imaging.formats.tiff.TiffElement;
+import org.apache.commons.imaging.test.util.PrintShallowObjectSizes;
 
-class ImageDataOffsets {
-    final int[] imageDataOffsets;
-    final TiffOutputField imageDataOffsetsField;
-    final TiffOutputItem[] outputItems;
-
-    ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] 
imageDataOffsets, final TiffOutputField imageDataOffsetsField) {
-        this.imageDataOffsets = imageDataOffsets;
-        this.imageDataOffsetsField = imageDataOffsetsField;
-
-        outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new);
-        Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image 
data", imageData[i].getData()));
+public class PrintShallowSizes {
 
+    public static void main(final String[] args) {
+        PrintShallowObjectSizes.print(Block.class, JpegInputStream.class);
     }
-
 }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
 
b/src/test/java/org/apache/commons/imaging/formats/tiff/write/PrintShallowSizes.java
similarity index 54%
copy from 
src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
copy to 
src/test/java/org/apache/commons/imaging/formats/tiff/write/PrintShallowSizes.java
index 8511009d..23fc8e3f 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
+++ 
b/src/test/java/org/apache/commons/imaging/formats/tiff/write/PrintShallowSizes.java
@@ -14,25 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.imaging.formats.tiff.write;
-
-import java.util.Arrays;
-
-import org.apache.commons.imaging.common.Allocator;
-import org.apache.commons.imaging.formats.tiff.TiffElement;
 
-class ImageDataOffsets {
-    final int[] imageDataOffsets;
-    final TiffOutputField imageDataOffsetsField;
-    final TiffOutputItem[] outputItems;
+package org.apache.commons.imaging.formats.tiff.write;
 
-    ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] 
imageDataOffsets, final TiffOutputField imageDataOffsetsField) {
-        this.imageDataOffsets = imageDataOffsets;
-        this.imageDataOffsetsField = imageDataOffsetsField;
+import org.apache.commons.imaging.test.util.PrintShallowObjectSizes;
 
-        outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new);
-        Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image 
data", imageData[i].getData()));
+public class PrintShallowSizes {
 
+    public static void main(final String[] args) {
+        PrintShallowObjectSizes.print(TiffOutputItem.class);
     }
-
 }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
 b/src/test/java/org/apache/commons/imaging/palette/PrintShallowSizes.java
similarity index 50%
copy from 
src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
copy to src/test/java/org/apache/commons/imaging/palette/PrintShallowSizes.java
index 8511009d..4ef9bf1e 100644
--- 
a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java
+++ b/src/test/java/org/apache/commons/imaging/palette/PrintShallowSizes.java
@@ -14,25 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.imaging.formats.tiff.write;
 
-import java.util.Arrays;
+package org.apache.commons.imaging.palette;
 
-import org.apache.commons.imaging.common.Allocator;
-import org.apache.commons.imaging.formats.tiff.TiffElement;
+import org.apache.commons.imaging.test.util.PrintShallowObjectSizes;
 
-class ImageDataOffsets {
-    final int[] imageDataOffsets;
-    final TiffOutputField imageDataOffsetsField;
-    final TiffOutputItem[] outputItems;
-
-    ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] 
imageDataOffsets, final TiffOutputField imageDataOffsetsField) {
-        this.imageDataOffsets = imageDataOffsets;
-        this.imageDataOffsetsField = imageDataOffsetsField;
-
-        outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new);
-        Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image 
data", imageData[i].getData()));
+public class PrintShallowSizes {
 
+    public static void main(final String[] args) {
+        PrintShallowObjectSizes.print(ColorSpaceSubset.class);
     }
-
 }
diff --git 
a/src/test/java/org/apache/commons/imaging/test/util/PrintShallowObjectSizes.java
 
b/src/test/java/org/apache/commons/imaging/test/util/PrintShallowObjectSizes.java
new file mode 100644
index 00000000..0f6c2685
--- /dev/null
+++ 
b/src/test/java/org/apache/commons/imaging/test/util/PrintShallowObjectSizes.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.imaging.test.util;
+
+import org.apache.commons.imaging.common.RationalNumber;
+import org.apache.commons.imaging.icc.IccTag;
+import org.openjdk.jol.info.ClassLayout;
+
+public class PrintShallowObjectSizes {
+
+    public static void print(final Class<?>... classes) {
+        new PrintShallowObjectSizes().go(classes);
+    }
+
+    public static void main(final String[] args) {
+        new PrintShallowObjectSizes().go(String.class,
+                
org.apache.commons.imaging.formats.jpeg.segments.SofnSegment.Component.class,
+                
org.apache.commons.imaging.formats.jpeg.segments.SosSegment.Component.class, 
RationalNumber.class,
+                IccTag.class);
+    }
+
+    public void go(final Class<?>... classes) {
+        for (final Class<?> cls : classes) {
+            final ClassLayout classLayout = ClassLayout.parseClass(cls);
+            // System.out.println(classLayout.toPrintable());
+            System.out.printf("%s shallow size = %,d bytes%n", cls, 
classLayout.instanceSize());
+        }
+
+    }
+}

Reply via email to