2 # Copyright (C) 2013 Google Inc. All rights reserved.
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
8 # * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 # * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
14 # * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 from name_utilities
import lower_first
35 import template_expander
38 class RuntimeFeatureWriter(in_generator
.Writer
):
39 class_name
= 'RuntimeEnabledFeatures'
41 'enable_conditional': name_utilities
.enable_conditional_if_endif
,
44 # FIXME: valid_values and defaults should probably roll into one object.
46 'status': ['stable', 'experimental', 'test', 'deprecated'],
60 def __init__(self
, in_file_path
):
61 super(RuntimeFeatureWriter
, self
).__init
__(in_file_path
)
62 self
._outputs
= {(self
.class_name
+ '.h'): self
.generate_header
,
63 (self
.class_name
+ '.cpp'): self
.generate_implementation
,
66 self
._features
= self
.in_file
.name_dictionaries
67 # Make sure the resulting dictionaries have all the keys we expect.
68 for feature
in self
._features
:
69 feature
['first_lowered_name'] = lower_first(feature
['name'])
70 feature
['status'] = self
._status
_aliases
.get(feature
['status'], feature
['status'])
71 # Most features just check their isFooEnabled bool
72 # but some depend on or are implied by other bools.
73 enabled_condition
= 'is%sEnabled' % feature
['name']
74 assert not feature
['implied_by'] or not feature
['depends_on'], 'Only one of implied_by and depends_on is allowed'
75 for implied_by_name
in feature
['implied_by']:
76 enabled_condition
+= ' || is%sEnabled' % implied_by_name
77 for dependant_name
in feature
['depends_on']:
78 enabled_condition
+= ' && is%sEnabled' % dependant_name
79 feature
['enabled_condition'] = enabled_condition
80 self
._non
_custom
_features
= filter(lambda feature
: not feature
['custom'], self
._features
)
82 def _feature_sets(self
):
83 # Another way to think of the status levels is as "sets of features"
84 # which is how we're referring to them in this generator.
85 return [status
for status
in self
.valid_values
['status'] if status
not in self
._status
_aliases
]
87 @template_expander.use_jinja(class_name
+ '.h.tmpl', filters
=filters
)
88 def generate_header(self
):
90 'features': self
._features
,
91 'feature_sets': self
._feature
_sets
(),
94 @template_expander.use_jinja(class_name
+ '.cpp.tmpl', filters
=filters
)
95 def generate_implementation(self
):
97 'features': self
._features
,
98 'feature_sets': self
._feature
_sets
(),
102 if __name__
== '__main__':
103 in_generator
.Maker(RuntimeFeatureWriter
).main(sys
.argv
)