Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ libcfa/src/enum.cfa	(revision d66a43bbd604d646532e6bdd2d5d5b10ce99fa6c)
@@ -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 d66a43bbd604d646532e6bdd2d5d5b10ce99fa6c)
@@ -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 );
+}
