Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Side by Side Diff: ui/ozone/generate_constructor_list.py

Issue 313963007: ozone: Implement PlatformObject<T> for platform-specific objects (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: clang-format Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | ui/ozone/generate_ozone_platform_list.py » ('j') | ui/ozone/platform_selection.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright 2014 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 """Code generator for PlatformObject<> constructor list.
7
8 This script takes as arguments a list of platform names as a text file and
9 a list of types and generates a C++ source file containing a list of
10 the constructors for that object in platform order.
11
12 Example Output: ./generate_constructor_list.py --platform test --platform dri \
13 --export OZONE_EXPORT --namespace ui \
14 --typename OzonePlatform
15
16 // constructor_list.cc
17
18 namespace ui {
19
20 typedef OzonePlatform* (*OzonePlatformConstructor)();
21
22 OzonePlatform* CreateOzonePlatformEgltest();
23
24 template <> const OzonePlatformConstructor
25 PlatformConstructorList<OzonePlatform>::kConstructors[] = {
26 &CreateOzonePlatformTest,
27 &CreateOzonePlatformDri,
28 };
29
30 template class OZONE_EXPORT PlatformObject<OzonePlatform>;
31
32 } // namespace ui
33
34 """
35
36 import optparse
37 import os
38 import collections
39 import re
40 import sys
41 import string
42
43
44 def GetTypedefName(typename):
45 """Determine typedef name of constructor for typename.
46
47 This is just typename + "Constructor".
48 """
49
50 return typename + 'Constructor'
51
52
53 def GetConstructorName(typename, platform):
54 """Determine name of static constructor function from platform name.
55
56 This is just "Create" + typename + platform.
57 """
58
59 return 'Create' + typename + string.capitalize(platform)
60
61
62 def GenerateConstructorList(out, namespace, export, typenames, platforms,
63 includes):
64 """Generate static array containing a list of constructors."""
65
66 out.write('// DO NOT MODIFY. GENERATED BY generate_constructor_list.py\n')
67 out.write('\n')
68
69 out.write('#include "ui/ozone/platform_object_internal.h"\n')
70 out.write('\n')
71
72 for include in includes:
73 out.write('#include %(include)s\n' % {'include': include})
74 out.write('\n')
75
76 out.write('namespace %(namespace)s {\n' % {'namespace': namespace})
77 out.write('\n')
78
79 # Handy typedefs for constructor types.
80 for typename in typenames:
81 out.write('typedef %(typename)s* (*%(typedef)s)();\n'
82 % {'typename': typename, 'typedef': GetTypedefName(typename)})
83 out.write('\n')
84
85 # Declarations of constructor functions.
86 for typename in typenames:
87 for platform in platforms:
88 out.write('%(typename)s* %(constructor)s();\n'
89 % {'typename': typename,
90 'constructor': GetConstructorName(typename, platform)})
91 out.write('\n')
92
93 # The actual constructor lists.
94 for typename in typenames:
95 out.write('template <> const %(typedef)s\n'
96 % {'typedef': GetTypedefName(typename)})
97 out.write('PlatformConstructorList<%(typename)s>::kConstructors[] = {\n'
98 % {'typename': typename})
99 for platform in platforms:
100 out.write(' &%(constructor)s,\n'
101 % {'constructor': GetConstructorName(typename, platform)})
102 out.write('};\n')
103 out.write('\n')
104
105 # Exported template instantiation.
106 for typename in typenames:
107 out.write('template class %(export)s PlatformObject<%(typename)s>;\n'
108 % {'export': export, 'typename': typename})
109 out.write('\n')
110
111 out.write('} // namespace %(namespace)s\n' % {'namespace': namespace})
112 out.write('\n')
113
114
115 def main(argv):
116 parser = optparse.OptionParser()
117 parser.add_option('--namespace', default='ozone')
118 parser.add_option('--export', default='OZONE_EXPORT')
119 parser.add_option('--platform_list')
120 parser.add_option('--output_cc')
121 parser.add_option('--include', action='append', default=[])
122 parser.add_option('--platform', action='append', default=[])
123 parser.add_option('--typename', action='append', default=[])
124 options, _ = parser.parse_args(argv)
125
126 platforms = list(options.platform)
127 typenames = list(options.typename)
128 includes = list(options.include)
129
130 if options.platform_list:
131 platforms = open(options.platform_list, 'r').read().strip().split('\n')
132
133 # Write to standard output or file specified by --output_cc.
134 out_cc = sys.stdout
135 if options.output_cc:
136 out_cc = open(options.output_cc, 'wb')
137
138 GenerateConstructorList(out_cc, options.namespace, options.export,
139 typenames, platforms, includes)
140
141 if options.output_cc:
142 out_cc.close()
143
144 return 0
145
146
147 if __name__ == '__main__':
148 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | ui/ozone/generate_ozone_platform_list.py » ('j') | ui/ozone/platform_selection.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698