// Copyright 2019 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.
//
// Small, general preprocessor macros for C and C++ code.
#pragma once

// Returns the number of elements in a C array.
#define PW_ARRAY_SIZE(array) (sizeof(array) / sizeof(*array))

// Prevents unused value compiler warnings.
#define PW_UNUSED(value) ((void)sizeof(value))

// Returns a string literal of the arguments after expanding macros.
#define PW_STRINGIFY(...) _PW_STRINGIFY(__VA_ARGS__)
#define _PW_STRINGIFY(...) #__VA_ARGS__

#ifdef __cplusplus

// Macro for inline extern "C" declarations. The following will compile
// correctly for C and C++:
//
//   PW_EXTERN_C ThisFunctionHasCLinkage(void);
//
#define PW_EXTERN_C extern "C"

// Macros for opening and closing an extern "C" block. This avoids the need for
// an #ifdef __cplusplus check around the extern "C" { and closing }. Example:
//
//   PW_EXTERN_C_START
//
//   void FunctionDeclarationForCppAndC(void);
//
//   void AnotherFunctionDeclarationForCppAndC(int, char);
//
//   PW_EXTERN_C_END
//
#define PW_EXTERN_C_START extern "C" {
#define PW_EXTERN_C_END }  // extern "C"

#else  // extern "C" is removed from C code

#define PW_EXTERN_C
#define PW_EXTERN_C_START
#define PW_EXTERN_C_END

#endif  // __cplusplus
