Skip to content
LeviMC
English
AutoLightDark
LeviLamina
Loading...
Searching...
No Matches
SourceLocation.h
1#pragma once
2
3#include <string>
4
5#include "ll/api/base/CompilerPredefine.h"
6#include "ll/api/base/FixedString.h"
7
8#include "fmt/format.h"
9
10namespace ll {
11class SourceLocation {
12public:
13 // Fixed capacities keep SourceLocation a structural type, so it can be used as a non-type template argument.
14 static constexpr size_t FileCapacity = 260;
15 static constexpr size_t FunctionCapacity = 128;
16 static constexpr size_t FuncsigCapacity = 256;
17
21 int mLine;
22 int mColumn;
23
24 static consteval SourceLocation current(
25 char const* file = LL_CURRENT_FILE,
26 char const* function = LL_CURRENT_FUNCTION,
27 char const* funcsig = LL_CURRENT_FUNCSIG,
28 int line = LL_CURRENT_LINE,
29 int column = LL_CURRENT_COLUMN
30 ) noexcept {
31 return {file, function, funcsig, line, column};
32 }
33
34 static consteval SourceLocation unknown() noexcept { return {"", "", "", 0, 0}; }
35
36 consteval SourceLocation(char const* file, char const* function, char const* funcsig, int line, int column) noexcept
37 : mFile(file),
38 mFunction(function),
39 mFuncsig(funcsig),
40 mLine(line),
41 mColumn(column) {}
42
43 [[nodiscard]] char const* file() const noexcept { return mFile.c_str(); }
44 [[nodiscard]] char const* function() const noexcept { return mFunction.c_str(); }
45 [[nodiscard]] char const* funcsig() const noexcept { return mFuncsig.c_str(); }
46 [[nodiscard]] int line() const noexcept { return mLine; }
47 [[nodiscard]] int column() const noexcept { return mColumn; }
48
49 [[nodiscard]] std::string toString() const {
50 return fmt::format("{} at {}({}:{})", mFunction.sv(), mFile.sv(), mLine, mColumn);
51 }
52};
53
54template <size_t N>
55struct FixedStrWithLoc : FixedString<N> {
56 SourceLocation location;
57
58 consteval FixedStrWithLoc(std::string_view s, SourceLocation const& loc = SourceLocation::current()) noexcept
59 : FixedString<N>(s),
60 location(loc) {}
61 consteval FixedStrWithLoc(char const* s, SourceLocation const& loc = SourceLocation::current()) noexcept
62 : FixedString<N>(s),
63 location(loc) {}
64
65 constexpr SourceLocation const& loc() const noexcept { return location; }
66};
67
68template <size_t N>
69FixedStrWithLoc(char const (&)[N]) -> FixedStrWithLoc<N - 1>;
70
71} // namespace ll
Definition SourceLocation.h:11
Definition SourceLocation.h:55
Definition FixedString.h:10