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.
This commit is contained in:
@@ -25,86 +25,113 @@
|
||||
namespace Opm {
|
||||
|
||||
|
||||
void MessageContainer::error(const std::string& msg, const std::string& filename, const int lineno)
|
||||
{
|
||||
std::unique_ptr<Location> 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<Location> 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<Location> 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<Location> 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<Location> 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<Location> 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<Message>::const_iterator MessageContainer::begin() const
|
||||
{
|
||||
return m_messages.begin();
|
||||
|
||||
@@ -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 location;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user