Optimize deviate statement implementations 77/90877/5
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 15:21:06 +0000 (17:21 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 22:31:55 +0000 (00:31 +0200)
deviate is a simple statement, optimize the memory layout of its
implementation classes.

JIRA: YANGTOOLS-1065
Change-Id: Ibffb49bca02952f685250d9b5a6a2cdf56966a7d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateStatementImpl.java

index 97d23522beaed261b4a60404a2e9711114c23b12..7c9796e92aa836289fe667f0975c42455d06014e 100644 (file)
@@ -9,9 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface DeviateEffectiveStatement extends EffectiveStatement<DeviateKind, DeviateStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.DEVIATE;
+    }
 }
index 1379fd635d506d5be9eceace6533ba82aaef6a7c..719eabbc5d2a912e930848a368df04bf210bfad3 100644 (file)
@@ -11,9 +11,16 @@ import static com.google.common.base.Verify.verifyNotNull;
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 public interface DeviateStatement extends DeclaredStatement<DeviateKind> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.DEVIATE;
+    }
+
     default @NonNull DeviateKind getValue() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
         return verifyNotNull(argument());
index f9d85c5b1b8dcdacad4892f25c6a0fa0429987ab..a809ad5a6e256c5b5f2b823b55ce5fd299e2a1e3 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -21,6 +22,7 @@ import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
@@ -28,7 +30,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
@@ -49,7 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 abstract class AbstractDeviateStatementSupport
-        extends AbstractStatementSupport<DeviateKind, DeviateStatement, DeviateEffectiveStatement> {
+        extends BaseStatementSupport<DeviateKind, DeviateStatement, DeviateEffectiveStatement> {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractDeviateStatementSupport.class);
 
     private static final SubstatementValidator DEVIATE_NOT_SUPPORTED_SUBSTATEMENT_VALIDATOR =
@@ -106,17 +108,6 @@ abstract class AbstractDeviateStatementSupport
             ctx.getStatementSourceReference(), "String '%s' is not valid deviate argument", value);
     }
 
-    @Override
-    public final DeviateStatement createDeclared(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
-        return new DeviateStatementImpl(ctx);
-    }
-
-    @Override
-    public final DeviateEffectiveStatement createEffective(
-            final StmtContext<DeviateKind, DeviateStatement, DeviateEffectiveStatement> ctx) {
-        return new DeviateEffectiveStatementImpl(ctx);
-    }
-
     @Override
     public final void onFullDefinitionDeclared(
             final Mutable<DeviateKind, DeviateStatement, DeviateEffectiveStatement> deviateStmtCtx) {
@@ -196,6 +187,33 @@ abstract class AbstractDeviateStatementSupport
         return null;
     }
 
