#ifndef MLD_DEBUG_H
#define MLD_DEBUG_H
#include "common.h"
#if defined(MLDSA_DEBUG)
#define mld_debug_check_assert MLD_NAMESPACE(mldsa_debug_assert)
void mld_debug_check_assert(const char *file, int line, const int val);
#define mld_debug_check_bounds MLD_NAMESPACE(mldsa_debug_check_bounds)
void mld_debug_check_bounds(const char *file, int line, const int32_t *ptr,
unsigned len, int64_t lower_bound_exclusive,
int64_t upper_bound_exclusive);
#define mld_assert(val) mld_debug_check_assert(__FILE__, __LINE__, (val))
#define mld_assert_bound(ptr, len, value_lb, value_ub) \
mld_debug_check_bounds(__FILE__, __LINE__, (const int32_t *)(ptr), (len), \
((int64_t)(value_lb)) - 1, (value_ub))
#define mld_assert_abs_bound(ptr, len, value_abs_bd) \
mld_assert_bound((ptr), (len), (-((int64_t)(value_abs_bd)) + 1), \
(value_abs_bd))
#define mld_assert_bound_2d(ptr, len0, len1, value_lb, value_ub) \
mld_assert_bound((ptr), ((len0) * (len1)), (value_lb), (value_ub))
#define mld_assert_abs_bound_2d(ptr, len0, len1, value_abs_bd) \
mld_assert_abs_bound((ptr), ((len0) * (len1)), (value_abs_bd))
#elif defined(CBMC)
#include "cbmc.h"
#define mld_assert(val) cassert(val)
#define mld_assert_bound(ptr, len, value_lb, value_ub) \
cassert(array_bound(((int32_t *)(ptr)), 0, (len), (value_lb), (value_ub)))
#define mld_assert_abs_bound(ptr, len, value_abs_bd) \
cassert(array_abs_bound(((int32_t *)(ptr)), 0, (len), (value_abs_bd)))
#define mld_assert_bound_2d(ptr, M, N, value_lb, value_ub) \
cassert(forall(kN, 0, (M), \
array_bound(&((int32_t (*)[(N)])(ptr))[kN][0], 0, (N), \
(value_lb), (value_ub))))
#define mld_assert_abs_bound_2d(ptr, M, N, value_abs_bd) \
cassert(forall(kN, 0, (M), \
array_abs_bound(&((int32_t (*)[(N)])(ptr))[kN][0], 0, (N), \
(value_abs_bd))))
#else
#define mld_assert(val) \
do \
{ \
} while (0)
#define mld_assert_bound(ptr, len, value_lb, value_ub) \
do \
{ \
} while (0)
#define mld_assert_abs_bound(ptr, len, value_abs_bd) \
do \
{ \
} while (0)
#define mld_assert_bound_2d(ptr, len0, len1, value_lb, value_ub) \
do \
{ \
} while (0)
#define mld_assert_abs_bound_2d(ptr, len0, len1, value_abs_bd) \
do \
{ \
} while (0)
#endif
#endif