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:
Jørgen Kvalsvik
2016-04-01 10:46:31 +02:00
parent 427baebe58
commit 6c8487ea07
3 changed files with 92 additions and 48 deletions

View File

@@ -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();

View File

@@ -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;
};

View File

@@ -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 );
}