return new InferredStatementContext<>(this, newParent);
}
+ @Override
+ boolean hasEmptySubstatements() {
+ return hasEmptyEffectiveSubstatements();
+ }
+
// Instantiate this statement's effective substatements. Note this method has side-effects in namespaces and overall
// BuildGlobalContext, hence it must be called at most once.
private List<Mutable<?, ?, ?>> createEffective() {
final CopyPolicy policy = support.applyCopyPolicy(this, parent, type, targetModule);
switch (policy) {
case CONTEXT_INDEPENDENT:
- // FIXME: YANGTOOLS-652: we need isEmpty() here for performance reasons
- if (allSubstatementsStream().findAny().isEmpty()) {
+ if (hasEmptySubstatements()) {
// This statement is context-independent and has no substatements -- hence it can be freely shared.
return Optional.of(this);
}
abstract StatementContextBase<A, D, E> reparent(StatementContextBase<?, ?, ?> newParent);
+ /**
+ * Indicate that the set of substatements is empty. This is a preferred shortcut to substatement stream filtering.
+ *
+ * @return True if {@link #allSubstatements()} and {@link #allSubstatementsStream()} would return an empty stream.
+ */
+ abstract boolean hasEmptySubstatements();
+
+ final boolean hasEmptyEffectiveSubstatements() {
+ return effective.isEmpty();
+ }
+
/**
* Config statements are not all that common which means we are performing a recursive search towards the root
* every time {@link #isConfiguration()} is invoked. This is quite expensive because it causes a linear search