From c258cfd0981293f6efe5e2e88d6a313f40320eb0 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 2 Jul 2020 16:12:11 +0200 Subject: [PATCH] Optimize if-feature statement implementations if-feature is a simple statement, optimize the memory layout of its implementation classes. JIRA: YANGTOOLS-1065 Change-Id: I9e2a1dbf1f32b4fdfefd965ff88fd63425bcb5d3 Signed-off-by: Robert Varga --- .../api/stmt/IfFeatureEffectiveStatement.java | 7 +++- .../model/api/stmt/IfFeatureStatement.java | 7 ++++ ... => EmptyIfFeatureEffectiveStatement.java} | 13 ++++--- ...Impl.java => EmptyIfFeatureStatement.java} | 8 ++--- .../if_feature/IfFeatureStatementSupport.java | 35 ++++++++++++++----- .../RegularIfFeatureEffectiveStatement.java | 23 ++++++++++++ .../if_feature/RegularIfFeatureStatement.java | 22 ++++++++++++ 7 files changed, 94 insertions(+), 21 deletions(-) rename yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/{IfFeatureEffectiveStatementImpl.java => EmptyIfFeatureEffectiveStatement.java} (55%) rename yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/{IfFeatureStatementImpl.java => EmptyIfFeatureStatement.java} (59%) create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureEffectiveStatement.java create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureStatement.java diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureEffectiveStatement.java index 44d0b37ed0..9560ae4aac 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureEffectiveStatement.java @@ -8,9 +8,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; +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 IfFeatureEffectiveStatement extends EffectiveStatement { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.IF_FEATURE; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureStatement.java index 7fff6d9bd9..797cd2e3b8 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/IfFeatureStatement.java @@ -11,12 +11,19 @@ import static com.google.common.base.Verify.verifyNotNull; import com.google.common.annotations.Beta; import org.eclipse.jdt.annotation.NonNull; +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; /** * Represents YANG if-feature statement. The "if-feature" statement makes its parent statement conditional. */ public interface IfFeatureStatement extends DeclaredStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.IF_FEATURE; + } + /** * In YANG 1.1 (RFC7950) implementation of IfFeatureStatement, the argument is a boolean expression over feature * names defined by "feature" statements. Hence, add implementation to return a predicate on a collection diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/EmptyIfFeatureEffectiveStatement.java similarity index 55% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureEffectiveStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/EmptyIfFeatureEffectiveStatement.java index 1cbb7f7083..1f6182de3d 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/EmptyIfFeatureEffectiveStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2020 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, @@ -10,12 +10,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.if_feature; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureExpr; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; -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; -final class IfFeatureEffectiveStatementImpl extends DeclaredEffectiveStatementBase +final class EmptyIfFeatureEffectiveStatement extends DefaultArgument implements IfFeatureEffectiveStatement { - IfFeatureEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); + EmptyIfFeatureEffectiveStatement(final IfFeatureStatement declared) { + super(declared); } -} \ No newline at end of file +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/EmptyIfFeatureStatement.java similarity index 59% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/EmptyIfFeatureStatement.java index c5e12746d9..d835b2429e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/EmptyIfFeatureStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2020 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, @@ -9,11 +9,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.if_feature; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureExpr; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -final class IfFeatureStatementImpl extends AbstractDeclaredStatement implements IfFeatureStatement { - IfFeatureStatementImpl(final StmtContext context) { +final class EmptyIfFeatureStatement extends WithArgument implements IfFeatureStatement { + EmptyIfFeatureStatement(final StmtContext context) { super(context); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java index fb952751e9..fef29a1bde 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.if_feature; import static com.google.common.base.Verify.verifyNotNull; +import com.google.common.collect.ImmutableList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -17,11 +18,13 @@ import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.YangVersion; 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.stmt.IfFeatureEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureExpr; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.FeatureNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction; @@ -36,7 +39,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class IfFeatureStatementSupport - extends AbstractStatementSupport { + extends BaseStatementSupport { private static final Logger LOG = LoggerFactory.getLogger(IfFeatureStatementSupport.class); private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.IF_FEATURE) @@ -92,18 +95,32 @@ public final class IfFeatureStatementSupport } @Override - public IfFeatureStatement createDeclared(final StmtContext ctx) { - return new IfFeatureStatementImpl(ctx); + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public IfFeatureEffectiveStatement createEffective( - final StmtContext ctx) { - return new IfFeatureEffectiveStatementImpl(ctx); + protected IfFeatureStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularIfFeatureStatement(ctx, substatements); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected IfFeatureStatement createEmptyDeclared(final StmtContext ctx) { + return new EmptyIfFeatureStatement(ctx); + } + + @Override + protected IfFeatureEffectiveStatement createEffective( + final StmtContext ctx, + final IfFeatureStatement declared, final ImmutableList> substatements) { + return new RegularIfFeatureEffectiveStatement(declared, substatements); + } + + @Override + protected IfFeatureEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final IfFeatureStatement declared) { + return new EmptyIfFeatureEffectiveStatement(declared); } } \ No newline at end of file diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureEffectiveStatement.java new file mode 100644 index 0000000000..449b1fbb12 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureEffectiveStatement.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2020 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.parser.rfc7950.stmt.if_feature; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureExpr; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements; + +final class RegularIfFeatureEffectiveStatement extends WithSubstatements + implements IfFeatureEffectiveStatement { + RegularIfFeatureEffectiveStatement(final IfFeatureStatement declared, + final ImmutableList> substatements) { + super(declared, substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureStatement.java new file mode 100644 index 0000000000..12f9eddd20 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/RegularIfFeatureStatement.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2020 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.parser.rfc7950.stmt.if_feature; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureExpr; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; + +final class RegularIfFeatureStatement extends WithSubstatements implements IfFeatureStatement { + RegularIfFeatureStatement(final StmtContext context, + final ImmutableList> substatements) { + super(context, substatements); + } +} -- 2.36.6