diff src/genprops.awk @ 8061:f819e8992367

Auto-generate base_properties
author John W. Eaton <jwe@octave.org>
date Tue, 26 Aug 2008 13:32:52 -0400
parents 75c99d3f97d7
children 41bc700ff642
line wrap: on
line diff
--- a/src/genprops.awk
+++ b/src/genprops.awk
@@ -112,8 +112,8 @@
 ##       settable from the global set (caseless_str, octave_value)
 ##       method, but still has set_X accessor.
 ##
-##   u:  The property has an updater method. This effectively add
-##       the line
+##   u:  The property has an inline updater method. This effectively
+##       add the line
 ##
 ##         update_NAME ();
 ##
@@ -121,6 +121,11 @@
 ##       any other update call (like those added by the 'l' or 'm'
 ##       modifiers.
 ##
+##   U:  Like 'u' modifier except that the updater is not inline.
+##       A declaration for the updater function will be emitted.
+##
+##   f:  The property does not have any factory default value.
+##
 ## The 'o' and 'O' qualifiers are only useful when the the property type
 ## is something other than octave_value.
 
@@ -249,11 +254,11 @@
 
 function emit_declarations ()
 {
-  if (class_name)
+  if (class_name && ! base)
     emit_common_declarations();
 
   if (idx > 0)
-    print "private:\n";
+    print (base ? "protected:\n" : "private:\n");
 
   for (i = 1; i <= idx; i++)
     printf ("  %s%s %s;\n", mutable[i] ? "mutable " : "", type[i], name[i]);
@@ -377,12 +382,20 @@
 
     ## constructor
 
-    printf ("%s::properties::properties (const graphics_handle& mh, const graphics_handle& p)\n", class_name) >> filename;
-    printf ("  : base_properties (go_name, mh, p),\n") >> filename;
+    if (base)
+      printf ("base_properties::base_properties (const std::string& ty, const graphics_handle& mh, const graphics_handle& p)\n  : ") >> filename;
+    else
+    {
+      printf ("%s::properties::properties (const graphics_handle& mh, const graphics_handle& p)\n", class_name) >> filename;
+      printf ("  : base_properties (go_name, mh, p),\n") >> filename;
+    }
 
     for (i = 1; i <= idx; i++)
     {
-      printf ("    %s (\"%s\", mh, %s)", name[i], name[i], defval[i]) >> filename;
+      if (ptype[i])
+        printf ("    %s (\"%s\", mh, %s)", name[i], name[i], defval[i]) >> filename;
+      else
+        printf ("    %s (%s)", name[i], defval[i]) >> filename;
       if (i < idx)
         printf (",") >> filename;
       printf ("\n") >> filename;
@@ -393,17 +406,23 @@
     for (i = 1; i <= idx; i++)
     {
 ##    printf ("  insert_static_property (\"%s\", %s);\n", name[i], name[i]) >> filename;
-      printf ("  %s.set_id (%s);\n", name[i], toupper(name[i])) >> filename;
-      if (hidden[i])
-        printf ("  %s.set_hidden (true);\n", name[i]) >> filename;
+      if (ptype[i])
+      {
+        printf ("  %s.set_id (%s);\n", name[i], toupper(name[i])) >> filename;
+        if (hidden[i])
+          printf ("  %s.set_hidden (true);\n", name[i]) >> filename;
+      }
     }
 
     printf ("  init ();\n}\n\n") >> filename;
 
     ## set method
 
-    printf ("void\n%s::properties::set (const caseless_str& pname, const octave_value& val)\n{\n",
-            class_name) >> filename;
+    if (base)
+      printf ("void\nbase_properties::set (const caseless_str& pname, const octave_value& val)\n{\n") >> filename;
+    else
+      printf ("void\n%s::properties::set (const caseless_str& pname, const octave_value& val)\n{\n",
+              class_name) >> filename;
 
     first = 1;
 
@@ -417,29 +436,43 @@
       }
     }
 
