aconfig: update c/c++ codegen
Two major changes to c/c++ codegen
(1) explicit setter for each flag instead of a generic flag setter
void override_flag(std::string name, bool val) is replaced with
void <flag name>(bool val) for each flag name
This has several advantages:
(a) generated code is more c++ idomatic
(b) no longer need to create flag name string constants
(c) any typo in the code is caught early in the build time
(2) remove flag setter and flag override reset methods/functions when
generating code targets for production. If developers want to update
their main function to take command line arg for flag overrides, they
can use compile time macros to decide if the flag override code should
be included.
Bug: b/279483801
Test: atest aconfig.test
Change-Id: I6141f7f979b32fe0426154d578edeb997ae5ff7c
diff --git a/tools/aconfig/templates/c_exported_header.template b/tools/aconfig/templates/c_exported_header.template
index 08af860..c22b048 100644
--- a/tools/aconfig/templates/c_exported_header.template
+++ b/tools/aconfig/templates/c_exported_header.template
@@ -5,16 +5,17 @@
extern "C" \{
#endif
-{{ for item in class_elements}}
-extern const char* {header}_{item.uppercase_flag_name};
-{{ endfor -}}
+{{ for item in class_elements }}
+bool {header}_{item.flag_name}();
-{{ for item in class_elements}}
-bool {header}_{item.flag_name}();{{ endfor }}
+{{ if for_test }}
+void set_{header}_{item.flag_name}(bool val);
+{{ -endif }}
+{{ endfor - }}
-void {header}_override_flag(const char* name, bool val);
-
-void {header}_reset_overrides();
+{{ if for_test }}
+void {header}_reset_flags();
+{{ -endif }}
#ifdef __cplusplus
}
diff --git a/tools/aconfig/templates/c_source_file.template b/tools/aconfig/templates/c_source_file.template
index 18da299..3d2482d 100644
--- a/tools/aconfig/templates/c_source_file.template
+++ b/tools/aconfig/templates/c_source_file.template
@@ -1,21 +1,20 @@
#include "{header}_c.h"
#include "{header}.h"
-#include <string>
-
-{{ for item in class_elements}}
-const char* {header}_{item.uppercase_flag_name} = "{item.device_config_flag}";
-{{ endfor - }}
{{ for item in class_elements}}
bool {header}_{item.flag_name}() \{
return {cpp_namespace}::{item.flag_name}();
}
-{{ endfor }}
-void {header}_override_flag(const char* name, bool val) \{
- {cpp_namespace}::override_flag(std::string(name), val);
+{{ if for_test }}
+void set_{header}_{item.flag_name}(bool val) \{
+ {cpp_namespace}::{item.flag_name}(val);
}
+{{ -endif }}
+{{ endfor -}}
-void {header}_reset_overrides() \{
- {cpp_namespace}::reset_overrides();
+{{ if for_test }}
+void {header}_reset_flags() \{
+ {cpp_namespace}::reset_flags();
}
+{{ -endif }}
diff --git a/tools/aconfig/templates/cpp_exported_header.template b/tools/aconfig/templates/cpp_exported_header.template
index ee8f0dd..e45548e 100644
--- a/tools/aconfig/templates/cpp_exported_header.template
+++ b/tools/aconfig/templates/cpp_exported_header.template
@@ -11,35 +11,43 @@
virtual ~flag_provider_interface() = default;
{{ for item in class_elements}}
virtual bool {item.flag_name}() = 0;
- {{ endfor }}
- virtual void override_flag(std::string const&, bool) \{}
- virtual void reset_overrides() \{}
+ {{ if for_test }}
+ virtual void {item.flag_name}(bool val) = 0;
+ {{ -endif }}
+ {{ endfor }}
+
+ {{ if for_test }}
+ virtual void reset_flags() \{}
+ {{ -endif }}
};
extern std::unique_ptr<flag_provider_interface> provider_;
-{{ for item in class_elements}}
-extern std::string const {item.uppercase_flag_name};{{ endfor }}
+
{{ for item in class_elements}}
inline bool {item.flag_name}() \{
- {{ if for_prod }}
+ {{ if for_test }}
+ return provider_->{item.flag_name}();
+ {{ -else- }}
{{ if not item.readwrite- }}
return {item.default_value};
{{ -else- }}
return provider_->{item.flag_name}();
{{ -endif }}
- {{ -else- }}
- return provider_->{item.flag_name}();
{{ -endif }}
}
+
+{{ if for_test }}
+inline void {item.flag_name}(bool val) \{
+ provider_->{item.flag_name}(val);
+}
+{{ -endif }}
{{ endfor }}
-inline void override_flag(std::string const& name, bool val) \{
- return provider_->override_flag(name, val);
-}
-inline void reset_overrides() \{
- return provider_->reset_overrides();
+{{ if for_test }}
+inline void reset_flags() \{
+ return provider_->reset_flags();
}
-
+{{ -endif }}
}
#endif
diff --git a/tools/aconfig/templates/cpp_source_file.template b/tools/aconfig/templates/cpp_source_file.template
index 1b4f336..d267f03 100644
--- a/tools/aconfig/templates/cpp_source_file.template
+++ b/tools/aconfig/templates/cpp_source_file.template
@@ -3,8 +3,6 @@
#include "{header}_flag_provider.h"
namespace {cpp_namespace} \{
-{{ for item in class_elements}}
-std::string const {item.uppercase_flag_name} = "{item.device_config_flag}";{{ endfor }}
std::unique_ptr<flag_provider_interface> provider_ =
std::make_unique<flag_provider>();
}
diff --git a/tools/aconfig/templates/cpp_test_flag_provider.template b/tools/aconfig/templates/cpp_test_flag_provider.template
index a24116b..afa56cf 100644
--- a/tools/aconfig/templates/cpp_test_flag_provider.template
+++ b/tools/aconfig/templates/cpp_test_flag_provider.template
@@ -8,25 +8,20 @@
{{ endif }}
#include <unordered_map>
-#include <unordered_set>
-#include <cassert>
namespace {cpp_namespace} \{
class flag_provider : public flag_provider_interface \{
private:
std::unordered_map<std::string, bool> overrides_;
- std::unordered_set<std::string> flag_names_;
public:
flag_provider()
- : overrides_(),
- flag_names_() \{
- {{ for item in class_elements}}
- flag_names_.insert({item.uppercase_flag_name});{{ endfor }}
- }
+ : overrides_()
+ \{}
+
{{ for item in class_elements}}
virtual bool {item.flag_name}() override \{
- auto it = overrides_.find({item.uppercase_flag_name});
+ auto it = overrides_.find("{item.flag_name}");
if (it != overrides_.end()) \{
return it->second;
} else \{
@@ -40,13 +35,13 @@
{{ -endif }}
}
}
- {{ endfor }}
- virtual void override_flag(std::string const& flag, bool val) override \{
- assert(flag_names_.count(flag));
- overrides_[flag] = val;
- }
- virtual void reset_overrides() override \{
+ virtual void {item.flag_name}(bool val) override \{
+ overrides_["{item.flag_name}"] = val;
+ }
+ {{ endfor }}
+
+ virtual void reset_flags() override \{
overrides_.clear();
}
};