slang-netlist  0.9.0
Loading...
Searching...
No Matches
TextLocation.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <deque>
6#include <mutex>
7#include <string>
8#include <string_view>
9
10#include <fmt/format.h>
11
12#include "slang/text/SourceLocation.h"
13#include "slang/util/ConcurrentMap.h"
14
15namespace slang::netlist {
16
20class FileTable {
21 // Keys are string_views into `filenames`, whose std::deque backing
22 // guarantees stable addresses across insertions.
23 concurrent_map<std::string_view, uint32_t> indexMap;
24 std::deque<std::string> filenames;
25 mutable std::mutex insertMutex;
26
27public:
28 static constexpr uint32_t NoFile = UINT32_MAX;
29
32 auto addFile(std::string_view name) -> uint32_t {
33 uint32_t result = NoFile;
34 if (indexMap.visit(name, [&](auto const &kv) { result = kv.second; })) {
35 return result;
36 }
37 std::lock_guard lock(insertMutex);
38 if (indexMap.visit(name, [&](auto const &kv) { result = kv.second; })) {
39 return result;
40 }
41 auto id = static_cast<uint32_t>(filenames.size());
42 auto const &stored = filenames.emplace_back(name);
43 indexMap.emplace(std::string_view(stored), id);
44 return id;
45 }
46
48 void reserve(size_t count) {
49 std::lock_guard lock(insertMutex);
50 indexMap.reserve(count);
51 }
52
54 auto getFilename(uint32_t index) const -> std::string_view {
55 if (index == NoFile) {
56 return {};
57 }
58 return filenames.at(index);
59 }
60
62 auto size() const -> size_t { return filenames.size(); }
63};
64
73 size_t line{0};
74 size_t column{0};
75
78 SourceLocation sourceLocation{SourceLocation::NoLocation};
79
80 TextLocation() = default;
81 TextLocation(uint32_t fileIndex, size_t line, size_t column)
83 TextLocation(uint32_t fileIndex, size_t line, size_t column,
84 SourceLocation sourceLocation)
87
88 auto toString(FileTable const &fileTable) const -> std::string {
90 return "?";
91 }
92 return fmt::format("{}:{}:{}", fileTable.getFilename(fileIndex), line,
93 column);
94 }
95
96 auto empty() const -> bool { return fileIndex == FileTable::NoFile; }
97
98 auto hasSourceLocation() const -> bool {
99 return sourceLocation != SourceLocation::NoLocation;
100 }
101};
102
103} // namespace slang::netlist
Definition TextLocation.hpp:20
auto addFile(std::string_view name) -> uint32_t
Definition TextLocation.hpp:32
auto size() const -> size_t
Return the number of unique filenames.
Definition TextLocation.hpp:62
static constexpr uint32_t NoFile
Definition TextLocation.hpp:28
void reserve(size_t count)
Reserve capacity for the given number of entries.
Definition TextLocation.hpp:48
auto getFilename(uint32_t index) const -> std::string_view
Return the filename for the given index.
Definition TextLocation.hpp:54
Definition Utilities.hpp:16
auto hasSourceLocation() const -> bool
Definition TextLocation.hpp:98
auto empty() const -> bool
Definition TextLocation.hpp:96
SourceLocation sourceLocation
Definition TextLocation.hpp:78
size_t line
Definition TextLocation.hpp:73
TextLocation(uint32_t fileIndex, size_t line, size_t column, SourceLocation sourceLocation)
Definition TextLocation.hpp:83
size_t column
Definition TextLocation.hpp:74
auto toString(FileTable const &fileTable) const -> std::string
Definition TextLocation.hpp:88
uint32_t fileIndex
Definition TextLocation.hpp:72
TextLocation(uint32_t fileIndex, size_t line, size_t column)
Definition TextLocation.hpp:81