From 577f01a27c1e566f48b825dd808f6ee22c4ce3ab Mon Sep 17 00:00:00 2001
From: Vojtech Moravec <vojtech.moravec.st@vsb.cz>
Date: Thu, 22 Oct 2020 13:23:15 +0200
Subject: [PATCH] HyperStackDimensions parsing util.

---
 .../java/cz/it4i/qcmp/cli/ParseUtils.java     | 66 +++++++++++++++++++
 .../it4i/qcmp/data/HyperStackDimensions.java  |  5 ++
 2 files changed, 71 insertions(+)

diff --git a/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java b/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java
index 5aa279b..aa261af 100644
--- a/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java
+++ b/src/main/java/cz/it4i/qcmp/cli/ParseUtils.java
@@ -1,9 +1,11 @@
 package cz.it4i.qcmp.cli;
 
+import cz.it4i.qcmp.data.HyperStackDimensions;
 import cz.it4i.qcmp.data.Range;
 import cz.it4i.qcmp.data.V2i;
 import cz.it4i.qcmp.data.V3i;
 
+import java.util.ArrayList;
 import java.util.Optional;
 
 public abstract class ParseUtils {
@@ -95,4 +97,68 @@ public abstract class ParseUtils {
         }
         return Optional.empty();
     }
+
+    /**
+     * Find all occurrences of c in string.
+     *
+     * @param string String to look for c in.
+     * @param c      Characted to find in the string.
+     * @return Array of all indexes in the string.
+     */
+    private static int[] findAllIndexesOfChar(final String string, final char c) {
+        final ArrayList<Integer> indexes = new ArrayList<>(2);
+
+        int index = string.indexOf(c);
+        while (index >= 0) {
+            indexes.add(index);
+            index = string.indexOf(c, index + 1);
+        }
+
+        return indexes.stream().mapToInt(Integer::intValue).toArray();
+    }
+
+    /**
+     * Tries to parse HyperStackDimensions from a string with delimiters.
+     *
+     * @param hyperStackDimensionsString String containing the dimensions.
+     * @param delimiter                  Delimiter.
+     * @return Parsed HyperStackDimensions or empty optional.
+     */
+    public static Optional<HyperStackDimensions> tryParseHyperStackDimensions(final String hyperStackDimensionsString,
+                                                                              final char delimiter) {
+        final String string = (delimiter != ' ') ? removeSpacesInString(hyperStackDimensionsString) : hyperStackDimensionsString;
+
+        final int[] indexes = findAllIndexesOfChar(string, delimiter);
+
+        if ((indexes.length < 1) || (indexes.length > 3))
+            return Optional.empty();
+
+        int x = -1;
+        int y = -1;
+        int z = 1;
+        int t = 1;
+
+        // Required part.
+        final Optional<Integer> maybeX = tryParseInt(string.substring(0, indexes[0]));
+        final Optional<Integer> maybeY = tryParseInt(string.substring(indexes[0] + 1, indexes.length > 1 ? indexes[1] : string.length()));
+        if (!maybeX.isPresent() || !maybeY.isPresent())
+            return Optional.empty();
+        x = maybeX.get();
+        y = maybeY.get();
+
+        if (indexes.length > 1) {
+            final Optional<Integer> maybeZ = tryParseInt(string.substring(indexes[1], indexes.length > 2 ? indexes[2] : string.length()));
+            if (!maybeZ.isPresent())
+                return Optional.empty();
+            z = maybeZ.get();
+
+            if (indexes.length > 2) {
+                final Optional<Integer> maybeT = tryParseInt(string.substring(indexes[2]));
+                if (!maybeT.isPresent())
+                    return Optional.empty();
+                t = maybeT.get();
+            }
+        }
+        return Optional.of(new HyperStackDimensions(x, y, z, t));
+    }
 }
diff --git a/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java b/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java
index 652486d..140eee7 100644
--- a/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java
+++ b/src/main/java/cz/it4i/qcmp/data/HyperStackDimensions.java
@@ -82,4 +82,9 @@ public class HyperStackDimensions {
     public final int getNumberOfTimepoints() {
         return numberOfTimepoints;
     }
+
+    @Override
+    public String toString() {
+        return String.format("X=%d;Y=%d;Z=%d;T=%d", width, height, sliceCount, numberOfTimepoints);
+    }
 }
-- 
GitLab