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 <amontanez@google.com>
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
This commit is contained in:
Wyatt Hepler 2022-07-12 16:47:39 +00:00 committed by CQ Bot Account
parent 3a66f45ed9
commit 1383ec7e66

View File

@ -15,29 +15,32 @@
#include "pw_status/status.h" #include "pw_status/status.h"
#define PW_CASE_RETURN_ENUM_STRING(value) \ #define PW_CASE_RETURN_ENUM_STRING(value) \
if (status == PW_STATUS_##value) { \ case PW_STATUS_##value: \
return #value; \ return #value
}
extern "C" const char* pw_StatusString(pw_Status status) { extern "C" const char* pw_StatusString(pw_Status status) {
PW_CASE_RETURN_ENUM_STRING(OK); switch (status) {
PW_CASE_RETURN_ENUM_STRING(CANCELLED); PW_CASE_RETURN_ENUM_STRING(OK);
PW_CASE_RETURN_ENUM_STRING(UNKNOWN); PW_CASE_RETURN_ENUM_STRING(CANCELLED);
PW_CASE_RETURN_ENUM_STRING(INVALID_ARGUMENT); PW_CASE_RETURN_ENUM_STRING(UNKNOWN);
PW_CASE_RETURN_ENUM_STRING(DEADLINE_EXCEEDED); PW_CASE_RETURN_ENUM_STRING(INVALID_ARGUMENT);
PW_CASE_RETURN_ENUM_STRING(NOT_FOUND); PW_CASE_RETURN_ENUM_STRING(DEADLINE_EXCEEDED);
PW_CASE_RETURN_ENUM_STRING(ALREADY_EXISTS); PW_CASE_RETURN_ENUM_STRING(NOT_FOUND);
PW_CASE_RETURN_ENUM_STRING(PERMISSION_DENIED); PW_CASE_RETURN_ENUM_STRING(ALREADY_EXISTS);
PW_CASE_RETURN_ENUM_STRING(RESOURCE_EXHAUSTED); PW_CASE_RETURN_ENUM_STRING(PERMISSION_DENIED);
PW_CASE_RETURN_ENUM_STRING(FAILED_PRECONDITION); PW_CASE_RETURN_ENUM_STRING(RESOURCE_EXHAUSTED);
PW_CASE_RETURN_ENUM_STRING(ABORTED); PW_CASE_RETURN_ENUM_STRING(FAILED_PRECONDITION);
PW_CASE_RETURN_ENUM_STRING(OUT_OF_RANGE); PW_CASE_RETURN_ENUM_STRING(ABORTED);
PW_CASE_RETURN_ENUM_STRING(UNIMPLEMENTED); PW_CASE_RETURN_ENUM_STRING(OUT_OF_RANGE);
PW_CASE_RETURN_ENUM_STRING(INTERNAL); PW_CASE_RETURN_ENUM_STRING(UNIMPLEMENTED);
PW_CASE_RETURN_ENUM_STRING(UNAVAILABLE); PW_CASE_RETURN_ENUM_STRING(INTERNAL);
PW_CASE_RETURN_ENUM_STRING(DATA_LOSS); PW_CASE_RETURN_ENUM_STRING(UNAVAILABLE);
PW_CASE_RETURN_ENUM_STRING(UNAUTHENTICATED); PW_CASE_RETURN_ENUM_STRING(DATA_LOSS);
return "INVALID STATUS"; 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 #undef PW_CASE_RETURN_ENUM_STRING