summaryrefslogtreecommitdiffstats
path: root/chromium/ui/ozone/generate_constructor_list.py
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/ozone/generate_constructor_list.py')
-rwxr-xr-xchromium/ui/ozone/generate_constructor_list.py169
1 files changed, 169 insertions, 0 deletions
diff --git a/chromium/ui/ozone/generate_constructor_list.py b/chromium/ui/ozone/generate_constructor_list.py
new file mode 100755
index 00000000000..42a07e2e17f
--- /dev/null
+++ b/chromium/ui/ozone/generate_constructor_list.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Code generator for PlatformObject<> constructor list.
+
+This script takes as arguments a list of platform names as a text file and
+a list of types and generates a C++ source file containing a list of
+the constructors for that object in platform order.
+
+Example Output: ./ui/ozone/generate_constructor_list.py \
+ --platform test \
+ --platform dri \
+ --export OZONE_EXPORT \
+ --namespace ui \
+ --typename OzonePlatform \
+ --include '"ui/ozone/ozone_platform.h"'
+
+ // DO NOT MODIFY. GENERATED BY generate_constructor_list.py
+
+ #include "ui/ozone/platform_object_internal.h"
+
+ #include "ui/ozone/ozone_platform.h"
+
+ namespace ui {
+
+ OzonePlatform* CreateOzonePlatformTest();
+ OzonePlatform* CreateOzonePlatformDri();
+
+ } // namespace ui
+
+ namespace ui {
+
+ typedef ui::OzonePlatform* (*OzonePlatformConstructor)();
+
+ template <> const OzonePlatformConstructor
+ PlatformConstructorList<ui::OzonePlatform>::kConstructors[] = {
+ &ui::CreateOzonePlatformTest,
+ &ui::CreateOzonePlatformDri,
+ };
+
+ template class OZONE_EXPORT PlatformObject<ui::OzonePlatform>;
+
+ } // namespace ui
+"""
+
+import optparse
+import os
+import collections
+import re
+import sys
+import string
+
+
+def GetTypedefName(typename):
+ """Determine typedef name of constructor for typename.
+
+ This is just typename + "Constructor".
+ """
+
+ return typename + 'Constructor'
+
+
+def GetConstructorName(typename, platform):
+ """Determine name of static constructor function from platform name.
+
+ This is just "Create" + typename + platform.
+ """
+
+ return 'Create' + typename + string.capitalize(platform)
+
+
+def GenerateConstructorList(out, namespace, export, typenames, platforms,
+ includes):
+ """Generate static array containing a list of constructors."""
+
+ out.write('// DO NOT MODIFY. GENERATED BY generate_constructor_list.py\n')
+ out.write('\n')
+
+ out.write('#include "ui/ozone/platform_object_internal.h"\n')
+ out.write('\n')
+
+ for include in includes:
+ out.write('#include %(include)s\n' % {'include': include})
+ out.write('\n')
+
+ out.write('namespace %(namespace)s {\n' % {'namespace': namespace})
+ out.write('\n')
+
+ # Declarations of constructor functions.
+ for typename in typenames:
+ for platform in platforms:
+ constructor = GetConstructorName(typename, platform)
+ out.write('%(typename)s* %(constructor)s();\n'
+ % {'typename': typename,
+ 'constructor': constructor})
+ out.write('\n')
+
+ out.write('} // namespace %(namespace)s\n' % {'namespace': namespace})
+ out.write('\n')
+
+ out.write('namespace ui {\n')
+ out.write('\n')
+
+ # Handy typedefs for constructor types.
+ for typename in typenames:
+ out.write('typedef %(typename)s* (*%(typedef)s)();\n'
+ % {'typename': namespace + '::' + typename,
+ 'typedef': GetTypedefName(typename)})
+ out.write('\n')
+
+ # The actual constructor lists.
+ for typename in typenames:
+ out.write('template <> const %(typedef)s\n'
+ % {'typedef': GetTypedefName(typename)})
+ out.write('PlatformConstructorList<%(typename)s>::kConstructors[] = {\n'
+ % {'typename': namespace + '::' + typename})
+ for platform in platforms:
+ constructor = GetConstructorName(typename, platform)
+ out.write(' &%(namespace)s::%(constructor)s,\n'
+ % {'namespace': namespace, 'constructor': constructor})
+ out.write('};\n')
+ out.write('\n')
+
+ # Exported template instantiation.
+ for typename in typenames:
+ out.write('template class %(export)s PlatformObject<%(typename)s>;\n'
+ % {'export': export, 'typename': namespace + '::' + typename})
+ out.write('\n')
+
+ out.write('} // namespace ui\n')
+ out.write('\n')
+
+
+def main(argv):
+ parser = optparse.OptionParser()
+ parser.add_option('--namespace', default='ozone')
+ parser.add_option('--export', default='OZONE_EXPORT')
+ parser.add_option('--platform_list')
+ parser.add_option('--output_cc')
+ parser.add_option('--include', action='append', default=[])
+ parser.add_option('--platform', action='append', default=[])
+ parser.add_option('--typename', action='append', default=[])
+ options, _ = parser.parse_args(argv)
+
+ platforms = list(options.platform)
+ typenames = list(options.typename)
+ includes = list(options.include)
+
+ if options.platform_list:
+ platforms = open(options.platform_list, 'r').read().strip().split('\n')
+
+ # Write to standard output or file specified by --output_cc.
+ out_cc = sys.stdout
+ if options.output_cc:
+ out_cc = open(options.output_cc, 'wb')
+
+ GenerateConstructorList(out_cc, options.namespace, options.export,
+ typenames, platforms, includes)
+
+ if options.output_cc:
+ out_cc.close()
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))