public class StatCodeEnumerator implements FilterEnums {
private FlagStatsCode[] codes;
public StatCodeEnumerator(FlagStatsCode[] codes) {
assert (codes != null);
this.codes = codes;
}
@Override
public Enumeration<FlagStatsCode> elements() {
return new Enumeration<FlagStatsCode>() {
private int count = 0;
@Override
public boolean hasMoreElements() {
return count < StatCodeEnumerator.this.codes.length;
}
@Override
public FlagStatsCode nextElement() {
return StatCodeEnumerator.this.codes[count++];
}
};
}
@Override
public int length() {
return codes.length;
}
}
public class FlagStatsCode {
private int code;
private String stats;
public FlagStatsCode(String stats, int code) {
this.code = code;
this.stats = stats;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getStats() {
return stats;
}
public void setStats(String stats) {
this.stats = stats;
}
}
public class FilterAggregator {
final int F_FLAG = 0xffffffff;
final int H_FLAG = 0xffff0000;
final int L_FLAG = 0x0000ffff;
private int allowedStatus = 0;
StatCodeEnumerator userFilter = null;
public FilterAggregator(StatCodeEnumerator userFilter) {
assert (userFilter != null);
this.userFilter = userFilter;
validate();
}
public int aggStatus(int mix_signal) {
if (allowedStatus != (allowedStatus | mix_signal)) {
throw new RuntimeException("Can't match signal");
}
return allowedStatus & mix_signal;
}
public List<FlagStatsCode> aggStatusDef(int mix_signal) {
List<FlagStatsCode> filters = new ArrayList<>();
if (allowedStatus != (allowedStatus | mix_signal)) {
throw new RuntimeException("Can't match signal");
}
int op = allowedStatus & mix_signal;
Enumeration<FlagStatsCode> codes = userFilter.elements();
while (codes.hasMoreElements()) {
FlagStatsCode def = codes.nextElement();
int code = def.getCode();
if ((op & code) == code) {
filters.add(new FlagStatsCode(def.getStats(), code));
}
}
return filters;
}
public void validate() {
int rec_flags = 0;
Enumeration<FlagStatsCode> codes = userFilter.elements();
while (codes.hasMoreElements()) {
int f = codes.nextElement().getCode();
if ((f & H_FLAG) == 0 && (f & L_FLAG) != 0 && (f & rec_flags) == 0) {
int check_point = 1;
int eql_count = 0;
for (int i = 0; i < 32; i++) {
if ((f & check_point) != 0) {
eql_count++;
}
check_point <<= 1;
}
if (eql_count != 1) {
System.out.println("eql_count " + eql_count + ", flag " + f + " is not valid!");
continue;
}
rec_flags |= f;
continue;
}
System.out.println(f + " is not valid!");
}
allowedStatus = rec_flags;
}
public static void main(String[] args) {
FlagStatsCode d1 = new FlagStatsCode("CASH", 1);
FlagStatsCode d2 = new FlagStatsCode("WEIXIN", 2);
FlagStatsCode d3 = new FlagStatsCode("ALI", 4);
FlagStatsCode d4 = new FlagStatsCode("CARD", 8);
FlagStatsCode d48 = new FlagStatsCode("48_WRONG", 48);
FilterAggregator s = null;
s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d2, d3, d4, d48}));
s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d2, d3}));
s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d3}));
System.out.println(s.aggStatus(5));
s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d2, d3, d4}));
for (FlagStatsCode d : s.aggStatusDef(5)) {
System.out.println(d.getStats() + " - " + d.getCode());
}
}
}