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
50 lines
1.2 KiB
Plaintext
50 lines
1.2 KiB
Plaintext
#ifndef {header}_flag_provider_HEADER_H
|
|
#define {header}_flag_provider_HEADER_H
|
|
#include "{header}.h"
|
|
|
|
{{ if readwrite }}
|
|
#include <server_configurable_flags/get_flags.h>
|
|
using namespace server_configurable_flags;
|
|
{{ endif }}
|
|
|
|
#include <unordered_map>
|
|
|
|
namespace {cpp_namespace} \{
|
|
class flag_provider : public flag_provider_interface \{
|
|
private:
|
|
std::unordered_map<std::string, bool> overrides_;
|
|
|
|
public:
|
|
flag_provider()
|
|
: overrides_()
|
|
\{}
|
|
|
|
{{ for item in class_elements}}
|
|
virtual bool {item.flag_name}() override \{
|
|
auto it = overrides_.find("{item.flag_name}");
|
|
if (it != overrides_.end()) \{
|
|
return it->second;
|
|
} else \{
|
|
{{ if item.readwrite- }}
|
|
return GetServerConfigurableFlag(
|
|
"{item.device_config_namespace}",
|
|
"{item.device_config_flag}",
|
|
"{item.default_value}") == "true";
|
|
{{ -else- }}
|
|
return {item.default_value};
|
|
{{ -endif }}
|
|
}
|
|
}
|
|
|
|
virtual void {item.flag_name}(bool val) override \{
|
|
overrides_["{item.flag_name}"] = val;
|
|
}
|
|
{{ endfor }}
|
|
|
|
virtual void reset_flags() override \{
|
|
overrides_.clear();
|
|
}
|
|
};
|
|
}
|
|
#endif
|