enums: support partial groups in enums that have other semantics *sigh*
diff --git a/java_gen/templates/const_set_serializer.java b/java_gen/templates/const_set_serializer.java
index ad0adb1..4fcff22 100644
--- a/java_gen/templates/const_set_serializer.java
+++ b/java_gen/templates/const_set_serializer.java
@@ -46,9 +46,9 @@
public class ${class_name} {
//:: wire_type = enum.wire_type(version)
//:: int_wire_type = enum.wire_type(version).pub_type
- //:: entries = sorted([ (entry, entry.value(version)) for entry in enum.entries if entry.has_value(version) ], lambda (_,va), (_2,vb): va.__cmp__(vb))
+ //:: entries = [entry for entry in enum.entries if entry.has_value(version) ]
- //:: for entry, _ in entries:
+ //:: for entry in entries:
public final static ${int_wire_type} ${entry.name}_VAL = ${entry.format_value(version)};
//:: #endfor
@@ -67,9 +67,21 @@
public static Set<${enum.name}> ofWireValue(${int_wire_type} val) {
EnumSet<${enum.name}> set = EnumSet.noneOf(${enum.name}.class);
- //:: for entry, _ in entries:
+ //:: last_group = None
+ //:: for entry in entries:
+ //:: if entry.is_mask:
+ //:: continue
+ //:: #endif
+ //:: group = entry.masked_enum_group
+ //:: if group:
+ ${"else " if group == last_group else "" }if((val & ${group.mask}_VAL) == ${entry.name}_VAL)
+ set.add(${enum.name}.${entry.name});
+ //:: last_group = group
+ //:: else:
if((val & ${entry.name}_VAL) != 0)
set.add(${enum.name}.${entry.name});
+ //:: last_group = None
+ //:: #endif
//:: #endfor
return Collections.unmodifiableSet(set);
}
@@ -79,7 +91,10 @@
for(${enum.name} e: set) {
switch(e) {
- //:: for entry, _ in entries:
+ //:: for entry in entries:
+ //:: if entry.is_mask:
+ //:: continue
+ //:: #endif
case ${entry.name}:
wireValue |= ${entry.name}_VAL;
break;