final ImmutableSet<String> defaultValues, final @Nullable ElementCountConstraint elementCountConstraint)
throws SubstatementIndexingException {
if (defaultValues.isEmpty()) {
- return elementCountConstraint == null
- ? new EmptyLeafListEffectiveStatement(declared, argument, flags, substatements)
+ return elementCountConstraint == null && argument.equals(declared.argument())
+ ? new EmptyLeafListEffectiveStatement(declared, flags, substatements)
: new SlimLeafListEffectiveStatement(declared, argument, flags, substatements,
elementCountConstraint);
}
*/
package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
-import static java.util.Objects.requireNonNull;
-
import com.google.common.collect.ImmutableList;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
extends AbstractDeclaredEffectiveStatement.Default<QName, LeafListStatement>
implements LeafListEffectiveStatement, LeafListSchemaNode, UserOrderedMixin<QName, LeafListStatement>,
DataSchemaNodeMixin<LeafListStatement>, MustConstraintMixin<QName, LeafListStatement> {
+ private static final VarHandle TYPE;
+
+ static {
+ try {
+ TYPE = MethodHandles.lookup().findVarHandle(AbstractLeafListEffectiveStatement.class, "type",
+ TypeDefinition.class);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new ExceptionInInitializerError(e);
+ }
+ }
+
private final @NonNull Object substatements;
- private final @NonNull QName argument;
- private final @NonNull TypeDefinition<?> type;
private final int flags;
- AbstractLeafListEffectiveStatement(final LeafListStatement declared, final QName argument, final int flags,
+ @SuppressWarnings("unused")
+ private volatile TypeDefinition<?> type;
+
+ AbstractLeafListEffectiveStatement(final LeafListStatement declared, final int flags,
final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
super(declared);
- this.argument = requireNonNull(argument);
this.substatements = maskList(substatements);
this.flags = flags;
- // TODO: lazy instantiation?
- this.type = buildType();
}
- AbstractLeafListEffectiveStatement(final AbstractLeafListEffectiveStatement original, final QName argument,
- final int flags) {
+ AbstractLeafListEffectiveStatement(final AbstractLeafListEffectiveStatement original, final int flags) {
super(original);
- this.argument = requireNonNull(argument);
- this.substatements = original.substatements;
+ substatements = original.substatements;
this.flags = flags;
- // TODO: lazy instantiation?
- this.type = buildType();
}
@Override
return flags;
}
- @Override
- public final QName argument() {
- return argument;
- }
-
- @Override
- public final TypeDefinition<?> getType() {
- return type;
- }
-
@Override
public final boolean isUserOrdered() {
return userOrdered();
@Override
public final String toString() {
- return getClass().getSimpleName() + "[" + argument + "]";
+ return getClass().getSimpleName() + "[" + argument() + "]";
}
- private TypeDefinition<?> buildType() {
+ @Override
+ public final TypeDefinition<?> getType() {
+ final var local = (TypeDefinition<?>) TYPE.getAcquire(this);
+ return local != null ? local : loadType();
+ }
+
+ private TypeDefinition<?> loadType() {
final TypeEffectiveStatement<?> typeStmt = findFirstEffectiveSubstatement(TypeEffectiveStatement.class).get();
final ConcreteTypeBuilder<?> builder = ConcreteTypes.concreteTypeBuilder(typeStmt.getTypeDefinition(),
getQName());
builder.setUnits(((UnitsEffectiveStatement)stmt).argument());
}
}
- return builder.build();
+
+ final var ret = builder.build();
+ final var witness = (TypeDefinition<?>) TYPE.compareAndExchangeRelease(this, null, ret);
+ return witness != null ? witness : ret;
}
}
*/
package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
+import static java.util.Objects.requireNonNull;
+
import com.google.common.collect.ImmutableList;
import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
abstract class AbstractNonEmptyLeafListEffectiveStatement extends AbstractLeafListEffectiveStatement {
private final @Nullable ElementCountConstraint elementCountConstraint;
+ private final @NonNull QName argument;
AbstractNonEmptyLeafListEffectiveStatement(final LeafListStatement declared, final QName argument, final int flags,
final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
final ElementCountConstraint elementCountConstraint) {
- super(declared, argument, flags, substatements);
+ super(declared, flags, substatements);
+ this.argument = requireNonNull(argument);
this.elementCountConstraint = elementCountConstraint;
}
AbstractNonEmptyLeafListEffectiveStatement(final AbstractNonEmptyLeafListEffectiveStatement originalEffecive,
final QName argument, final int flags) {
- super(originalEffecive, argument, flags);
+ super(originalEffecive, flags);
+ this.argument = requireNonNull(argument);
elementCountConstraint = originalEffecive.elementCountConstraint;
}
AbstractNonEmptyLeafListEffectiveStatement(final EmptyLeafListEffectiveStatement originalEffective,
final QName argument, final int flags) {
- super(originalEffective, argument, flags);
+ super(originalEffective, flags);
+ this.argument = requireNonNull(argument);
elementCountConstraint = null;
}
+ @Override
+ public final QName argument() {
+ return argument;
+ }
+
@Override
public final Optional<ElementCountConstraint> getElementCountConstraint() {
return Optional.ofNullable(elementCountConstraint);
import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
public final class EmptyLeafListEffectiveStatement extends AbstractLeafListEffectiveStatement {
- public EmptyLeafListEffectiveStatement(final LeafListStatement declared, final QName argument, final int flags,
+ public EmptyLeafListEffectiveStatement(final LeafListStatement declared, final int flags,
final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
- super(declared, argument, flags, substatements);
+ super(declared, flags, substatements);
}
- public EmptyLeafListEffectiveStatement(final EmptyLeafListEffectiveStatement original, final QName argument,
- final int flags) {
- super(original, argument, flags);
+ public EmptyLeafListEffectiveStatement(final EmptyLeafListEffectiveStatement original, final int flags) {
+ super(original, flags);
+ }
+
+ @Override
+ public QName argument() {
+ return getDeclared().argument();
}
@Override