// Copyright 2020 The Pigweed Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #pragma once #include "pw_assert_basic/handler.h" #include "pw_preprocessor/arguments.h" #include "pw_preprocessor/compiler.h" #include "pw_preprocessor/util.h" // Use __PRETTY_FUNCTION__, a GNU extension, in place of the __func__ macro when // supported. __PRETTY_FUNCTION__ expands to the full C++ function name. #ifdef __GNUC__ #define _PW_ASSERT_BASIC_FUNCTION_NAME __PRETTY_FUNCTION__ #else #define _PW_ASSERT_BASIC_FUNCTION_NAME __func__ #endif // __GNUC__ // Die with a message with many attributes included. This is the crash macro // frontend that funnels everything into the C handler provided by the user, // pw_assert_basic_HandleFailure(). #define PW_HANDLE_CRASH(...) \ pw_assert_basic_HandleFailure( \ __FILE__, \ __LINE__, \ _PW_ASSERT_BASIC_FUNCTION_NAME PW_COMMA_ARGS(__VA_ARGS__)) // Die with a message with many attributes included. This is the crash macro // frontend that funnels everything into the C handler provided by the user, // pw_assert_basic_HandleFailure(). #define PW_HANDLE_ASSERT_FAILURE(condition_string, message, ...) \ pw_assert_basic_HandleFailure(__FILE__, \ __LINE__, \ _PW_ASSERT_BASIC_FUNCTION_NAME, \ "Check failed: " condition_string \ ". " message PW_COMMA_ARGS(__VA_ARGS__)) // Sample assert failure message produced by the below implementation: // // Check failed: current_sensor (=610) < new_sensor (=50). More details! // // Putting the value next to the operand makes the string easier to read. // clang-format off // This is too hairy for clang format to handle and retain readability. #define PW_HANDLE_ASSERT_BINARY_COMPARE_FAILURE(arg_a_str, \ arg_a_val, \ comparison_op_str, \ arg_b_str, \ arg_b_val, \ type_fmt, \ message, ...) \ pw_assert_basic_HandleFailure( \ __FILE__, \ __LINE__, \ _PW_ASSERT_BASIC_FUNCTION_NAME, \ "Check failed: " \ arg_a_str " (=" type_fmt ") " \ comparison_op_str " " \ arg_b_str " (=" type_fmt ")" \ ". " message, \ arg_a_val, arg_b_val PW_COMMA_ARGS(__VA_ARGS__)) // clang-format on