#pragma once

#include "types.hpp"

namespace util {

struct source_location {
  _NODISCARD static constexpr source_location
  current(const uint_least32_t _Line_ = __builtin_LINE(),
          const uint_least32_t _Column_ = __builtin_COLUMN(),
          const char *const _File_ = __builtin_FILE(),
          const char *const _Function_ = __builtin_FUNCTION()) noexcept {
    source_location _Result;
    _Result._Line = _Line_;
    _Result._Column = _Column_;
    _Result._File = _File_;
    _Result._Function = _Function_;
    return _Result;
  }

  _NODISCARD_CTOR constexpr source_location() noexcept = default;

  _NODISCARD constexpr uint_least32_t line() const noexcept { return _Line; }
  _NODISCARD constexpr uint_least32_t column() const noexcept {
    return _Column;
  }
  _NODISCARD constexpr const char *file_name() const noexcept { return _File; }
  _NODISCARD constexpr const char *function_name() const noexcept {
    return _Function;
  }

private:
  uint_least32_t _Line{};
  uint_least32_t _Column{};
  const char *_File = "";
  const char *_Function = "";
};
}