// 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.

// This file provides adapters for newer C++ language features so that they can
// be used in older versions of C++ (though the code will not function exactly
// the same). This file is not on an include path and is intended to be used
// with -include when compiling C++.
//
// pw_polyfill/language_feature_macros.h provides macro wrappers for a few
// specific uses of modern C++ keywords.
#pragma once

// C++11 is required for the features in this header.
#if defined(__cplusplus) && __cplusplus >= 201103L

// This is an adapter for supporting static_assert with a single argument in
// C++11 or C++14. Macros don't correctly parse commas in template expressions,
// so the static_assert arguments are passed to an overloaded C++ function. The
// full stringified static_assert arguments are used as the message.
#if __cpp_static_assert < 201411L
#undef __cpp_static_assert
#define __cpp_static_assert 201411L

#define static_assert(...)                                                     \
  static_assert(::pw::polyfill::internal::StaticAssertExpression(__VA_ARGS__), \
                #__VA_ARGS__)

namespace pw {
namespace polyfill {
namespace internal {

constexpr bool StaticAssertExpression(bool expression) { return expression; }

constexpr bool StaticAssertExpression(bool expression, const char*) {
  return expression;
}

}  // namespace internal
}  // namespace polyfill
}  // namespace pw

#endif  // __cpp_static_assert < 201411L
#endif  // defined(__cplusplus) && __cplusplus >= 201103L
