package tv.dyndns.kishibe.qmaclone.client.game; import java.util.Collections; import java.util.List; import java.util.Set; import tv.dyndns.kishibe.qmaclone.client.util.HasIndex; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.gwt.user.client.rpc.IsSerializable; public enum ProblemGenre implements IsSerializable, HasIndex { Random(0, "ノンジャンル", "ノ", "gray"), Anige(1, "アニメ&ゲーム", "ア", "blue"), Sports(2, "スポーツ", "ス", "red"), Geinou(3, "芸能", "芸", "green"), Zatsugaku(4, "雑学", "雑", "orange"), Gakumon(5, "学問", "学", "purple"); private final int index; private final String name; private final String initial; private final String color; private ProblemGenre(int index, String name, String initial, String color) { this.index = index; this.name = name; this.initial = initial; this.color = color; } /** * ジャンル名の頭文字を返す * * @return ジャンル名の頭文字 */ public String getInitial() { return initial; } /** * ジャンルのテーマカラーを返す * * @return ジャンルのテーマカラー */ public String getColor() { return color; } @Override public int getIndex() { return index; } @Override public String toString() { return name; } /** * ジャンルの集合をビットフラグへ変換する * * @param genres * ジャンルの集合 * @return ビットフラグ */ public static int toBitFlag(Set<ProblemGenre> genres) { int bitFlag = 0; for (ProblemGenre genre : genres) { bitFlag |= (1 << genre.getIndex()); } return bitFlag; } /** * ビットフラグをジャンルの集合へ変換する * * @param bitFlag * ビットフラグ * @return ジャンルの集合 */ public static Set<ProblemGenre> fromBitFlag(int bitFlag) { if (bitFlag == 0) { return Collections.emptySet(); } List<ProblemGenre> genres = Lists.newArrayList(); for (ProblemGenre genre : values()) { if ((bitFlag & (1 << genre.getIndex())) == 0) { continue; } genres.add(genre); } return Sets.newHashSet(genres); } /** * * ジャンル名から{@link ProblemGenre}を返す * * @param name * ジャンル名 * @return {@link ProblemGenre} */ public static ProblemGenre fromName(String name) { for (ProblemGenre genre : ProblemGenre.values()) { if (genre.name.equals(name)) { return genre; } } return null; } }