diff --git a/src/Parser/Parsing/IParserLineStream.cpp b/src/Parser/Parsing/IParserLineStream.cpp index 332e6302..60ba91c0 100644 --- a/src/Parser/Parsing/IParserLineStream.cpp +++ b/src/Parser/Parsing/IParserLineStream.cpp @@ -1,15 +1,12 @@ #include "IParserLineStream.h" -const std::string ParserLine::EMPTY_STRING; - ParserLine::ParserLine() - : m_filename(EMPTY_STRING), - m_line_number(0) + : m_line_number(0) { } -ParserLine::ParserLine(const std::string& filename, const int lineNumber, std::string line) - : m_filename(filename), +ParserLine::ParserLine(std::shared_ptr filename, const int lineNumber, std::string line) + : m_filename(std::move(filename)), m_line_number(lineNumber), m_line(std::move(line)) { diff --git a/src/Parser/Parsing/IParserLineStream.h b/src/Parser/Parsing/IParserLineStream.h index 87a968aa..f00a3432 100644 --- a/src/Parser/Parsing/IParserLineStream.h +++ b/src/Parser/Parsing/IParserLineStream.h @@ -2,20 +2,19 @@ #include #include +#include #include "Utils/ClassUtils.h" class ParserLine { - static const std::string EMPTY_STRING; - public: - std::reference_wrapper m_filename; + std::shared_ptr m_filename; int m_line_number; std::string m_line; ParserLine(); - ParserLine(const std::string& filename, int lineNumber, std::string line); + ParserLine(std::shared_ptr filename, int lineNumber, std::string line); _NODISCARD bool IsEof() const; }; diff --git a/src/Parser/Parsing/Impl/AbstractDirectiveStreamProxy.cpp b/src/Parser/Parsing/Impl/AbstractDirectiveStreamProxy.cpp index 617849f4..492ecbd9 100644 --- a/src/Parser/Parsing/Impl/AbstractDirectiveStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/AbstractDirectiveStreamProxy.cpp @@ -2,7 +2,7 @@ TokenPos AbstractDirectiveStreamProxy::CreatePos(const ParserLine& line, const unsigned position) { - return TokenPos(line.m_filename.get(), line.m_line_number, static_cast(position + 1)); + return TokenPos(*line.m_filename, line.m_line_number, static_cast(position + 1)); } bool AbstractDirectiveStreamProxy::SkipWhitespace(const ParserLine& line, unsigned& position) diff --git a/src/Parser/Parsing/Impl/AbstractLexer.h b/src/Parser/Parsing/Impl/AbstractLexer.h index abd830b6..90ada5aa 100644 --- a/src/Parser/Parsing/Impl/AbstractLexer.h +++ b/src/Parser/Parsing/Impl/AbstractLexer.h @@ -100,7 +100,7 @@ protected: _NODISCARD TokenPos GetPreviousCharacterPos() const { const auto& currentLine = CurrentLine(); - return TokenPos(currentLine.m_filename, currentLine.m_line_number, m_current_line_offset); + return TokenPos(*currentLine.m_filename, currentLine.m_line_number, m_current_line_offset); } _NODISCARD TokenPos GetNextCharacterPos() @@ -109,10 +109,10 @@ protected: if (m_current_line_offset + 1 >= currentLine.m_line.size()) { PeekChar(); - return TokenPos(m_line_cache.back().m_filename, m_line_cache.back().m_line_number, 1); + return TokenPos(*m_line_cache.back().m_filename, m_line_cache.back().m_line_number, 1); } - return TokenPos(currentLine.m_filename, currentLine.m_line_number, m_current_line_offset + 1); + return TokenPos(*currentLine.m_filename, currentLine.m_line_number, m_current_line_offset + 1); } /** @@ -155,7 +155,7 @@ protected: while (true) { if (m_current_line_offset >= lineSize) - throw ParsingException(TokenPos(currentLine.m_filename, currentLine.m_line_number, m_current_line_offset), "Unclosed string"); + throw ParsingException(TokenPos(*currentLine.m_filename, currentLine.m_line_number, m_current_line_offset), "Unclosed string"); if (currentLine.m_line[m_current_line_offset] == '\"') break; @@ -189,7 +189,7 @@ protected: auto exponent = false; if (*currentCharacter == '-' || *currentCharacter == '+') - currentCharacter++; + ++currentCharacter; while (*currentCharacter) { @@ -208,7 +208,7 @@ protected: if (exponent) throw ParsingException(GetPreviousCharacterPos(), "Invalid number"); if (currentCharacter[1] == '-') - currentCharacter++; + ++currentCharacter; exponent = true; isInteger = false; } @@ -221,7 +221,7 @@ protected: break; } - currentCharacter++; + ++currentCharacter; } return isInteger; @@ -290,7 +290,6 @@ protected: public: const TokenType& GetToken(unsigned index) override { - assert(index >= 0); while (index >= m_token_cache.size()) m_token_cache.emplace_back(GetNextToken()); @@ -307,7 +306,7 @@ public: const auto& lastToken = m_token_cache.back(); while (!m_line_cache.empty() && (m_line_cache.front().m_line_number != lastToken.GetPos().m_line - || m_line_cache.front().m_filename.get() != lastToken.GetPos().m_filename.get())) + || *m_line_cache.front().m_filename != lastToken.GetPos().m_filename.get())) { m_line_cache.pop_front(); m_line_index--; @@ -319,7 +318,7 @@ public: m_token_cache.erase(m_token_cache.begin(), m_token_cache.begin() + amount); const auto& firstToken = m_token_cache.front(); while (m_line_cache.front().m_line_number != firstToken.GetPos().m_line - || m_line_cache.front().m_filename.get() != firstToken.GetPos().m_filename.get()) + || *m_line_cache.front().m_filename != firstToken.GetPos().m_filename.get()) { m_line_cache.pop_front(); m_line_index--; @@ -341,7 +340,7 @@ public: { for (const auto& line : m_line_cache) { - if (line.m_filename.get() == pos.m_filename.get() + if (*line.m_filename == pos.m_filename.get() && line.m_line_number == pos.m_line) return line; } diff --git a/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp b/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp index d70a52fd..bd1b38c8 100644 --- a/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp @@ -70,7 +70,7 @@ bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, const u unsigned filenameStart, filenameEnd; if (!ExtractIncludeFilename(line, currentPos, filenameStart, filenameEnd)) - throw ParsingException(TokenPos(line.m_filename, line.m_line_number, static_cast(currentPos)), INCLUDE_QUOTES_ERROR); + throw ParsingException(TokenPos(*line.m_filename, line.m_line_number, static_cast(currentPos)), INCLUDE_QUOTES_ERROR); if (filenameEnd <= filenameStart) throw ParsingException(CreatePos(line, currentPos), "No filename specified"); @@ -103,7 +103,7 @@ bool IncludingStreamProxy::MatchPragmaOnceDirective(const ParserLine& line, cons if (!MatchString(line, currentPos, ONCE_PRAGMA_COMMAND, std::char_traits::length(ONCE_PRAGMA_COMMAND))) return false; - const auto absolutePath = absolute(fs::path(line.m_filename.get())); + const auto absolutePath = absolute(fs::path(*line.m_filename)); const auto absolutePathStr = absolutePath.string(); const auto existingPath = m_included_files.find(absolutePathStr); diff --git a/src/Parser/Parsing/Impl/IncludingStreamProxy.h b/src/Parser/Parsing/Impl/IncludingStreamProxy.h index d1f22cc8..6fb64587 100644 --- a/src/Parser/Parsing/Impl/IncludingStreamProxy.h +++ b/src/Parser/Parsing/Impl/IncludingStreamProxy.h @@ -15,7 +15,7 @@ class IncludingStreamProxy final : public AbstractDirectiveStreamProxy IParserLineStream* const m_stream; std::set m_included_files; - _NODISCARD static bool ExtractIncludeFilename(const ParserLine& line, unsigned includeDirectivePosition, unsigned& directiveStartPos, unsigned& filenameEndPos); + _NODISCARD static bool ExtractIncludeFilename(const ParserLine& line, unsigned includeDirectivePosition, unsigned& filenameStartPosition, unsigned& filenameEndPosition); _NODISCARD bool MatchIncludeDirective(const ParserLine& line, unsigned directiveStartPos, unsigned directiveEndPos) const; _NODISCARD bool MatchPragmaOnceDirective(const ParserLine& line, unsigned directiveStartPos, unsigned directiveEndPos); _NODISCARD bool MatchDirectives(const ParserLine& line); diff --git a/src/Parser/Parsing/Impl/PackDefinitionStreamProxy.h b/src/Parser/Parsing/Impl/PackDefinitionStreamProxy.h index 06404a0f..9dce21eb 100644 --- a/src/Parser/Parsing/Impl/PackDefinitionStreamProxy.h +++ b/src/Parser/Parsing/Impl/PackDefinitionStreamProxy.h @@ -2,6 +2,7 @@ #include +#include "Utils/ClassUtils.h" #include "AbstractDirectiveStreamProxy.h" #include "Parsing/IPackValueSupplier.h" #include "Parsing/IParserLineStream.h" @@ -32,5 +33,5 @@ public: _NODISCARD bool IsOpen() const override; _NODISCARD bool Eof() const override; - int GetCurrentPack() const override; + _NODISCARD int GetCurrentPack() const override; }; diff --git a/src/Parser/Parsing/Impl/ParserFilesystemStream.cpp b/src/Parser/Parsing/Impl/ParserFilesystemStream.cpp index a7569dcf..8192533e 100644 --- a/src/Parser/Parsing/Impl/ParserFilesystemStream.cpp +++ b/src/Parser/Parsing/Impl/ParserFilesystemStream.cpp @@ -6,13 +6,13 @@ namespace fs = std::filesystem; ParserFilesystemStream::FileInfo::FileInfo(std::string filePath) - : m_file_path(std::move(filePath)), - m_stream(m_file_path), + : m_file_path(std::make_shared(std::move(filePath))), + m_stream(*m_file_path), m_line_number(1) { } -ParserFilesystemStream::ParserFilesystemStream(std::string path) +ParserFilesystemStream::ParserFilesystemStream(const std::string& path) { const auto absolutePath = absolute(fs::path(path)); m_files.emplace(FileInfo(absolutePath.string())); @@ -74,7 +74,7 @@ bool ParserFilesystemStream::IncludeFile(const std::string& filename) if (m_files.empty()) return false; - auto newFilePath = fs::path(m_files.top().m_file_path); + auto newFilePath = fs::path(*m_files.top().m_file_path); newFilePath.remove_filename().concat(filename); newFilePath = absolute(newFilePath); diff --git a/src/Parser/Parsing/Impl/ParserFilesystemStream.h b/src/Parser/Parsing/Impl/ParserFilesystemStream.h index bdca77e5..62870896 100644 --- a/src/Parser/Parsing/Impl/ParserFilesystemStream.h +++ b/src/Parser/Parsing/Impl/ParserFilesystemStream.h @@ -10,7 +10,7 @@ class ParserFilesystemStream final : public IParserLineStream class FileInfo { public: - std::string m_file_path; + std::shared_ptr m_file_path; std::ifstream m_stream; int m_line_number; @@ -19,7 +19,7 @@ class ParserFilesystemStream final : public IParserLineStream std::stack m_files; public: - explicit ParserFilesystemStream(std::string path); + explicit ParserFilesystemStream(const std::string& path); ParserLine NextLine() override; bool IncludeFile(const std::string& filename) override; diff --git a/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp b/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp index 9fea9e55..78e2d5ee 100644 --- a/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp +++ b/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp @@ -5,14 +5,14 @@ ParserMultiInputStream::FileInfo::FileInfo(std::unique_ptr stream, std::string filePath) : m_owned_stream(std::move(stream)), m_stream(*m_owned_stream), - m_file_path(std::move(filePath)), + m_file_path(std::make_shared(std::move(filePath))), m_line_number(1) { } ParserMultiInputStream::FileInfo::FileInfo(std::istream& stream, std::string filePath) : m_stream(stream), - m_file_path(std::move(filePath)), + m_file_path(std::make_shared(std::move(filePath))), m_line_number(1) { } @@ -79,7 +79,7 @@ bool ParserMultiInputStream::IncludeFile(const std::string& filename) if (!m_include_callback) return false; - auto newFile = m_include_callback(filename, m_files.empty() ? "" : m_files.top().m_file_path); + auto newFile = m_include_callback(filename, m_files.empty() ? "" : *m_files.top().m_file_path); if (!newFile) return false; diff --git a/src/Parser/Parsing/Impl/ParserMultiInputStream.h b/src/Parser/Parsing/Impl/ParserMultiInputStream.h index 11b041d2..bd6ee7cb 100644 --- a/src/Parser/Parsing/Impl/ParserMultiInputStream.h +++ b/src/Parser/Parsing/Impl/ParserMultiInputStream.h @@ -18,7 +18,7 @@ private: public: std::unique_ptr m_owned_stream; std::istream& m_stream; - std::string m_file_path; + std::shared_ptr m_file_path; int m_line_number; FileInfo(std::unique_ptr stream, std::string filePath); diff --git a/src/Parser/Parsing/Impl/ParserSingleInputStream.cpp b/src/Parser/Parsing/Impl/ParserSingleInputStream.cpp index efb965a1..2641a29e 100644 --- a/src/Parser/Parsing/Impl/ParserSingleInputStream.cpp +++ b/src/Parser/Parsing/Impl/ParserSingleInputStream.cpp @@ -4,7 +4,7 @@ ParserSingleInputStream::ParserSingleInputStream(std::istream& stream, std::string fileName) : m_stream(stream), - m_file_name(std::move(fileName)), + m_file_name(std::make_shared(std::move(fileName))), m_line_number(1) { } diff --git a/src/Parser/Parsing/Impl/ParserSingleInputStream.h b/src/Parser/Parsing/Impl/ParserSingleInputStream.h index 4af10424..4a60adbc 100644 --- a/src/Parser/Parsing/Impl/ParserSingleInputStream.h +++ b/src/Parser/Parsing/Impl/ParserSingleInputStream.h @@ -1,13 +1,14 @@ #pragma once #include +#include #include "Parsing/IParserLineStream.h" class ParserSingleInputStream final : public IParserLineStream { std::istream& m_stream; - std::string m_file_name; + std::shared_ptr m_file_name; int m_line_number; public: diff --git a/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.cpp b/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.cpp index 12d03a11..5bae82b4 100644 --- a/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.cpp +++ b/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.cpp @@ -2,8 +2,6 @@ #include -const std::string MockParserLineStream::MOCK_FILENAME = "Mockfile"; - MockParserLineStream::MockParserLineStream(const std::vector& lines) { AddIncludeLines(MOCK_FILENAME, lines); @@ -11,7 +9,7 @@ MockParserLineStream::MockParserLineStream(const std::vector& lines } MockParserLineStream::IncludePos::IncludePos(std::string filename, const std::vector& lines) - : m_filename(std::move(filename)), + : m_filename(std::make_shared(std::move(filename))), m_lines(lines), m_pos(0) { diff --git a/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.h b/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.h index 23ac1997..31e10b5b 100644 --- a/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.h +++ b/test/ParserTestUtils/Parsing/Mock/MockParserLineStream.h @@ -8,13 +8,13 @@ class MockParserLineStream final : public IParserLineStream { public: - static const std::string MOCK_FILENAME; + static constexpr const char* MOCK_FILENAME = "MockFile"; private: class IncludePos { public: - std::string m_filename; + std::shared_ptr m_filename; const std::vector& m_lines; unsigned m_pos; diff --git a/test/ZoneCodeGeneratorLibTests/Parsing/Impl/IncludingStreamProxyTests.cpp b/test/ZoneCodeGeneratorLibTests/Parsing/Impl/IncludingStreamProxyTests.cpp index b225b33c..b726f0e2 100644 --- a/test/ZoneCodeGeneratorLibTests/Parsing/Impl/IncludingStreamProxyTests.cpp +++ b/test/ZoneCodeGeneratorLibTests/Parsing/Impl/IncludingStreamProxyTests.cpp @@ -27,21 +27,21 @@ namespace test::parsing::impl::including_stream_proxy { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 1); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "Hello world"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 1); - REQUIRE(line.m_filename.get() == "ASDF.txt"); + REQUIRE(*line.m_filename == "ASDF.txt"); REQUIRE(line.m_line == "Hello galaxy"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 3); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "and bye"); } @@ -70,21 +70,21 @@ namespace test::parsing::impl::including_stream_proxy { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 1); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "Hello world"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 1); - REQUIRE(line.m_filename.get() == "ASDF.txt"); + REQUIRE(*line.m_filename == "ASDF.txt"); REQUIRE(line.m_line == "Hello galaxy"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 3); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "and bye"); } @@ -113,21 +113,21 @@ namespace test::parsing::impl::including_stream_proxy { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 1); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "Hello world"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 1); - REQUIRE(line.m_filename.get() == "ASDF.txt"); + REQUIRE(*line.m_filename == "ASDF.txt"); REQUIRE(line.m_line == "Hello galaxy"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 3); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "and bye"); } @@ -158,21 +158,21 @@ namespace test::parsing::impl::including_stream_proxy { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 1); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "Hello world"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 2); - REQUIRE(line.m_filename.get() == "ASDF.txt"); + REQUIRE(*line.m_filename == "ASDF.txt"); REQUIRE(line.m_line == "Hello galaxy"); } { auto line = proxy.NextLine(); REQUIRE(line.m_line_number == 4); - REQUIRE(line.m_filename.get() == MockParserLineStream::MOCK_FILENAME); + REQUIRE(*line.m_filename == MockParserLineStream::MOCK_FILENAME); REQUIRE(line.m_line == "and bye"); }