blob: 5902e878b9d3f97bd77143834472795c57ce9e12 [file] [log] [blame]
/*
* Copyright (c) 2022 Apple Inc. All rights reserved.
*
* 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.
*/
#ifndef DNS_ASSERT_MACROS_H
#define DNS_ASSERT_MACROS_H
//======================================================================================================================
// MARK: - Platform Dependent Assert Macros
#ifdef __APPLE__
// MARK: - Apple
#include <AssertMacros.h>
#else
// MARK: - Other
#include <stdbool.h>
#ifndef DEBUG_ASSERT_MESSAGE
#define DEBUG_ASSERT_MESSAGE
#endif
#ifndef require
#define require(assertion, exception_label) \
do { \
if (__builtin_expect(!(assertion), 0)) { \
goto exception_label; \
} \
} while (false)
#endif
#ifndef require_quiet
#define require_quiet require
#endif
#ifndef require_action
#define require_action(assertion, exception_label, action) \
do { \
if (__builtin_expect(!(assertion), 0)) { \
{ \
action; \
} \
goto exception_label; \
} \
} while (false)
#endif
#ifndef require_action_quiet
#define require_action_quiet require_action
#endif
#ifndef require_noerr
#define require_noerr(error_code, exceptional_label) \
do { \
long error_code_long = (error_code); \
if (__builtin_expect(0 != error_code_long, 0)) { \
goto exceptional_label; \
} \
} while (false)
#endif
#ifndef require_noerr_action
#define require_noerr_action(error_code, exceptional_label, action) \
do { \
long error_code_long = (error_code); \
if (__builtin_expect(0 != error_code_long, 0)) { \
{ \
action; \
} \
goto exceptional_label; \
} \
} while (false)
#endif
#ifndef verify_action
#define verify_action(assertion, action) \
if (__builtin_expect(!(assertion), 0)) { \
action; \
} else do {} while (0)
#endif
#endif // __APPLE__
//======================================================================================================================
// MARK: - Common Assert Macros
#ifndef check_compile_time
#define check_compile_time(expr) extern int compile_time_assert_failed[(expr) ? 1 : -1]
#endif
#ifndef check_compile_time_code
#define check_compile_time_code(X) do {switch(0) {case 0: case X:;}} while( 0 )
#endif
#ifndef require_return
#define require_return(assertion) \
do { \
if(__builtin_expect(!(assertion), 0)) { \
DEBUG_ASSERT_MESSAGE("", #assertion, 0, 0, __FILE__, __LINE__, 0); \
return; \
} \
} while(false)
#endif
#ifndef require_return_quiet
#define require_return_quiet(assertion) \
do { \
if(__builtin_expect(!(assertion), 0)) { \
return; \
} \
} while(false)
#endif
#ifndef require_return_value
#define require_return_value(assertion, value) \
do { \
if(__builtin_expect(!(assertion), 0)) { \
DEBUG_ASSERT_MESSAGE("", #assertion, 0, 0, __FILE__, __LINE__, 0); \
return (value); \
} \
} while(false)
#endif
#ifndef require_return_value_quiet
#define require_return_value_quiet(assertion, value) \
do { \
if(__builtin_expect(!(assertion), 0)) { \
return (value); \
} \
} while(false)
#endif
#ifndef require_noerr_return
#define require_noerr_return(error_code) \
do { \
long error_code_long = (error_code); \
if (__builtin_expect(0 != error_code_long, 0)) { \
DEBUG_ASSERT_MESSAGE("", #error_code " == 0", 0, 0, __FILE__, __LINE__, error_code_long); \
return; \
} \
} while (false)
#endif
#ifndef require_noerr_return_quiet
#define require_noerr_return_quiet(error_code) \
do { \
long error_code_long = (error_code); \
if (__builtin_expect(0 != error_code_long, 0)) { \
return; \
} \
} while (false)
#endif
#ifndef require_noerr_return_value
#define require_noerr_return_value(error_code, value) \
do { \
long error_code_long = (error_code); \
if (__builtin_expect(0 != error_code_long, 0)) { \
DEBUG_ASSERT_MESSAGE("", #error_code " == 0", 0, 0, __FILE__, __LINE__, error_code_long); \
return (value); \
} \
} while (false)
#endif
#ifndef require_noerr_return_value_quiet
#define require_noerr_return_value_quiet(error_code, value) \
do { \
long error_code_long = (error_code); \
if (__builtin_expect(0 != error_code_long, 0)) { \
return (value); \
} \
} while (false)
#endif
#endif // DNS_ASSERT_MACROS_H