40 enum { NoLimit = -1 };
55 : tag_limit_(tag_limit < 0 ? NoLimit : tag_limit),
56 category_limits_({{Log::MessageType::Debug, NoLimit},
57 {Log::MessageType::Note, NoLimit},
58 {Log::MessageType::Info, NoLimit},
59 {Log::MessageType::Warning, NoLimit},
60 {Log::MessageType::Error, NoLimit},
61 {Log::MessageType::Problem, NoLimit},
62 {Log::MessageType::Bug, NoLimit}})
66 MessageLimiter(
const int tag_limit,
const std::map<int64_t, int>& category_limits)
67 : tag_limit_(tag_limit < 0 ? NoLimit : tag_limit),
68 category_limits_(category_limits)
72 for (
auto category : { Log::MessageType::Debug,
73 Log::MessageType::Note,
74 Log::MessageType::Info,
75 Log::MessageType::Warning,
76 Log::MessageType::Error,
77 Log::MessageType::Problem,
78 Log::MessageType::Bug }) {
79 if (category_limits_.find(category) == category_limits_.end()) {
80 category_limits_[category] = NoLimit;
94 return category_limits_;
100 return category_counts_;
107 PrintMessage, JustOverTagLimit, JustOverCategoryLimit, OverTagLimit, OverCategoryLimit
119 Response res = Response::PrintMessage;
122 if (!tag.empty() && tag_limit_ != NoLimit) {
124 auto it = tag_counts_.find(tag);
125 if (it != tag_counts_.end()) {
127 const int count = ++it->second;
128 res = countBasedResponseTag(count);
131 tag_counts_.insert({tag, 1});
132 res = countBasedResponseTag(1);
138 if (res == Response::PrintMessage) {
140 const int count = ++category_counts_[messageMask];
141 if (category_limits_[messageMask] != NoLimit) {
142 res = countBasedResponseCategory(count, messageMask);
150 Response countBasedResponseTag(
const int count)
const
152 if (count <= tag_limit_) {
153 return Response::PrintMessage;
154 }
else if (count == tag_limit_ + 1) {
155 return Response::JustOverTagLimit;
157 return Response::OverTagLimit;
162 Response countBasedResponseCategory(
const int count,
const int64_t messageMask)
const
164 const int limit = category_limits_.at(messageMask);
165 if (count <= limit) {
166 return Response::PrintMessage;
167 }
else if (count == limit + 1) {
168 return Response::JustOverCategoryLimit;
170 return Response::OverCategoryLimit;
175 std::unordered_map<std::string, int> tag_counts_;
176 std::map<int64_t, int> category_limits_;
177 std::map<int64_t, int> category_counts_ = {{Log::MessageType::Note, 0},
178 {Log::MessageType::Info, 0},
179 {Log::MessageType::Warning, 0},
180 {Log::MessageType::Error, 0},
181 {Log::MessageType::Problem, 0},
182 {Log::MessageType::Bug, 0}};
Response handleMessageLimits(const std::string &tag, const int64_t messageMask)
If (tag count == tag limit + 1) for the passed tag, respond JustOverTagLimit.
Definition MessageLimiter.hpp:117
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30