From 1383ec7e66fbd717cded33056beeb60fec42abd1 Mon Sep 17 00:00:00 2001 From: Wyatt Hepler Date: Tue, 12 Jul 2022 16:47:39 +0000 Subject: [PATCH] pw_status: Use switch for pw_StatusString pw_StatusString was switched to a series of if statements rather than a switch to compile with -Wswitch-enum. Unfortunately, some compilers (including arm-none-eabi-gcc 10.3 and earlier) do not optimize the if version of the function very well, resulting in a substantial code size increase. This function replaces the if statements with a swtich. It includes the internal-use-only enum case for -Wswitch-enum compatibility. Change-Id: I81c0f93c5eb0ba4a3ca935bb97ea2b462766ee97 Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/100467 Reviewed-by: Armando Montanez Pigweed-Auto-Submit: Wyatt Hepler Commit-Queue: Auto-Submit --- pw_status/status.cc | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/pw_status/status.cc b/pw_status/status.cc index b27d5d466..41cf311f3 100644 --- a/pw_status/status.cc +++ b/pw_status/status.cc @@ -15,29 +15,32 @@ #include "pw_status/status.h" #define PW_CASE_RETURN_ENUM_STRING(value) \ - if (status == PW_STATUS_##value) { \ - return #value; \ - } + case PW_STATUS_##value: \ + return #value extern "C" const char* pw_StatusString(pw_Status status) { - PW_CASE_RETURN_ENUM_STRING(OK); - PW_CASE_RETURN_ENUM_STRING(CANCELLED); - PW_CASE_RETURN_ENUM_STRING(UNKNOWN); - PW_CASE_RETURN_ENUM_STRING(INVALID_ARGUMENT); - PW_CASE_RETURN_ENUM_STRING(DEADLINE_EXCEEDED); - PW_CASE_RETURN_ENUM_STRING(NOT_FOUND); - PW_CASE_RETURN_ENUM_STRING(ALREADY_EXISTS); - PW_CASE_RETURN_ENUM_STRING(PERMISSION_DENIED); - PW_CASE_RETURN_ENUM_STRING(RESOURCE_EXHAUSTED); - PW_CASE_RETURN_ENUM_STRING(FAILED_PRECONDITION); - PW_CASE_RETURN_ENUM_STRING(ABORTED); - PW_CASE_RETURN_ENUM_STRING(OUT_OF_RANGE); - PW_CASE_RETURN_ENUM_STRING(UNIMPLEMENTED); - PW_CASE_RETURN_ENUM_STRING(INTERNAL); - PW_CASE_RETURN_ENUM_STRING(UNAVAILABLE); - PW_CASE_RETURN_ENUM_STRING(DATA_LOSS); - PW_CASE_RETURN_ENUM_STRING(UNAUTHENTICATED); - return "INVALID STATUS"; + switch (status) { + PW_CASE_RETURN_ENUM_STRING(OK); + PW_CASE_RETURN_ENUM_STRING(CANCELLED); + PW_CASE_RETURN_ENUM_STRING(UNKNOWN); + PW_CASE_RETURN_ENUM_STRING(INVALID_ARGUMENT); + PW_CASE_RETURN_ENUM_STRING(DEADLINE_EXCEEDED); + PW_CASE_RETURN_ENUM_STRING(NOT_FOUND); + PW_CASE_RETURN_ENUM_STRING(ALREADY_EXISTS); + PW_CASE_RETURN_ENUM_STRING(PERMISSION_DENIED); + PW_CASE_RETURN_ENUM_STRING(RESOURCE_EXHAUSTED); + PW_CASE_RETURN_ENUM_STRING(FAILED_PRECONDITION); + PW_CASE_RETURN_ENUM_STRING(ABORTED); + PW_CASE_RETURN_ENUM_STRING(OUT_OF_RANGE); + PW_CASE_RETURN_ENUM_STRING(UNIMPLEMENTED); + PW_CASE_RETURN_ENUM_STRING(INTERNAL); + PW_CASE_RETURN_ENUM_STRING(UNAVAILABLE); + PW_CASE_RETURN_ENUM_STRING(DATA_LOSS); + PW_CASE_RETURN_ENUM_STRING(UNAUTHENTICATED); + case PW_STATUS_DO_NOT_USE_RESERVED_FOR_FUTURE_EXPANSION_USE_DEFAULT_IN_SWITCH_INSTEAD_: + default: + return "INVALID STATUS"; + } } #undef PW_CASE_RETURN_ENUM_STRING