Do not retain single-entry RangeSets 39/98839/4
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 3 Dec 2021 23:21:41 +0000 (00:21 +0100)
committerRobert Varga <nite@hq.sk>
Sat, 4 Dec 2021 08:15:37 +0000 (08:15 +0000)
ImmutableRangeSet with a single entry is a tad inefficient: we retain
the set and also a singleton list. Rather than doing that, store only
the single range -- reducing the number of objects we retain.

JIRA: YANGTOOLS-1376
Change-Id: I8a3b497fa4c4b8a0106136f056bb363d6e103930
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/AbstractConstraint.java [new file with mode: 0644]
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/ResolvedLengthConstraint.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/ResolvedRangeConstraint.java

diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/AbstractConstraint.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/type/AbstractConstraint.java
new file mode 100644 (file)
index 0000000..78be773
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.model.ri.type;
+
+import static com.google.common.base.Verify.verify;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableRangeSet;
+import com.google.common.collect.Range;
+import com.google.common.collect.RangeSet;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
+
+/**
+ * Abstract base class for {@link ResolvedLengthConstraint} and {@link ResolvedRangeConstraint}.
+ *
+ * @param <T> type of constraint
+ */
+abstract class AbstractConstraint<T extends Number & Comparable<T>> implements ConstraintMetaDefinition {
+    private final ConstraintMetaDefinition meta;
+    private final Object ranges;
+
+    AbstractConstraint(final ConstraintMetaDefinition meta, final RangeSet<T> ranges) {
+        this.meta = requireNonNull(meta);
+
+        final var tmp = ranges.asRanges();
+        if (tmp.size() == 1) {
+            this.ranges = tmp.iterator().next();
+        } else {
+            this.ranges = ImmutableRangeSet.copyOf(ranges);
+        }
+    }
+
+    @Override
+    public final Optional<String> getDescription() {
+        return meta.getDescription();
+    }
+
+    @Override
+    public final Optional<String> getErrorAppTag() {
+        return meta.getErrorAppTag();
+    }
+
+    @Override
+    public final Optional<String> getErrorMessage() {
+        return meta.getErrorMessage();
+    }
+
+    @Override
+    public final Optional<String> getReference() {
+        return meta.getReference();
+    }
+
+    @SuppressWarnings("unchecked")
+    final @NonNull ImmutableRangeSet<T> ranges() {
+        if (ranges instanceof ImmutableRangeSet) {
+            return (ImmutableRangeSet<T>) ranges;
+        }
+        verify(ranges instanceof Range, "Unexpected range object %s", ranges);
+        return ImmutableRangeSet.of((Range<T>) ranges);
+    }
+}
index 39dbf096f3dc0a36b5d3e8bab393b4064253743b..b38fdde4c83bf658259e26a4a3dba541242fe422 100644 (file)
@@ -7,45 +7,17 @@
  */
 package org.opendaylight.yangtools.yang.model.ri.type;
 
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.collect.ImmutableRangeSet;
 import com.google.common.collect.RangeSet;
-import java.util.Optional;
 import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
 
-final class ResolvedLengthConstraint implements LengthConstraint {
-    private final ConstraintMetaDefinition meta;
-    private final ImmutableRangeSet<Integer> ranges;
-
+final class ResolvedLengthConstraint extends AbstractConstraint<Integer> implements LengthConstraint {
     ResolvedLengthConstraint(final ConstraintMetaDefinition meta, final RangeSet<Integer> ranges) {
-        this.meta = requireNonNull(meta);
-        this.ranges = ImmutableRangeSet.copyOf(ranges);
-    }
-
-    @Override
-    public Optional<String> getDescription() {
-        return meta.getDescription();
-    }
-
-    @Override
-    public Optional<String> getErrorAppTag() {
-        return meta.getErrorAppTag();
-    }
-
-    @Override
-    public Optional<String> getErrorMessage() {
-        return meta.getErrorMessage();
-    }
-
-    @Override
-    public Optional<String> getReference() {
-        return meta.getReference();
+        super(meta, ranges);
     }
 
     @Override
     public RangeSet<Integer> getAllowedRanges() {
-        return ranges;
+        return ranges();
     }
 }
index e813d1ec6bcfa370429696931940879ecfcdb0ce..5a48bae8aa3ecb188e023684c12337f99006b955 100644 (file)
@@ -7,47 +7,19 @@
  */
 package org.opendaylight.yangtools.yang.model.ri.type;
 
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.collect.ImmutableRangeSet;
 import com.google.common.collect.RangeSet;
-import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
 
-final class ResolvedRangeConstraint<T extends Number & Comparable<T>> implements RangeConstraint<T>, Immutable {
-    private final ImmutableRangeSet<@NonNull T> ranges;
-    private final ConstraintMetaDefinition meta;
-
+final class ResolvedRangeConstraint<T extends Number & Comparable<T>>
+        extends AbstractConstraint<@NonNull T> implements RangeConstraint<T> {
     ResolvedRangeConstraint(final ConstraintMetaDefinition meta, final RangeSet<T> ranges) {
-        this.meta = requireNonNull(meta);
-        this.ranges = ImmutableRangeSet.copyOf(ranges);
-    }
-
-    @Override
-    public Optional<String> getDescription() {
-        return meta.getDescription();
-    }
-
-    @Override
-    public Optional<String> getErrorAppTag() {
-        return meta.getErrorAppTag();
-    }
-
-    @Override
-    public Optional<String> getErrorMessage() {
-        return meta.getErrorMessage();
-    }
-
-    @Override
-    public Optional<String> getReference() {
-        return meta.getReference();
+        super(meta, ranges);
     }
 
     @Override
     public RangeSet<@NonNull T> getAllowedRanges() {
-        return ranges;
+        return ranges();
     }
 }