-    printf ("  else\n    base_properties::set (pname, val);\n}\n\n") >> filename;
+    if (base)
+      printf ("  else\n    set_dynamic (pname, val);\n}\n\n") >> filename;
+    else
+      printf ("  else\n    base_properties::set (pname, val);\n}\n\n") >> filename;
 
     ## get "all" method
 
-    printf ("octave_value\n%s::properties::get (bool all) const\n{\n", class_name) >> filename;
-    printf ("  Octave_map m = base_properties::get (all).map_value ();\n\n") >> filename;
+    if (base)
+    {
+      printf ("octave_value\nbase_properties::get (bool all) const\n{\n") >> filename;
+      printf ("  Octave_map m = get_dynamic (all).map_value ();\n\n") >> filename;
+    }
+    else
+    {
+      printf ("octave_value\n%s::properties::get (bool all) const\n{\n", class_name) >> filename;
+      printf ("  Octave_map m = base_properties::get (all).map_value ();\n\n") >> filename;
+    }
 
     for (i = 1; i <= idx; i++)
     {
       if (hidden[i])
         printf ("  if (all)\n    m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i],
-                (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename;
+                (type[i] == "handle_property" || type[i] == "graphics_handle" ? ".as_octave_value ()" : "")) >> filename;
       else
         printf ("  m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i],
-                (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename;
+                (type[i] == "handle_property" || type[i] == "graphics_handle" ? ".as_octave_value ()" : "")) >> filename;
     }
 
     printf ("\n  return m;\n}\n\n") >> filename;
     
     ## get "one" method
 
-    printf ("octave_value\n%s::properties::get (const caseless_str& pname) const\n{\n",
-            class_name) >> filename;
+    if (base)
+      printf ("octave_value\nbase_properties::get (const caseless_str& pname) const\n{\n") >> filename;
+    else
+      printf ("octave_value\n%s::properties::get (const caseless_str& pname) const\n{\n",
+              class_name) >> filename;
     printf ("  octave_value retval;\n\n") >> filename;
 
     for (i = 1; i<= idx; i++)
@@ -447,58 +480,82 @@
       printf ("  %sif (pname.compare (\"%s\"))\n",
               (i > 1 ? "else " : ""), name[i]) >> filename;
       printf ("    retval = get_%s ()%s;\n", name[i],
-              (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename;
+              (type[i] == "handle_property" || type[i] == "graphics_handle" ? ".as_octave_value ()" : "")) >> filename;
     }
 
-    printf ("  else\n    retval = base_properties::get (pname);\n\n") >> filename;
+    if (base)
+      printf ("  else\n    retval = get_dynamic (pname);\n\n") >> filename;
+    else
+      printf ("  else\n    retval = base_properties::get (pname);\n\n") >> filename;
     printf ("  return retval;\n}\n\n") >> filename;
 
     ## get_property method
 
-    printf ("property\n%s::properties::get_property (const caseless_str& pname)\n{\n",
-            class_name) >> filename;
+    if (base)
+      printf ("property\nbase_properties::get_property (const caseless_str& pname)\n{\n") >> filename;
+    else
+      printf ("property\n%s::properties::get_property (const caseless_str& pname)\n{\n",
+              class_name) >> filename;
 
     for (i = 1; i<= idx; i++)
     {
-      printf ("  %sif (pname.compare (\"%s\"))\n",
-              (i > 1 ? "else " : ""), name[i]) >> filename;
-      printf ("    return property (&%s, true);\n", name[i]) >> filename;
+      if (ptype[i])
+      {
+        printf ("  %sif (pname.compare (\"%s\"))\n",
+                (i > 1 ? "else " : ""), name[i]) >> filename;
+        printf ("    return property (&%s, true);\n", name[i]) >> filename;
+      }
     }
 
-    printf ("  else\n    return base_properties::get_property (pname);\n") >> filename;
+    if (base)
+      printf ("  else\n    return get_property_dynamic (pname);\n") >> filename;
+    else
+      printf ("  else\n    return base_properties::get_property (pname);\n") >> filename;
     printf ("}\n\n") >> filename;
 
 
     ## factory defaults method
 
-    printf ("property_list::pval_map_type\n%s::properties::factory_defaults (void)\n{\n",
-            class_name) >> filename;
-    printf ("  property_list::pval_map_type m;\n\n") >> filename;
+    if (base)
+    {
+      printf ("property_list::pval_map_type\nbase_properties::factory_defaults (void)\n{\n") >> filename;
+      printf ("  property_list::pval_map_type m;\n\n") >> filename;
+    }
+    else
+    {
+      printf ("property_list::pval_map_type\n%s::properties::factory_defaults (void)\n{\n",
+              class_name) >> filename;
+      printf ("  property_list::pval_map_type m = base_properties::factory_defaults ();\n\n") >> filename;
+    }
 
     for (i = 1; i <= idx; i++)
     {
-      dval = defval[i];
-      if (type[i] == "radio_property" || type[i] == "color_property")
-	{
-	  k = index (dval, "{");
-	  dval = substr (dval, k+1);
-	  l = index (dval, "}");
-	  if (k > 0 && l > 0)
-	    dval = "\"" + substr (dval, 1, l-1) +  "\"";
-	  else
-	    dval = "octave_value ()";
-	}
+      if (factory[i])
+      {
+        dval = defval[i];
+        if (type[i] == "radio_property" || type[i] == "color_property")
+      	{
+      	  k = index (dval, "{");
+    	    dval = substr (dval, k+1);
+  	      l = index (dval, "}");
+      	  if (k > 0 && l > 0)
+	          dval = "\"" + substr (dval, 1, l-1) +  "\"";
+    	    else
+  	        dval = "octave_value ()";
+      	}
 
-      printf ("  m[\"%s\"] = %s%s;\n", name[i], dval,
-		 (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename;
+        printf ("  m[\"%s\"] = %s%s;\n", name[i], dval,
+                (type[i] == "handle_property" || type[i] == "graphics_handle" ? ".as_octave_value ()" : "")) >> filename;
+      }
     }
 
     printf ("\n  return m;\n}\n\n") >> filename;
 
     ## go_name static field
 
-    printf ("std::string %s::properties::go_name (\"%s\");\n\n",
-            class_name, class_name) >> filename;
+    if (! base)
+      printf ("std::string %s::properties::go_name (\"%s\");\n\n",
+              class_name, class_name) >> filename;
   }
 }
 
@@ -506,7 +563,7 @@
   filename = "graphics-props.cc";
   printf ("// DO NOT EDIT!  Generated automatically by genprops.awk.\n\n");
   printf ("// DO NOT EDIT!  Generated automatically by genprops.awk.\n\n") > filename;
-  pcount = 1000;
+  pcount = 0;
 }
 
 /BEGIN_PROPERTIES\(.*\)/ {
@@ -517,6 +574,7 @@
   str = substr (str, k + 17);
   l = index (str, ")");
   class_name = substr (str, 1, l-1);
+  base = 0;
   next;
 }
 
@@ -524,6 +582,15 @@
   gather = 1;
   idx = 0;
   class_name = "";
+  base = 0;
+  next;
+}
+
+/BEGIN_BASE_PROPERTIES/ {
+  gather = 1;
+  idx = 0;
+  class_name = "base";
+  base = 1;
   next;
 }
 
@@ -553,6 +620,7 @@
       mutable[idx] = 0;
 
     type[idx] = $(field++);
+    ptype[idx] = (type[idx] ~ /^.*_property$/);
     name[idx] = $(field++);
 
     limits[idx] = 0;
@@ -563,6 +631,7 @@
     emit_set[idx] = "definition";
     defval[idx] = "";
     updater[idx] = "";
+    factory[idx] = 1;
 ##    if (type[idx] == "octave_value")
 ##      emit_ov_set[idx] = "";
 ##    else
@@ -618,6 +687,10 @@
         if (index (quals, "U"))
           updater[idx] = "extern";
 
+	## There is not factory default value
+        if (index (quals, "f"))
+          factory[idx] = 0;
+
 ##        ## emmit an asignment set function
 ##        if (index (quals, "a"))
 ##          emit_ov_set[idx] = "assignment";