Created
March 1, 2021 07:18
-
-
Save VAndrJ/559bfa18ee76bff6850f1818c16b88db to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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