Loading tools/aconfig/src/codegen_cpp.rs +32 −11 Original line number Diff line number Diff line Loading @@ -31,9 +31,10 @@ pub fn generate_cpp_code<'a, I>( where I: Iterator<Item = &'a ProtoParsedFlag>, { let mut readwrite_count = 0; let class_elements: Vec<ClassElement> = parsed_flags_iter.map(|pf| create_class_element(package, pf)).collect(); let readwrite = class_elements.iter().any(|item| item.readwrite); parsed_flags_iter.map(|pf| create_class_element(package, pf, &mut readwrite_count)).collect(); let readwrite = readwrite_count > 0; let has_fixed_read_only = class_elements.iter().any(|item| item.is_fixed_read_only); let header = package.replace('.', "_"); let package_macro = header.to_uppercase(); Loading @@ -46,6 +47,7 @@ where package, has_fixed_read_only, readwrite, readwrite_count, for_test: codegen_mode == CodegenMode::Test, class_elements, }; Loading Loading @@ -88,12 +90,14 @@ pub struct Context<'a> { pub package: &'a str, pub has_fixed_read_only: bool, pub readwrite: bool, pub readwrite_count: i32, pub for_test: bool, pub class_elements: Vec<ClassElement>, } #[derive(Serialize)] pub struct ClassElement { pub readwrite_idx: i32, pub readwrite: bool, pub is_fixed_read_only: bool, pub default_value: String, Loading @@ -103,8 +107,13 @@ pub struct ClassElement { pub device_config_flag: String, } fn create_class_element(package: &str, pf: &ProtoParsedFlag) -> ClassElement { fn create_class_element(package: &str, pf: &ProtoParsedFlag, rw_count: &mut i32) -> ClassElement { ClassElement { readwrite_idx: if pf.permission() == ProtoFlagPermission::READ_WRITE { let index = *rw_count; *rw_count += 1; index } else { -1 }, readwrite: pf.permission() == ProtoFlagPermission::READ_WRITE, is_fixed_read_only: pf.is_fixed_read_only(), default_value: if pf.state() == ProtoFlagState::ENABLED { Loading Loading @@ -139,8 +148,12 @@ mod tests { #ifdef __cplusplus #include <memory> #include <vector> namespace com::android::aconfig::test { extern std::vector<int8_t> cache_; class flag_provider_interface { public: virtual ~flag_provider_interface() = default; Loading Loading @@ -330,11 +343,14 @@ namespace com::android::aconfig::test { } virtual bool disabled_rw() override { return server_configurable_flags::GetServerConfigurableFlag( if (cache_[0] == -1) { cache_[0] = server_configurable_flags::GetServerConfigurableFlag( "aconfig_flags.aconfig_test", "com.android.aconfig.test.disabled_rw", "false") == "true"; } return cache_[0]; } virtual bool enabled_fixed_ro() override { return COM_ANDROID_ACONFIG_TEST_ENABLED_FIXED_RO; Loading @@ -345,14 +361,19 @@ namespace com::android::aconfig::test { } virtual bool enabled_rw() override { return server_configurable_flags::GetServerConfigurableFlag( if (cache_[1] == -1) { cache_[1] = server_configurable_flags::GetServerConfigurableFlag( "aconfig_flags.aconfig_test", "com.android.aconfig.test.enabled_rw", "true") == "true"; } return cache_[1]; } }; std::vector<int8_t> cache_ = std::vector<int8_t>(2, -1); std::unique_ptr<flag_provider_interface> provider_ = std::make_unique<flag_provider>(); } Loading tools/aconfig/templates/cpp_exported_header.template +7 −1 Original line number Diff line number Diff line Loading @@ -18,10 +18,16 @@ #ifdef __cplusplus #include <memory> {{ if not for_test- }} #include <vector> {{ -endif }} namespace {cpp_namespace} \{ {{ if not for_test- }} extern std::vector<int8_t> cache_; {{ -endif }} class flag_provider_interface \{ public: virtual ~flag_provider_interface() = default; Loading tools/aconfig/templates/cpp_source_file.template +9 −5 Original line number Diff line number Diff line Loading @@ -53,10 +53,13 @@ namespace {cpp_namespace} \{ {{ for item in class_elements}} virtual bool {item.flag_name}() override \{ {{ if item.readwrite- }} return server_configurable_flags::GetServerConfigurableFlag( if (cache_[{item.readwrite_idx}] == -1) \{ cache_[{item.readwrite_idx}] = server_configurable_flags::GetServerConfigurableFlag( "aconfig_flags.{item.device_config_namespace}", "{item.device_config_flag}", "{item.default_value}") == "true"; } return cache_[{item.readwrite_idx}]; {{ -else- }} {{ if item.is_fixed_read_only }} return {package_macro}_{item.flag_macro}; Loading @@ -68,13 +71,14 @@ namespace {cpp_namespace} \{ {{ endfor }} }; std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1); {{ -endif }} std::unique_ptr<flag_provider_interface> provider_ = std::make_unique<flag_provider>(); } Loading Loading
tools/aconfig/src/codegen_cpp.rs +32 −11 Original line number Diff line number Diff line Loading @@ -31,9 +31,10 @@ pub fn generate_cpp_code<'a, I>( where I: Iterator<Item = &'a ProtoParsedFlag>, { let mut readwrite_count = 0; let class_elements: Vec<ClassElement> = parsed_flags_iter.map(|pf| create_class_element(package, pf)).collect(); let readwrite = class_elements.iter().any(|item| item.readwrite); parsed_flags_iter.map(|pf| create_class_element(package, pf, &mut readwrite_count)).collect(); let readwrite = readwrite_count > 0; let has_fixed_read_only = class_elements.iter().any(|item| item.is_fixed_read_only); let header = package.replace('.', "_"); let package_macro = header.to_uppercase(); Loading @@ -46,6 +47,7 @@ where package, has_fixed_read_only, readwrite, readwrite_count, for_test: codegen_mode == CodegenMode::Test, class_elements, }; Loading Loading @@ -88,12 +90,14 @@ pub struct Context<'a> { pub package: &'a str, pub has_fixed_read_only: bool, pub readwrite: bool, pub readwrite_count: i32, pub for_test: bool, pub class_elements: Vec<ClassElement>, } #[derive(Serialize)] pub struct ClassElement { pub readwrite_idx: i32, pub readwrite: bool, pub is_fixed_read_only: bool, pub default_value: String, Loading @@ -103,8 +107,13 @@ pub struct ClassElement { pub device_config_flag: String, } fn create_class_element(package: &str, pf: &ProtoParsedFlag) -> ClassElement { fn create_class_element(package: &str, pf: &ProtoParsedFlag, rw_count: &mut i32) -> ClassElement { ClassElement { readwrite_idx: if pf.permission() == ProtoFlagPermission::READ_WRITE { let index = *rw_count; *rw_count += 1; index } else { -1 }, readwrite: pf.permission() == ProtoFlagPermission::READ_WRITE, is_fixed_read_only: pf.is_fixed_read_only(), default_value: if pf.state() == ProtoFlagState::ENABLED { Loading Loading @@ -139,8 +148,12 @@ mod tests { #ifdef __cplusplus #include <memory> #include <vector> namespace com::android::aconfig::test { extern std::vector<int8_t> cache_; class flag_provider_interface { public: virtual ~flag_provider_interface() = default; Loading Loading @@ -330,11 +343,14 @@ namespace com::android::aconfig::test { } virtual bool disabled_rw() override { return server_configurable_flags::GetServerConfigurableFlag( if (cache_[0] == -1) { cache_[0] = server_configurable_flags::GetServerConfigurableFlag( "aconfig_flags.aconfig_test", "com.android.aconfig.test.disabled_rw", "false") == "true"; } return cache_[0]; } virtual bool enabled_fixed_ro() override { return COM_ANDROID_ACONFIG_TEST_ENABLED_FIXED_RO; Loading @@ -345,14 +361,19 @@ namespace com::android::aconfig::test { } virtual bool enabled_rw() override { return server_configurable_flags::GetServerConfigurableFlag( if (cache_[1] == -1) { cache_[1] = server_configurable_flags::GetServerConfigurableFlag( "aconfig_flags.aconfig_test", "com.android.aconfig.test.enabled_rw", "true") == "true"; } return cache_[1]; } }; std::vector<int8_t> cache_ = std::vector<int8_t>(2, -1); std::unique_ptr<flag_provider_interface> provider_ = std::make_unique<flag_provider>(); } Loading
tools/aconfig/templates/cpp_exported_header.template +7 −1 Original line number Diff line number Diff line Loading @@ -18,10 +18,16 @@ #ifdef __cplusplus #include <memory> {{ if not for_test- }} #include <vector> {{ -endif }} namespace {cpp_namespace} \{ {{ if not for_test- }} extern std::vector<int8_t> cache_; {{ -endif }} class flag_provider_interface \{ public: virtual ~flag_provider_interface() = default; Loading
tools/aconfig/templates/cpp_source_file.template +9 −5 Original line number Diff line number Diff line Loading @@ -53,10 +53,13 @@ namespace {cpp_namespace} \{ {{ for item in class_elements}} virtual bool {item.flag_name}() override \{ {{ if item.readwrite- }} return server_configurable_flags::GetServerConfigurableFlag( if (cache_[{item.readwrite_idx}] == -1) \{ cache_[{item.readwrite_idx}] = server_configurable_flags::GetServerConfigurableFlag( "aconfig_flags.{item.device_config_namespace}", "{item.device_config_flag}", "{item.default_value}") == "true"; } return cache_[{item.readwrite_idx}]; {{ -else- }} {{ if item.is_fixed_read_only }} return {package_macro}_{item.flag_macro}; Loading @@ -68,13 +71,14 @@ namespace {cpp_namespace} \{ {{ endfor }} }; std::vector<int8_t> cache_ = std::vector<int8_t>({readwrite_count}, -1); {{ -endif }} std::unique_ptr<flag_provider_interface> provider_ = std::make_unique<flag_provider>(); } Loading