Specialize ContainerEffectiveStatementImpl 52/98852/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 6 Dec 2021 08:42:47 +0000 (09:42 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 6 Dec 2021 10:40:23 +0000 (11:40 +0100)
We can improve class layout by omitting the argument if it was unchanged
relative to declaration. Split the implementation into two classes.

JIRA: YANGTOOLS-1316
Change-Id: I2852f35d9f22cbdad70fa3a4786cfba7cc9c5faf
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/EffectiveStatements.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractContainerEffectiveStatement.java [moved from model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/ContainerEffectiveStatementImpl.java with 76% similarity]
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyContainerEffectiveStatement.java [new file with mode: 0644]
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/RegularContainerEffectiveStatement.java [new file with mode: 0644]

index aec44da1e449a96878765d08f494a0f7a3ae5b6c..1f70204a9cbec749c0e6fed405069698e509ac0e 100644 (file)
@@ -153,11 +153,11 @@ import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRequireInstanceStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyStatusStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyYangVersionStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractLeafEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ActionEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AugmentEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ChoiceEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ContainerEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredCaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredInputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredOutputEffectiveStatement;
@@ -171,6 +171,7 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBelongsToEffe
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBitEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyConfigEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyContactEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDescriptionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyEnumEffectiveStatement;
@@ -224,6 +225,7 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBelongsToEf
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBitEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularConfigEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularContactEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDescriptionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularEnumEffectiveStatement;
@@ -419,13 +421,17 @@ public final class EffectiveStatements {
 
     public static ContainerEffectiveStatement copyContainer(final ContainerEffectiveStatement original,
             final QName argument, final int flags) {
-        checkArgument(original instanceof ContainerEffectiveStatementImpl, "Unsupported original %s", original);
-        return new ContainerEffectiveStatementImpl((ContainerEffectiveStatementImpl) original, argument, flags);
+        checkArgument(original instanceof AbstractContainerEffectiveStatement, "Unsupported original %s", original);
+        final var orig = (AbstractContainerEffectiveStatement) original;
+        return argument.equals(orig.getDeclared().argument()) ? new EmptyContainerEffectiveStatement(orig, flags)
+            : new RegularContainerEffectiveStatement(orig, argument, flags);
     }
 
     public static ContainerEffectiveStatement createContainer(final ContainerStatement declared, final QName argument,
             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-        return new ContainerEffectiveStatementImpl(declared, substatements, argument, flags);
+        return argument.equals(declared.argument())
+            ? new EmptyContainerEffectiveStatement(declared, substatements, flags)
+                : new RegularContainerEffectiveStatement(declared, substatements, argument, flags);
     }
 
     public static DefaultEffectiveStatement createDefault(final DefaultStatement declared,
@@ -7,10 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
 
-import static java.util.Objects.requireNonNull;
-
 import com.google.common.collect.ImmutableList;
-import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -28,7 +25,7 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.M
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.NotificationNodeContainerMixin;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.PresenceMixin;
 
-public final class ContainerEffectiveStatementImpl
+public abstract class AbstractContainerEffectiveStatement
         extends WithTypedefNamespace<QName, ContainerStatement, ContainerEffectiveStatement>
         implements ContainerEffectiveStatement, ContainerSchemaNode, DataSchemaNodeMixin<ContainerStatement>,
             DataNodeContainerMixin<QName, ContainerStatement>, ActionNodeContainerMixin<QName, ContainerStatement>,
@@ -37,52 +34,41 @@ public final class ContainerEffectiveStatementImpl
             NotificationNodeContainerCompat<QName, ContainerStatement, ContainerEffectiveStatement>,
             MustConstraintMixin<QName, ContainerStatement>, PresenceMixin<QName, ContainerStatement>,
             AugmentationTargetMixin<QName, ContainerStatement> {
-
     private final int flags;
-    private final @NonNull QName argument;
 
-    public ContainerEffectiveStatementImpl(final ContainerStatement declared,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
-            final int flags) {
+    AbstractContainerEffectiveStatement(final ContainerStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final int flags) {
         super(declared, substatements);
-        this.argument = requireNonNull(argument);
         this.flags = flags;
     }
 
-    public ContainerEffectiveStatementImpl(final ContainerEffectiveStatementImpl origEffective, final QName argument,
-            final int flags) {
+    AbstractContainerEffectiveStatement(final AbstractContainerEffectiveStatement origEffective, final int flags) {
         super(origEffective);
-        this.argument = requireNonNull(argument);
         this.flags = flags;
     }
 
     @Override
-    public int flags() {
+    public final int flags() {
         return flags;
     }
 
     @Override
-    public QName argument() {
-        return argument;
-    }
-
-    @Override
-    public boolean isPresenceContainer() {
+    public final boolean isPresenceContainer() {
         return presence();
     }
 
     @Override
-    public DataSchemaNode dataChildByName(final QName name) {
+    public final DataSchemaNode dataChildByName(final QName name) {
         return dataSchemaNode(name);
     }
 
     @Override
-    public ContainerEffectiveStatement asEffectiveStatement() {
+    public final ContainerEffectiveStatement asEffectiveStatement() {
         return this;
     }
 
     @Override
-    public String toString() {
-        return "container " + argument.getLocalName();
+    public final String toString() {
+        return "container " + argument().getLocalName();
     }
 }
diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyContainerEffectiveStatement.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyContainerEffectiveStatement.java
new file mode 100644 (file)
index 0000000..c82933e
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.stmt.impl.eff;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
+
+public final class EmptyContainerEffectiveStatement extends AbstractContainerEffectiveStatement {
+    public EmptyContainerEffectiveStatement(final ContainerStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final int flags) {
+        super(declared, substatements, flags);
+    }
+
+    public EmptyContainerEffectiveStatement(final AbstractContainerEffectiveStatement original, final int flags) {
+        super(original, flags);
+    }
+
+    @Override
+    public QName argument() {
+        return getDeclared().argument();
+    }
+}
diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/RegularContainerEffectiveStatement.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/RegularContainerEffectiveStatement.java
new file mode 100644 (file)
index 0000000..63b4df5
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * 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.stmt.impl.eff;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
+
+public final class RegularContainerEffectiveStatement extends AbstractContainerEffectiveStatement {
+    private final @NonNull QName argument;
+
+    public RegularContainerEffectiveStatement(final ContainerStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
+            final int flags) {
+        super(declared, substatements, flags);
+        this.argument = requireNonNull(argument);
+    }
+
+    public RegularContainerEffectiveStatement(final AbstractContainerEffectiveStatement original, final QName argument,
+            final int flags) {
+        super(original, flags);
+        this.argument = requireNonNull(argument);
+    }
+
+    @Override
+    public QName argument() {
+        return argument;
+    }
+}