Use thee default set of flags by default in QueryOptions.Builder, etc

This commit is contained in:
Luck 2019-12-13 11:28:46 +00:00
parent d8ac199858
commit 06f7900318
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
6 changed files with 29 additions and 15 deletions

View File

@ -25,10 +25,6 @@
package net.luckperms.api.query; package net.luckperms.api.query;
import net.luckperms.api.context.ImmutableContextSet;
import java.util.EnumSet;
/** /**
* Some default {@link QueryOptions} instances. * Some default {@link QueryOptions} instances.
*/ */
@ -38,7 +34,6 @@ final class DefaultQueryOptions {
} }
private static boolean setup = false; private static boolean setup = false;
private static final EnumSet<Flag> DEFAULT_FLAGS = EnumSet.allOf(Flag.class);
private static QueryOptions contextual; private static QueryOptions contextual;
private static QueryOptions nonContextual; private static QueryOptions nonContextual;
@ -47,8 +42,8 @@ final class DefaultQueryOptions {
return; return;
} }
setup = true; setup = true;
contextual = QueryOptions.contextual(ImmutableContextSet.empty(), DEFAULT_FLAGS); contextual = QueryOptions.builder(QueryMode.CONTEXTUAL).build();
nonContextual = QueryOptions.nonContextual(DEFAULT_FLAGS); nonContextual = QueryOptions.builder(QueryMode.NON_CONTEXTUAL).build();
} }
static QueryOptions contextual() { static QueryOptions contextual() {

View File

@ -27,6 +27,9 @@ package net.luckperms.api.query;
/** /**
* The flags which can be set for a query. * The flags which can be set for a query.
*
* <p>By default (in places like new instances of {@link QueryOptions.Builder} and
* {@link QueryOptions#defaultContextualOptions()}), all {@link Flag}s are set to true.</p>
*/ */
public enum Flag { public enum Flag {

View File

@ -71,7 +71,7 @@ public interface QueryOptions {
* @return the query options * @return the query options
*/ */
static @NonNull QueryOptions contextual(@NonNull ContextSet context) { static @NonNull QueryOptions contextual(@NonNull ContextSet context) {
return defaultContextualOptions().toBuilder().context(context).build(); return builder(QueryMode.CONTEXTUAL).context(context).build();
} }
/** /**
@ -208,6 +208,8 @@ public interface QueryOptions {
/** /**
* Sets the value of the given flag. * Sets the value of the given flag.
* *
* <p>By default, all {@link Flag}s are set to true.</p>
*
* @param flag the flag * @param flag the flag
* @param value the value to set * @param value the value to set
* @return this builder * @return this builder
@ -220,6 +222,8 @@ public interface QueryOptions {
* <p>Note that this is a set operation, not append. Existing flags will * <p>Note that this is a set operation, not append. Existing flags will
* be overridden.</p> * be overridden.</p>
* *
* <p>By default, all {@link Flag}s are set to true.</p>
*
* @param flags the flags * @param flags the flags
* @return this builder * @return this builder
*/ */

View File

@ -33,13 +33,25 @@ import java.util.Set;
final class FlagUtils { final class FlagUtils {
private FlagUtils() {} private FlagUtils() {}
private static final EnumSet<Flag> DEFAULT_FLAGS_SET = EnumSet.allOf(Flag.class);
private static final int DEFAULT_FLAGS_SIZE = DEFAULT_FLAGS_SET.size();
static final byte DEFAULT_FLAGS = encodeAsByte(DEFAULT_FLAGS_SET);
/* bitwise utility methods */ /* bitwise utility methods */
static boolean read(byte b, Flag setting) { static boolean read(byte b, Flag setting) {
return ((b >> setting.ordinal()) & 1) == 1; return ((b >> setting.ordinal()) & 1) == 1;
} }
static byte createFlag(Set<Flag> settings) { static byte toByte(Set<Flag> settings) {
// fast path for the default set of flags.
if (settings.size() == DEFAULT_FLAGS_SIZE) {
return DEFAULT_FLAGS;
}
return encodeAsByte(settings);
}
private static byte encodeAsByte(Set<Flag> settings) {
byte b = 0; byte b = 0;
for (Flag setting : settings) { for (Flag setting : settings) {
b |= (1 << setting.ordinal()); b |= (1 << setting.ordinal());
@ -47,7 +59,7 @@ final class FlagUtils {
return b; return b;
} }
static Set<Flag> createSetFromFlag(byte b) { static Set<Flag> toSet(byte b) {
EnumSet<Flag> settings = EnumSet.noneOf(Flag.class); EnumSet<Flag> settings = EnumSet.noneOf(Flag.class);
for (Flag setting : Flag.values()) { for (Flag setting : Flag.values()) {
if (read(b, setting)) { if (read(b, setting)) {

View File

@ -54,7 +54,7 @@ public class QueryOptionsBuilderImpl implements QueryOptions.Builder {
public QueryOptionsBuilderImpl(QueryMode mode) { public QueryOptionsBuilderImpl(QueryMode mode) {
this.mode = mode; this.mode = mode;
this.context = mode == QueryMode.CONTEXTUAL ? ImmutableContextSetImpl.EMPTY : null; this.context = mode == QueryMode.CONTEXTUAL ? ImmutableContextSetImpl.EMPTY : null;
this.flags = 0; this.flags = FlagUtils.DEFAULT_FLAGS;
this.flagsSet = null; this.flagsSet = null;
this.options = null; this.options = null;
this.copyOptions = false; this.copyOptions = false;
@ -94,13 +94,13 @@ public class QueryOptionsBuilderImpl implements QueryOptions.Builder {
public QueryOptions.@NonNull Builder flag(@NonNull Flag flag, boolean value) { public QueryOptions.@NonNull Builder flag(@NonNull Flag flag, boolean value) {
Objects.requireNonNull(flag, "flag"); Objects.requireNonNull(flag, "flag");
// already set // check if already set
if (this.flagsSet == null && FlagUtils.read(this.flags, flag) == value) { if (this.flagsSet == null && FlagUtils.read(this.flags, flag) == value) {
return this; return this;
} }
if (this.flagsSet == null) { if (this.flagsSet == null) {
this.flagsSet = FlagUtils.createSetFromFlag(this.flags); this.flagsSet = FlagUtils.toSet(this.flags);
} }
if (value) { if (value) {
this.flagsSet.add(flag); this.flagsSet.add(flag);
@ -146,7 +146,7 @@ public class QueryOptionsBuilderImpl implements QueryOptions.Builder {
@Override @Override
public @NonNull QueryOptions build() { public @NonNull QueryOptions build() {
byte flags = this.flagsSet != null ? FlagUtils.createFlag(this.flagsSet) : this.flags; byte flags = this.flagsSet != null ? FlagUtils.toByte(this.flagsSet) : this.flags;
if (this.options == null) { if (this.options == null) {
if (this.mode == QueryMode.NON_CONTEXTUAL) { if (this.mode == QueryMode.NON_CONTEXTUAL) {

View File

@ -86,7 +86,7 @@ public class QueryOptionsImpl implements QueryOptions {
if (this.flagsSet != null) { if (this.flagsSet != null) {
return this.flagsSet; return this.flagsSet;
} }
Set<Flag> set = ImmutableSet.copyOf(FlagUtils.createSetFromFlag(this.flags)); Set<Flag> set = ImmutableSet.copyOf(FlagUtils.toSet(this.flags));
this.flagsSet = set; this.flagsSet = set;
return set; return set;
} }