From 6c8487ea073fa1fe40fcd636f9267dbfbf31dbd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Kvalsvik?= Date: Fri, 1 Apr 2016 10:46:31 +0200 Subject: [PATCH] Message::location uses automatic members By supporting operator bool() we get the same existence checking capabilities as the unique_ptr implementations, without the hurdles of non-copyability and manual heap allocation. --- .../eclipse/Parser/MessageContainer.cpp | 115 +++++++++++------- .../eclipse/Parser/MessageContainer.hpp | 14 ++- .../Parser/tests/MessageContainerTest.cpp | 11 +- 3 files changed, 92 insertions(+), 48 deletions(-) diff --git a/opm/parser/eclipse/Parser/MessageContainer.cpp b/opm/parser/eclipse/Parser/MessageContainer.cpp index d063fe5ad..e752d4856 100644 --- a/opm/parser/eclipse/Parser/MessageContainer.cpp +++ b/opm/parser/eclipse/Parser/MessageContainer.cpp @@ -25,86 +25,113 @@ namespace Opm { - void MessageContainer::error(const std::string& msg, const std::string& filename, const int lineno) - { - std::unique_ptr loc(new Location{filename, lineno}); - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Error, msg, std::move(loc)}); + void MessageContainer::error( const std::string& msg, + const std::string& filename, + const int lineno ) { + m_messages.emplace_back( Message { + MessageType::MessageTypeEnum::Error, msg, + { filename, lineno } } + ); } - void MessageContainer::error(const std::string& msg) - { - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Error, msg, nullptr}); + void MessageContainer::error( const std::string& msg ) { + m_messages.emplace_back( + Message { MessageType::MessageTypeEnum::Error, msg, {} } + ); } - void MessageContainer::bug(const std::string& msg, const std::string& filename, const int lineno) - { - std::unique_ptr loc(new Location{filename, lineno}); - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Bug, msg, std::move(loc)}); + void MessageContainer::bug( const std::string& msg, + const std::string& filename, + const int lineno ) { + m_messages.emplace_back( Message { + MessageType::MessageTypeEnum::Bug, msg, + { filename, lineno } + } + ); } - void MessageContainer::bug(const std::string& msg) - { - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Bug, msg, nullptr}); + void MessageContainer::bug( const std::string& msg ) { + m_messages.emplace_back( + Message { MessageType::MessageTypeEnum::Bug, msg,{} } + ); } - void MessageContainer::warning(const std::string& msg, const std::string& filename, const int lineno) - { - std::unique_ptr loc(new Location{filename, lineno}); - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Warning, msg, std::move(loc)}); + void MessageContainer::warning( const std::string& msg, + const std::string& filename, + const int lineno ) { + m_messages.emplace_back( Message { + MessageType::MessageTypeEnum::Warning, msg, + { filename, lineno } + } + ); } - void MessageContainer::warning(const std::string& msg) - { - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Warning, msg, nullptr}); + void MessageContainer::warning( const std::string& msg ) { + m_messages.emplace_back( + Message { MessageType::MessageTypeEnum::Warning, msg,{} } + ); } - void MessageContainer::info(const std::string& msg, const std::string& filename, const int lineno) - { - std::unique_ptr loc(new Location{filename, lineno}); - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Info, msg, std::move(loc)}); + void MessageContainer::info( const std::string& msg, + const std::string& filename, + const int lineno ) { + m_messages.emplace_back( Message { + MessageType::MessageTypeEnum::Info, msg, + { filename, lineno } + } + ); } - void MessageContainer::info(const std::string& msg) - { - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Info, msg, nullptr}); + void MessageContainer::info( const std::string& msg ) { + m_messages.emplace_back( + Message { MessageType::MessageTypeEnum::Info, msg,{} } + ); } - void MessageContainer::debug(const std::string& msg, const std::string& filename, const int lineno) - { - std::unique_ptr loc(new Location{filename, lineno}); - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Debug, msg, std::move(loc)}); + void MessageContainer::debug( const std::string& msg, + const std::string& filename, + const int lineno ) { + m_messages.emplace_back( Message { + MessageType::MessageTypeEnum::Debug, msg, + { filename, lineno } + } + ); } - void MessageContainer::debug(const std::string& msg) - { - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Debug, msg, nullptr}); + void MessageContainer::debug( const std::string& msg ) { + m_messages.emplace_back( + Message { MessageType::MessageTypeEnum::Debug, msg,{} } + ); } - void MessageContainer::problem(const std::string& msg, const std::string& filename, const int lineno) - { - std::unique_ptr loc(new Location{filename, lineno}); - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Problem, msg, std::move(loc)}); + void MessageContainer::problem( const std::string& msg, + const std::string& filename, + const int lineno ) { + m_messages.emplace_back( Message { + MessageType::MessageTypeEnum::Problem, msg, + { filename, lineno } + } + ); } - void MessageContainer::problem(const std::string& msg) - { - m_messages.emplace_back(Message{MessageType::MessageTypeEnum::Problem, msg, nullptr}); + void MessageContainer::problem( const std::string& msg ) { + m_messages.emplace_back( + Message { MessageType::MessageTypeEnum::Problem, msg, {} } + ); } - - std::vector::const_iterator MessageContainer::begin() const { return m_messages.begin(); diff --git a/opm/parser/eclipse/Parser/MessageContainer.hpp b/opm/parser/eclipse/Parser/MessageContainer.hpp index ddb849ee4..e4609c455 100644 --- a/opm/parser/eclipse/Parser/MessageContainer.hpp +++ b/opm/parser/eclipse/Parser/MessageContainer.hpp @@ -29,6 +29,9 @@ namespace Opm { namespace MessageType { enum MessageTypeEnum { + + struct Message { + enum type { Debug = 1, Info = 2, Warning = 3, @@ -41,15 +44,22 @@ namespace Opm { struct Location { + Location() = default; + Location( const std::string& s, int l ) : filename( s ), lineno( l ) {} + std::string filename; - int lineno; + int lineno = -1; + + explicit operator bool() const { + return lineno > 0; + } }; struct Message { MessageType::MessageTypeEnum mtype; std::string message; - std::unique_ptr location; + Location location; }; diff --git a/opm/parser/eclipse/Parser/tests/MessageContainerTest.cpp b/opm/parser/eclipse/Parser/tests/MessageContainerTest.cpp index 39427d8dd..da2a53278 100644 --- a/opm/parser/eclipse/Parser/tests/MessageContainerTest.cpp +++ b/opm/parser/eclipse/Parser/tests/MessageContainerTest.cpp @@ -51,6 +51,13 @@ BOOST_AUTO_TEST_CASE(TestIterator) { BOOST_CHECK_EQUAL(msg.message, msgString[i]); i++; } - - +} + +BOOST_AUTO_TEST_CASE(LocationImplicitConversion) { + MessageContainer mc; + mc.warning( "Warning" ); + mc.info( "Info", "filename", 10 ); + + BOOST_CHECK( !mc.begin()->location ); + BOOST_CHECK( (mc.begin() + 1)->location ); }