package me.august.lumen.common;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static me.august.lumen.common.Modifier.*;
public class ModifierSet {
private int value;
public ModifierSet(int value) {
this.value = value;
}
public ModifierSet(Modifier... mods) {
this.value = Modifier.compose(mods);
}
public boolean isAbstract() {
return (value & ABSTRACT.value) != 0;
}
public boolean isInterface() {
return (value & INTERFACE.value) != 0;
}
public boolean isFinal() {
return (value & FINAL.value) != 0;
}
public boolean isStatic() {
return (value & STATIC.value) != 0;
}
public boolean isPublic() {
return (value & PUBLIC.value) != 0;
}
public boolean isPrivate() {
return (value & PRIVATE.value) != 0;
}
public boolean isProtected() {
return (value & PROTECTED.value) != 0;
}
public boolean isPackagePrivate() {
return !(isPublic() || isPrivate() || isProtected());
}
public boolean isVolatile() {
return (value & VOLATILE.value) != 0;
}
public boolean isSynchronized() {
return (value & SYNCHRONIZED.value) != 0;
}
public boolean isNative() {
return (value & NATIVE.value) != 0;
}
public void setAbstract(boolean _abstract) {
if (_abstract) {
value |= ABSTRACT.value;
} else {
value &= ~ABSTRACT.value;
}
}
public void setInterface(boolean _interface) {
if (_interface) {
value |= INTERFACE.value;
} else {
value &= ~INTERFACE.value;
}
}
public void setFinal(boolean _final) {
if (_final) {
value |= FINAL.value;
} else {
value &= ~FINAL.value;
}
}
public void setStatic(boolean _static) {
if (_static) {
value |= STATIC.value;
} else {
value &= ~STATIC.value;
}
}
public void setPublic(boolean _public) {
if (_public) {
value |= PUBLIC.value;
// unset private and protected
value &= ~PRIVATE.value;
value &= ~PROTECTED.value;
} else {
value &= ~PUBLIC.value;
}
}
public void setPrivate(boolean _private) {
if (_private) {
value |= PRIVATE.value;
// unset public and protected
value &= ~PUBLIC.value;
value &= ~PROTECTED.value;
} else {
value &= ~PRIVATE.value;
}
}
public void setProtected(boolean _protected) {
if (_protected) {
value |= PROTECTED.value;
// unset public and private
value &= ~PUBLIC.value;
value &= ~PRIVATE.value;
} else {
value &= ~PROTECTED.value;
}
}
public void setPackagePrivate(boolean pkPriv) {
if (pkPriv) {
// unset all other modifiers
value &= ~PUBLIC.value;
value &= ~PROTECTED.value;
value &= ~PRIVATE.value;
}
}
public void setVolatile(boolean _volatile) {
if (_volatile) {
value |= VOLATILE.value;
} else {
value &= ~VOLATILE.value;
}
}
public void setSynchronized(boolean sync) {
if (sync) {
value |= SYNCHRONIZED.value;
} else {
value &= ~SYNCHRONIZED.value;
}
}
public void setNative(boolean _native) {
if (_native) {
value |= NATIVE.value;
} else {
value &= ~NATIVE.value;
}
}
public void add(Modifier modifier) {
value |= modifier.value;
}
public void remove(Modifier modifier) {
value &= ~modifier.getValue();
}
public Modifier[] toArray() {
return Modifier.fromAccess(value);
}
public List<Modifier> toList() {
return new ArrayList<>(Arrays.asList(toArray()));
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ModifierSet that = (ModifierSet) o;
if (value != that.value) return false;
return true;
}
public ModifierSet merge(ModifierSet other) {
value |= other.getValue();
return this;
}
public ModifierSet merge(int bitfield) {
value |= bitfield;
return this;
}
@Override
public int hashCode() {
return value;
}
@Override
public String toString() {
return "ModifierSet" + toList();
}
}