/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

#ifndef DOM_MEDIA_WEBRTC_LIBWEBRTCOVERRIDES_API_WEBRTCLOCATION_H_
#define DOM_MEDIA_WEBRTC_LIBWEBRTCOVERRIDES_API_WEBRTCLOCATION_H_

// See bug 1973646 for moving this file to use std::source_location.

#ifdef __has_builtin
#  define MOZ_HAS_BUILTIN(bi) __has_builtin(bi)
#else
// Note: For toolchains without __has_builtin, we define MOZ_HAS_BUILTIN to
// return true on modern-enough MSVC, and otherwise false.
#  define MOZ_HAS_BUILTIN(bi) _MSC_VER >= 1926
#endif

#if MOZ_HAS_BUILTIN(__builtin_FUNCTION)
#  define MOZ_BUILTIN_FUNCTION __builtin_FUNCTION
#else
#  define MOZ_BUILTIN_FUNCTION() nullptr
#endif

#if MOZ_HAS_BUILTIN(__builtin_FILE)
#  define MOZ_BUILTIN_FILE __builtin_FILE
#else
#  define MOZ_BUILTIN_FILE() nullptr
#endif

#if MOZ_HAS_BUILTIN(__builtin_LINE)
#  define MOZ_BUILTIN_LINE __builtin_LINE
#else
#  define MOZ_BUILTIN_LINE() 0
#endif

namespace mozilla {
class WebrtcLocation {
 private:
  WebrtcLocation(const char* aFunction, const char* aFile, int aLine)
      : mFunction(aFunction), mFile(aFile), mLine(aLine) {}

 public:
  static WebrtcLocation Current(const char* aFunction = MOZ_BUILTIN_FUNCTION(),
                                const char* aFile = MOZ_BUILTIN_FILE(),
                                int aLine = MOZ_BUILTIN_LINE()) {
    return WebrtcLocation(aFunction, aFile, aLine);
  }

  const char* const mFunction;
  const char* const mFile;
  const int mLine;
};

}  // namespace mozilla

namespace webrtc {
using Location = mozilla::WebrtcLocation;
}  // namespace webrtc

#undef MOZ_BUILTIN_FUNCTION
#undef MOZ_BUILTIN_FILE
#undef MOZ_BUILTIN_LINE
#undef MOZ_HAS_BUILTIN

#endif  // DOM_MEDIA_WEBRTC_LIBWEBRTCOVERRIDES_API_WEBRTCLOCATION_H_
