Skip to content

Instantly share code, notes, and snippets.

@VAndrJ
Created March 1, 2021 07:18
Show Gist options
  • Save VAndrJ/559bfa18ee76bff6850f1818c16b88db to your computer and use it in GitHub Desktop.
Save VAndrJ/559bfa18ee76bff6850f1818c16b88db to your computer and use it in GitHub Desktop.
class Option {
final int rawValue;
Option(this.rawValue);
Option.fromSet(Set<Option> set) : rawValue = set.rawValue;
Option.fromList(List<Option> set) : rawValue = set.rawValue;
Option operator |(Option option) {
return Option(rawValue | option.rawValue);
}
Option operator &(Option option) {
return Option(rawValue & option.rawValue);
}
Option operator ^(Option option) {
return Option(rawValue ^ option.rawValue);
}
Option operator ~() {
return Option(~rawValue);
}
bool has(Option option) {
return (rawValue & option.rawValue) == option.rawValue;
}
Option added(Option option) {
return Option(rawValue | option.rawValue);
}
Option dropped(Option option) {
return Option(rawValue ^ option.rawValue);
}
int get count {
int value = rawValue;
int count = 0;
while (value != 0) {
if (value & 1 == 1) {
count += 1;
}
value >>= 1;
}
return count;
}
@override
bool operator ==(Object other) {
return hashCode == other.hashCode;
}
@override
int get hashCode => rawValue;
@override
String toString() {
return 'rawValue: $rawValue,\tbitmask: ${rawValue.toRadixString(2).padLeft(8, '0')}';
}
}
extension SetOptions on Set<Option> {
int get rawValue {
int result = 0;
forEach((element) {
result |= element.rawValue;
});
return result;
}
}
extension ListOptions on List<Option> {
int get rawValue {
return toSet().rawValue;
}
}
class LanguageOption extends Option {
static final java = LanguageOption(1 << 0);
static final swift = LanguageOption(1 << 1);
static final dart = LanguageOption(1 << 2);
static final cpp = LanguageOption(1 << 3);
static final c = LanguageOption(1 << 4);
static final go = LanguageOption(1 << 5);
static final allOptions = [
LanguageOption.java,
LanguageOption.swift,
LanguageOption.dart,
LanguageOption.cpp,
LanguageOption.c,
LanguageOption.go,
];
// Ущербное наследование
LanguageOption(int rawValue) : super(rawValue);
}
main() {
print('languages:');
for (LanguageOption option in LanguageOption.allOptions) {
print(option);
}
print('-');
final vacancyLanguagesOption = LanguageOption([
LanguageOption.c,
LanguageOption.dart,
LanguageOption.java,
LanguageOption.go,
].rawValue);
final candidateLanguageOption = LanguageOption([
LanguageOption.c,
LanguageOption.dart,
LanguageOption.swift,
].rawValue);
print('vacancy languages raw value:');
print(vacancyLanguagesOption);
print('candidate languages raw value:');
print(candidateLanguageOption);
print('-');
final intersectionOption = vacancyLanguagesOption & candidateLanguageOption;
print('languages intersection raw value:');
print(intersectionOption);
print('-');
print('Intersection languages:');
for (LanguageOption option in LanguageOption.allOptions) {
if (intersectionOption.has(option)) {
print(option);
}
}
print('-');
print('Hardcode check:');
print(intersectionOption.has(LanguageOption.dart));
print(intersectionOption.has(LanguageOption.c));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment