Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ libcfa/src/enum.cfa	(revision a8ced633240a7ebd606f9199aaaab4e96345b4dc)
@@ -13,2 +13,10 @@
     return os | type_name(e) | "." | labelE(e);
 }
+
+forall(ostype & | basic_ostream(ostype), E, V| CfaEnum(E, V)) {
+    int ?==?(E l, E r) { return posE(l) == posE(r); }
+    int ?<=?(E l, E r) { return posE(l) <= posE(r); }
+    int ?>=?(E l, E r) { return posE(l) >= posE(r); }
+    int ?<?(E l, E r) { return posE(l) < posE(r); }
+    int ?>?(E l, E r) { return posE(l) > posE(r); }
+}
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ libcfa/src/enum.hfa	(revision a8ced633240a7ebd606f9199aaaab4e96345b4dc)
@@ -38,2 +38,13 @@
 //     V valueE(E e);
 // };
+
+forall(ostype & | basic_ostream(ostype), E, V| CfaEnum(E, V)) {
+    int ?==?(E, E);
+    int ?<=?(E, E);
+    int ?>=?(E, E);
+    int ?<?(E, E);
+    int ?>?(E, E);
+
+	// E ++?( E & lhs );
+	// E ?++( E & lhs );
+}
