Changed compiler assert code so that it can be used by both C and C++ source files.

Review URL: https://webrtc-codereview.appspot.com/733005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2597 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
kma@webrtc.org
2012-08-11 00:13:25 +00:00
parent cdfa63f94f
commit de91bf7cdc
7 changed files with 39 additions and 74 deletions

View File

@ -19,8 +19,9 @@
#include <arm_neon.h>
#endif
#include "signal_processing_library.h"
#include "pitch_estimator.h"
#include "signal_processing_library.h"
#include "system_wrappers/interface/compile_assert.h"
/* log2[0.2, 0.5, 0.98] in Q8 */
static const WebRtc_Word16 kLogLagWinQ8[3] = {
@ -211,7 +212,7 @@ static void PCorr2Q32(const WebRtc_Word16 *in, WebRtc_Word32 *logcorQ8)
// Can't shift a Neon register to right with a non-constant shift value.
int32x4_t int_32x4_scale = vdupq_n_s32(-scaling);
// Assert a codition used in loop unrolling at compile-time.
WEBRTC_STATIC_ASSERT(PITCH_CORR_LEN2, PITCH_CORR_LEN2 %4 == 0);
COMPILE_ASSERT(PITCH_CORR_LEN2 %4 == 0);
for (n = 0; n < PITCH_CORR_LEN2; n += 4) {
int16x4_t int_16x4_x = vld1_s16(&x[n]);

View File

@ -20,11 +20,6 @@
#include "structs.h"
// TODO(andrew): put this into general WebRTC so other modules can use it.
// Define a compiler-time assertion.
#define WEBRTC_STATIC_ASSERT(name, boolean_cond) \
static char const static_assert_##name[(boolean_cond) ? 1 : -1] = {'!'}
void WebRtcIsacfix_PitchAnalysis(const WebRtc_Word16 *in, /* PITCH_FRAME_LEN samples */
WebRtc_Word16 *outQ0, /* PITCH_FRAME_LEN+QLOOKAHEAD samples */
PitchAnalysisStruct *State,

View File

@ -19,6 +19,7 @@
#include "modules/audio_coding/codecs/isac/fix/source/pitch_estimator.h"
#include "modules/audio_coding/codecs/isac/fix/source/settings.h"
#include "modules/audio_coding/codecs/isac/fix/source/structs.h"
#include "system_wrappers/interface/compile_assert.h"
// Number of segments in a pitch subframe.
static const int kSegments = 5;
@ -113,10 +114,6 @@ void WebRtcIsacfix_PitchFilterCore(int loopNumber,
(*index2)++;
}
}
#else
// These two conditions are assumptions in ARM assembly file.
WEBRTC_STATIC_ASSERT(PITCH_FRACORDER, PITCH_FRACORDER == 9);
WEBRTC_STATIC_ASSERT(PITCH_DAMPORDER, PITCH_DAMPORDER == 5);
#endif
void WebRtcIsacfix_PitchFilter(WebRtc_Word16* indatQQ, // Q10 if type is 1 or 4,
@ -137,6 +134,10 @@ void WebRtcIsacfix_PitchFilter(WebRtc_Word16* indatQQ, // Q10 if type is 1 or 4,
WebRtc_Word32 tmpW32;
const WebRtc_Word16* fracoeffQQ = NULL;
// Assumptions in ARM assembly for WebRtcIsacfix_PitchFilterCoreARM().
COMPILE_ASSERT(PITCH_FRACORDER == 9);
COMPILE_ASSERT(PITCH_DAMPORDER == 5);
// Set up buffer and states.
memcpy(ubufQQ, pfp->ubufQQ, sizeof(pfp->ubufQQ));
memcpy(inystateQQ, pfp->ystateQQ, sizeof(inystateQQ));

View File

@ -18,6 +18,7 @@
#include "delay_estimator_wrapper.h"
#include "echo_control_mobile.h"
#include "ring_buffer.h"
#include "system_wrappers/interface/compile_assert.h"
#include "typedefs.h"
#ifdef ARM_WINM_LOG
@ -198,15 +199,6 @@ static const WebRtc_Word16 kSinTable[] = {
static const WebRtc_Word16 kNoiseEstQDomain = 15;
static const WebRtc_Word16 kNoiseEstIncCount = 5;
// TODO(andrew): put this into general WebRTC so other modules can use it.
// Define a compiler-time assertion.
#define WEBRTC_STATIC_ASSERT(name, boolean_cond) \
static char const static_assert_##name[(boolean_cond) ? 1 : -1] = {'!'}
// Assert a preprocessor definition at compile-time. It's an assumption
// used in assembly code, so check the assembly files before any change.
WEBRTC_STATIC_ASSERT(PART_LEN, PART_LEN % 16 == 0);
static void ComfortNoise(AecmCore_t* aecm,
const WebRtc_UWord16* dfa,
complex16_t* out,
@ -682,7 +674,9 @@ int WebRtcAecm_InitCore(AecmCore_t * const aecm, int samplingFreq)
aecm->supGainErrParamDiffAB = SUPGAIN_ERROR_PARAM_A - SUPGAIN_ERROR_PARAM_B;
aecm->supGainErrParamDiffBD = SUPGAIN_ERROR_PARAM_B - SUPGAIN_ERROR_PARAM_D;
assert(PART_LEN % 16 == 0);
// Assert a preprocessor definition at compile-time. It's an assumption
// used in assembly code, so check the assembly files before any change.
COMPILE_ASSERT(PART_LEN % 16 == 0);
// Initialize function pointers.
WebRtcAecm_WindowAndFFT = WindowAndFFTC;

View File

@ -64,11 +64,9 @@ TEST_F(RtpFormatVp8Test, TestStrictMode) {
{true, false, true, true, false, false, false};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);
@ -94,11 +92,9 @@ TEST_F(RtpFormatVp8Test, TestAggregateMode) {
const bool kExpectedFragStart[] = {true, false, false, true};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);
@ -124,11 +120,9 @@ TEST_F(RtpFormatVp8Test, TestAggregateModeManyPartitions1) {
const bool kExpectedFragStart[] = {true, false, true, true};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);
@ -154,11 +148,9 @@ TEST_F(RtpFormatVp8Test, TestAggregateModeManyPartitions2) {
const bool kExpectedFragStart[] = {true, false, true, true, false, true};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);
@ -184,11 +176,9 @@ TEST_F(RtpFormatVp8Test, TestAggregateModeTwoLargePartitions) {
const bool kExpectedFragStart[] = {true, false, true, false};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);
@ -214,11 +204,9 @@ TEST_F(RtpFormatVp8Test, TestEqualSizeModeFallback) {
const bool kExpectedFragStart[] = {true, false, false, false};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->set_sloppy_partitioning(true);
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
@ -245,11 +233,9 @@ TEST_F(RtpFormatVp8Test, TestNonReferenceBit) {
const bool kExpectedFragStart[] = {true, false};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->set_sloppy_partitioning(true);
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
@ -280,11 +266,9 @@ TEST_F(RtpFormatVp8Test, TestTl0PicIdxAndTID) {
const bool kExpectedFragStart[1] = {true};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);
@ -312,11 +296,9 @@ TEST_F(RtpFormatVp8Test, TestKeyIdx) {
const bool kExpectedFragStart[1] = {true};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);
@ -345,11 +327,9 @@ TEST_F(RtpFormatVp8Test, TestTIDAndKeyIdx) {
const bool kExpectedFragStart[1] = {true};
const int kExpectedNum = sizeof(kExpectedSizes) / sizeof(kExpectedSizes[0]);
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]),
kExpectedPart_wrong_size);
sizeof(kExpectedPart) / sizeof(kExpectedPart[0]));
COMPILE_ASSERT(kExpectedNum ==
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]),
kExpectedFragStart_wrong_size);
sizeof(kExpectedFragStart) / sizeof(kExpectedFragStart[0]));
helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
kExpectedFragStart, kExpectedNum);

View File

@ -11,17 +11,11 @@
#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_COMPILE_ASSERT_H_
#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_COMPILE_ASSERT_H_
template <bool>
struct CompileAssert {};
// Use this macro to verify at compile time that certain restrictions are met.
// The first argument is the expression to evaluate, the second is a unique
// identifier for the assert.
// Example:
// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
#undef COMPILE_ASSERT
#define COMPILE_ASSERT(expr, msg) \
typedef CompileAssert<static_cast<bool>(expr)> \
msg[static_cast<bool>(expr) ? 1 : -1]
/* Use this macro to verify at compile time that certain restrictions are met.
* The argument is the boolean expression to evaluate.
* Example:
* COMPILE_ASSERT(sizeof(foo) < 128);
*/
#define COMPILE_ASSERT(expression) switch(0){case 0: case expression:;}
#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_COMPILE_ASSERT_H_

View File

@ -22,7 +22,7 @@ Atomic32::Atomic32(WebRtc_Word32 initialValue) : _value(initialValue)
{
// Make sure that the counter variable we're using is of the same size
// as what the API expects.
COMPILE_ASSERT(sizeof(_value) == sizeof(LONG), atomic_size_mismatch);
COMPILE_ASSERT(sizeof(_value) == sizeof(LONG));
assert(Is32bitAligned());
}