layers: Added generated enum_validate_helper.h to check enum values

Conflicts:
	xgl-helper.py
diff --git a/xgl-helper.py b/xgl-helper.py
index dd512ff..cd0292a 100755
--- a/xgl-helper.py
+++ b/xgl-helper.py
@@ -756,19 +756,37 @@
         return "\n//any footer info for class\n"
 
 class EnumCodeGen:
-    def __init__(self, enum_type_dict=None, enum_val_dict=None, typedef_fwd_dict=None, in_file=None, out_file=None):
+    def __init__(self, enum_type_dict=None, enum_val_dict=None, typedef_fwd_dict=None, in_file=None, out_sh_file=None, out_vh_file=None):
         self.et_dict = enum_type_dict
         self.ev_dict = enum_val_dict
         self.tf_dict = typedef_fwd_dict
         self.in_file = in_file
-        self.out_file = out_file
-        self.efg = CommonFileGen(self.out_file)
+        self.out_sh_file = out_sh_file
+        self.eshfg = CommonFileGen(self.out_sh_file)
+        self.out_vh_file = out_vh_file
+        self.evhfg = CommonFileGen(self.out_vh_file)
         
     def generateStringHelper(self):
-        self.efg.setHeader(self._generateSHHeader())
-        self.efg.setBody(self._generateSHBody())
-        self.efg.generate()
-    
+        self.eshfg.setHeader(self._generateSHHeader())
+        self.eshfg.setBody(self._generateSHBody())
+        self.eshfg.generate()
+
+    def generateEnumValidate(self):
+        self.evhfg.setHeader(self._generateSHHeader())
+        self.evhfg.setHeader(self._generateVHBody())
+        self.evhfg.generate()
+
+    def _generateVHBody(self):
+        body = []
+        for bet in self.et_dict:
+            fet = self.tf_dict[bet]
+            body.append("static uint32_t validate_%s(%s input_value)\n{\n    switch ((%s)input_value)\n    {" % (fet, fet, fet))
+            for e in sorted(self.et_dict[bet]):
+                if (self.ev_dict[e]['unique']):
+                    body.append('    case %s:' % (e))
+            body.append('        return 1;\n    default:\n        return 0;\n    }\n}\n\n')
+        return "\n".join(body)
+
     def _generateSHBody(self):
         body = []
 #        with open(self.out_file, "a") as hf:
@@ -778,8 +796,8 @@
             body.append("static inline const char* string_%s(%s input_value)\n{\n    switch ((%s)input_value)\n    {\n" % (fet, fet, fet))
             for e in sorted(self.et_dict[bet]):
                 if (self.ev_dict[e]['unique']):
-                    body.append('    case %s:\n        return "%s";\n' % (e, e))
-            body.append('    default:\n        return "Unhandled %s";\n    }\n    return "Unhandled %s";\n}\n\n' % (fet, fet))
+                    body.append('    case %s:\n        return "%s";' % (e, e))
+            body.append('    default:\n        return "Unhandled %s";\n    }\n}\n\n' % (fet))
         return "\n".join(body)
     
     def _generateSHHeader(self):
@@ -1087,23 +1105,26 @@
     #print(typedef_dict)
     #print(struct_dict)
     if (opts.abs_out_dir is not None):
-        enum_filename = os.path.join(opts.abs_out_dir, os.path.basename(opts.input_file).strip(".h")+"_enum_string_helper.h")
+        enum_sh_filename = os.path.join(opts.abs_out_dir, os.path.basename(opts.input_file).strip(".h")+"_enum_string_helper.h")
     else:
-        enum_filename = os.path.join(os.getcwd(), opts.rel_out_dir, os.path.basename(opts.input_file).strip(".h")+"_enum_string_helper.h")
-    enum_filename = os.path.abspath(enum_filename)
-    if not os.path.exists(os.path.dirname(enum_filename)):
-        print("Creating output dir %s" % os.path.dirname(enum_filename))
-        os.mkdir(os.path.dirname(enum_filename))
+        enum_sh_filename = os.path.join(os.getcwd(), opts.rel_out_dir, os.path.basename(opts.input_file).strip(".h")+"_enum_string_helper.h")
+    enum_sh_filename = os.path.abspath(enum_sh_filename)
+    if not os.path.exists(os.path.dirname(enum_sh_filename)):
+        print("Creating output dir %s" % os.path.dirname(enum_sh_filename))
+        os.mkdir(os.path.dirname(enum_sh_filename))
     if opts.gen_enum_string_helper:
-        print("Generating enum string helper to %s" % enum_filename)
-        eg = EnumCodeGen(enum_type_dict, enum_val_dict, typedef_fwd_dict, os.path.basename(opts.input_file), enum_filename)
+        print("Generating enum string helper to %s" % enum_sh_filename)
+        enum_vh_filename = os.path.join(os.path.dirname(enum_sh_filename), os.path.basename(opts.input_file).strip(".h")+"_enum_validate_helper.h")
+        print("Generating enum validate helper to %s" % enum_vh_filename)
+        eg = EnumCodeGen(enum_type_dict, enum_val_dict, typedef_fwd_dict, os.path.basename(opts.input_file), enum_sh_filename, enum_vh_filename)
         eg.generateStringHelper()
+        eg.generateEnumValidate()
     #for struct in struct_dict:
     #print(struct)
     if opts.gen_struct_wrappers:
-        sw = StructWrapperGen(struct_dict, os.path.basename(opts.input_file).strip(".h"), os.path.dirname(enum_filename))
+        sw = StructWrapperGen(struct_dict, os.path.basename(opts.input_file).strip(".h"), os.path.dirname(enum_sh_filename))
         #print(sw.get_class_name(struct))
-        sw.set_include_headers([os.path.basename(opts.input_file),os.path.basename(enum_filename),"stdint.h","stdio.h","stdlib.h"])
+        sw.set_include_headers([os.path.basename(opts.input_file),os.path.basename(enum_sh_filename),"stdint.h","stdio.h","stdlib.h"])
         print("Generating struct wrapper header to %s" % sw.header_filename)
         sw.generateHeader()
         print("Generating struct wrapper class to %s" % sw.class_filename)
@@ -1113,11 +1134,11 @@
         sw.set_no_addr(True)
         sw.generateStringHelper()
     if opts.gen_cmake:
-        cmg = CMakeGen(sw, os.path.dirname(enum_filename))
+        cmg = CMakeGen(sw, os.path.dirname(enum_sh_filename))
         cmg.generate()
     if opts.gen_graphviz:
-        gv = GraphVizGen(struct_dict, os.path.basename(opts.input_file).strip(".h"), os.path.dirname(enum_filename))
-        gv.set_include_headers([os.path.basename(opts.input_file),os.path.basename(enum_filename),"stdint.h","stdio.h","stdlib.h"])
+        gv = GraphVizGen(struct_dict, os.path.basename(opts.input_file).strip(".h"), os.path.dirname(enum_sh_filename))
+        gv.set_include_headers([os.path.basename(opts.input_file),os.path.basename(enum_sh_filename),"stdint.h","stdio.h","stdlib.h"])
         gv.generate()
     print("DONE!")
     #print(typedef_rev_dict)