1 package org.simantics.utils.datastructures.slice;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\r
5 import java.util.Collections;
\r
8 * @author Tuukka Lehtonen
\r
10 public final class SliceUtil {
\r
12 public static final int MAX_NODES_PER_LEVEL_EXP = 2;
\r
19 public static <T extends Sliceable<T>> Collection<T> subnodify(Sliceable<T> prop) {
\r
20 return subnodify(prop, prop.getRange());
\r
29 public static <T extends Sliceable<T>> Collection<T> subnodify(Sliceable<T> prop, ValueRange range) {
\r
30 return subnodify(prop, range.start(), range.size(), MAX_NODES_PER_LEVEL_EXP);
\r
40 public static <T extends Sliceable<T>> Collection<T> subnodify(Sliceable<T> prop, int rangeStart, int rangeSize) {
\r
41 return subnodify(prop, rangeStart, rangeSize, MAX_NODES_PER_LEVEL_EXP);
\r
49 * @param pow10OfItemsPerLevel
\r
52 public static <T> Collection<T> subnodify(Object p, int rangeStart, int rangeSize, int pow10OfItemsPerLevel) {
\r
54 return Collections.emptyList();
\r
55 if (!(p instanceof Sliceable<?>))
\r
56 return Collections.emptyList();
\r
58 @SuppressWarnings("unchecked")
\r
59 Sliceable<T> prop = (Sliceable<T>) p;
\r
61 // Defaults for <= 100 nodes
\r
62 int nodes = rangeSize;
\r
63 int intervalSize = 1;
\r
65 int maxNodesPerLevel = (int) Math.pow(10, pow10OfItemsPerLevel);
\r
67 if (rangeSize > maxNodesPerLevel) {
\r
68 double intervalSizeExp = Math.floor(Math.log10(rangeSize));
\r
69 double intervalMaxSize = Math.pow(10, intervalSizeExp);
\r
70 //System.out.println("EXP: " + intervalSizeExp + " => " + intervalMaxSize);
\r
71 if ((int) intervalMaxSize == rangeSize) {
\r
72 // Need to make the amount of shown children smaller.
\r
73 // As a minimum, always leave at least MAX_NODES_PER_LEVEL
\r
74 // elements into the leaf nodes.
\r
75 intervalMaxSize = Math.pow(10, Math.max(intervalSizeExp - pow10OfItemsPerLevel, pow10OfItemsPerLevel));
\r
76 //System.out.println("EXP2: " + intervalMaxSize);
\r
78 nodes = (int) (Math.ceil(rangeSize / intervalMaxSize));
\r
79 intervalSize = (int) intervalMaxSize;
\r
82 int start = rangeStart;
\r
83 int sizeLeft = rangeSize;
\r
85 //System.out.println("SUBNODIFY: " + rangeStart + ", " + rangeSize + " => " + intervalSize + ", " + nodes);
\r
87 ArrayList<T> result = new ArrayList<T>(nodes);
\r
88 for (int i = 0; i < nodes; ++i) {
\r
89 result.add(prop.slice(ValueRange.make(start, Math.min(intervalSize, sizeLeft))));
\r
90 //System.out.println(result.get(result.size()-1));
\r
91 start += intervalSize;
\r
92 sizeLeft -= intervalSize;
\r