blob: 8db0b9fd92f5100a87d3f81dcab4bccfade06e8d [file] [log] [blame]
#ifndef IMAGE_IO_BASE_MESSAGE_STORE_H_ // NOLINT
#define IMAGE_IO_BASE_MESSAGE_STORE_H_ // NOLINT
#include <vector>
#include "image_io/base/message.h"
namespace photos_editing_formats {
namespace image_io {
/// An abstract base class for storing and reporting on Messages.
class MessageStore {
public:
virtual ~MessageStore() = default;
/// Clears the messages maintained by the store.
virtual void ClearMessages() = 0;
// @message The message to add to the store.
virtual void AddMessage(const Message& message) = 0;
/// @return A vector of messages maintained by the store; this vector may be
/// empty even if the AddMessage function was called, depending on the
/// concrete subclass is implemented.
virtual std::vector<Message> GetMessages() const = 0;
/// @return Whether the store has error messages or not. This value is
/// guarenteed to be accurate based on the latest calls to the
/// ClearMessages and AddMessage functions.
virtual bool HasErrorMessages() const = 0;
};
/// A MessageStore that saves the messages in a vector. The implementation of
/// this class is not thread safe.
class VectorMessageStore : public MessageStore {
public:
void ClearMessages() override { messages_.clear(); }
void AddMessage(const Message& message) override {
messages_.push_back(message);
}
std::vector<Message> GetMessages() const override { return messages_; }
bool HasErrorMessages() const override {
for (const auto& message : messages_) {
if (message.GetType() != Message::kStatus) {
return true;
}
}
return false;
}
private:
std::vector<Message> messages_;
};
/// A MessageStore that simply keeps track of whether error messages have been
/// added or not, but does not store the messages themselves. The implementation
/// of this class is should not cause any crashes if run in a multi-threaded
/// environment, though there may be some cases where erroneous results are
/// returned by the HasErrorMessages function.
class ErrorFlagMessageStore : public MessageStore {
public:
ErrorFlagMessageStore() : has_error_(false) {}
void ClearMessages() override { has_error_ = false; }
void AddMessage(const Message& message) override {
if (message.IsError()) {
has_error_ = true;
}
}
std::vector<Message> GetMessages() const override {
return std::vector<Message>();
}
bool HasErrorMessages() const override { return has_error_; }
private:
bool has_error_;
};
} // namespace image_io
} // namespace photos_editing_formats
#endif // IMAGE_IO_BASE_MESSAGE_STORE_H_ // NOLINT