+    @Override
+    protected final DeviateStatement createDeclared(final StmtContext<DeviateKind, DeviateStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new DeviateStatementImpl(ctx, substatements);
+    }
+
+    @Override
+    protected final DeviateStatement createEmptyDeclared(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
+        // This is exceedingly unlikely, just reuse the implementation
+        return createDeclared(ctx, ImmutableList.of());
+    }
+
+    @Override
+    protected final DeviateEffectiveStatement createEffective(
+            final StmtContext<DeviateKind, DeviateStatement, DeviateEffectiveStatement> ctx,
+            final DeviateStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new DeviateEffectiveStatementImpl(declared, substatements);
+    }
+
+    @Override
+    protected final DeviateEffectiveStatement createEmptyEffective(
+            final StmtContext<DeviateKind, DeviateStatement, DeviateEffectiveStatement> ctx,
+            final DeviateStatement declared) {
+        // This is exceedingly unlikely, just reuse the implementation
+        return createEffective(ctx, declared, ImmutableList.of());
+    }
+
     protected SubstatementValidator getSubstatementValidatorForDeviate(final DeviateKind deviateKind) {
         switch (deviateKind) {
             case NOT_SUPPORTED:
index b5c378dacb0b3b7411cb92c8668f70d830567648..3f08767e80042907e43224f0acd329b02233b831 100644 (file)
@@ -7,16 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate;
 
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
-import java.util.Set;
-import org.opendaylight.yangtools.util.OptionalBoolean;
 import org.opendaylight.yangtools.yang.model.api.DeviateDefinition;
 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UniqueConstraint;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
@@ -26,41 +25,13 @@ import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatem
 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
 
-final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase<DeviateKind, DeviateStatement>
+final class DeviateEffectiveStatementImpl extends WithSubstatements<DeviateKind, DeviateStatement>
         implements DeviateDefinition, DeviateEffectiveStatement {
-
-    private final String deviatedDefault;
-    private final Integer deviatedMaxElements;
-    private final Integer deviatedMinElements;
-    private final ImmutableSet<MustDefinition> deviatedMustDefinitions;
-    private final TypeDefinition<?> deviatedType;
-    private final ImmutableList<UniqueConstraint> deviatedUniqueConstraints;
-    private final String deviatedUnits;
-
-    private final byte deviatedConfig;
-    private final byte deviatedMandatory;
-
-    DeviateEffectiveStatementImpl(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
-        super(ctx);
-
-        deviatedConfig = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
-            ConfigEffectiveStatement.class).orElse(null));
-        deviatedMandatory = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
-            MandatoryEffectiveStatement.class).orElse(null));
-        deviatedDefault = findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null);
-        deviatedMaxElements = findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class)
-                // FIXME: this does not handle 'unbounded'
-                .map(Integer::valueOf).orElse(null);
-        deviatedMinElements = findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null);
-        deviatedType = findFirstEffectiveSubstatement(TypeEffectiveStatement.class)
-                .map(TypeEffectiveStatement::getTypeDefinition).orElse(null);
-        deviatedUnits = findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null);
-
-        deviatedMustDefinitions = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class));
-        deviatedUniqueConstraints = ImmutableList.copyOf(allSubstatementsOfType(UniqueConstraint.class));
+    DeviateEffectiveStatementImpl(final DeviateStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, substatements);
     }
 
     @Override
@@ -70,46 +41,54 @@ final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase
 
     @Override
     public Boolean getDeviatedConfig() {
-        return OptionalBoolean.toNullable(deviatedConfig);
+        return findFirstEffectiveSubstatementArgument(ConfigEffectiveStatement.class).orElse(null);
     }
 
     @Override
     public String getDeviatedDefault() {
-        return deviatedDefault;
+        return findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null);
     }
 
     @Override
     public Boolean getDeviatedMandatory() {
-        return OptionalBoolean.toNullable(deviatedMandatory);
+        return findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(null);
     }
 
     @Override
     public Integer getDeviatedMaxElements() {
-        return deviatedMaxElements;
+        return findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class)
+                // FIXME: this does not handle 'unbounded'
+                .map(Integer::valueOf).orElse(null);
     }
 
     @Override
     public Integer getDeviatedMinElements() {
-        return deviatedMinElements;
+        return findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null);
     }
 
     @Override
-    public Set<MustDefinition> getDeviatedMusts() {
-        return deviatedMustDefinitions;
+    public Collection<? extends MustDefinition> getDeviatedMusts() {
+        return allSubstatementsOfType(MustDefinition.class);
     }
 
     @Override
     public TypeDefinition<?> getDeviatedType() {
-        return deviatedType;
+        return findFirstEffectiveSubstatement(TypeEffectiveStatement.class)
+                .map(TypeEffectiveStatement::getTypeDefinition).orElse(null);
     }
 
     @Override
-    public Collection<UniqueConstraint> getDeviatedUniques() {
-        return deviatedUniqueConstraints;
+    public Collection<? extends UniqueConstraint> getDeviatedUniques() {
+        return allSubstatementsOfType(UniqueConstraint.class);
     }
 
     @Override
     public String getDeviatedUnits() {
-        return deviatedUnits;
+        return findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null);
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T> Collection<T> allSubstatementsOfType(final Class<T> type) {
+        return Collection.class.cast(Collections2.filter(effectiveSubstatements(), type::isInstance));
     }
 }
index d8d57cc70fc2dead9bed8f3151201840c4a52a9a..205c4e86d01e5cbda2f44c924056999f1aed8c9f 100644 (file)
@@ -7,13 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class DeviateStatementImpl extends AbstractDeclaredStatement<DeviateKind> implements DeviateStatement {
-    DeviateStatementImpl(final StmtContext<DeviateKind, DeviateStatement, ?> context) {
-        super(context);
+final class DeviateStatementImpl extends WithSubstatements<DeviateKind> implements DeviateStatement {
+    DeviateStatementImpl(final StmtContext<DeviateKind, ?, ?> context,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(context, substatements);
     }
 }