|
@@ -9,11 +9,11 @@ namespace aFuncore {
|
|
|
}
|
|
|
|
|
|
void NormalMessage::topProgress(Inter &inter, Activation &activation){
|
|
|
- inter.getOutMessageStream().pushMessage(new NormalMessage(std::move(*this)));
|
|
|
+ inter.getOutMessageStream().pushMessage("NORMAL", new NormalMessage(std::move(*this)));
|
|
|
}
|
|
|
|
|
|
ErrorMessage::ErrorMessage(std::string error_type_, std::string error_info_, Activation *activation)
|
|
|
- : Message("ERROR"), error_type{std::move(error_type_)}, error_info{std::move(error_info_)}, inter{activation->inter}{
|
|
|
+ : error_type{std::move(error_type_)}, error_info{std::move(error_info_)}, inter{activation->inter}{
|
|
|
for (NULL; activation != nullptr; activation = activation->toPrev()) {
|
|
|
if (activation->getFileLine() != 0)
|
|
|
trackback.push_front({activation->getFilePath(), activation->getFileLine()});
|
|
@@ -21,27 +21,20 @@ namespace aFuncore {
|
|
|
}
|
|
|
|
|
|
void ErrorMessage::topProgress(Inter &inter_, Activation &activation){
|
|
|
- inter_.getOutMessageStream().pushMessage(new ErrorMessage(std::move(*this)));
|
|
|
- }
|
|
|
-
|
|
|
- MessageStream::MessageStream(){
|
|
|
- stream = nullptr;
|
|
|
+ inter_.getOutMessageStream().pushMessage("ERROR", new ErrorMessage(std::move(*this)));
|
|
|
}
|
|
|
|
|
|
MessageStream::~MessageStream(){
|
|
|
- for (Message *msg = stream, *tmp; msg != nullptr; msg = tmp) {
|
|
|
- tmp = msg->next;
|
|
|
- delete msg;
|
|
|
- }
|
|
|
+ for (auto &msg : stream)
|
|
|
+ delete msg.second;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 压入 Message
|
|
|
* @param msg Message
|
|
|
*/
|
|
|
- void MessageStream::pushMessage(Message *msg){
|
|
|
- msg->next = stream;
|
|
|
- stream = msg;
|
|
|
+ void MessageStream::pushMessage(const std::string &type, Message *msg){
|
|
|
+ stream.emplace(type, msg);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -50,11 +43,10 @@ namespace aFuncore {
|
|
|
* @return Message
|
|
|
*/
|
|
|
Message *MessageStream::_getMessage(const std::string &type) const{
|
|
|
- for (Message *msg = stream; msg != nullptr; msg = msg->next) {
|
|
|
- if (msg->type == type)
|
|
|
- return msg;
|
|
|
- }
|
|
|
- return nullptr;
|
|
|
+ auto ret = stream.find(type);
|
|
|
+ if (ret == stream.end())
|
|
|
+ return nullptr;
|
|
|
+ return ret->second;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -63,74 +55,41 @@ namespace aFuncore {
|
|
|
* @return Message
|
|
|
*/
|
|
|
Message *MessageStream::popMessage(const std::string &type){
|
|
|
- for (Message **msg = &stream; *msg != nullptr; msg = &((*msg)->next)) {
|
|
|
- if ((*msg)->type == type) {
|
|
|
- Message *ret = *msg;
|
|
|
- *msg = ret->next;
|
|
|
- return ret;
|
|
|
- }
|
|
|
- }
|
|
|
- return nullptr;
|
|
|
+ auto ret = stream.find(type);
|
|
|
+ if (ret == stream.end())
|
|
|
+ return nullptr;
|
|
|
+ Message *msg = ret->second;
|
|
|
+ stream.erase(ret);
|
|
|
+ return msg;
|
|
|
}
|
|
|
|
|
|
- UpMessage::UpMessage(const UpMessage *old) : MessageStream(){
|
|
|
- if (old != nullptr)
|
|
|
- this->old = old->stream;
|
|
|
- else
|
|
|
- this->old = nullptr;
|
|
|
- this->stream = this->old;
|
|
|
- }
|
|
|
+ UpMessage::UpMessage(const UpMessage *old_) : MessageStream(), old{old_} {
|
|
|
|
|
|
- UpMessage::~UpMessage(){
|
|
|
- if (old != nullptr) {
|
|
|
- for (Message **msg = &stream; *msg != nullptr; msg = &((*msg)->next)) {
|
|
|
- if (*msg == old) {
|
|
|
- *msg = nullptr;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 弹出Message (使Message脱离数据流)
|
|
|
- * 注意: 不会弹出继承的Message
|
|
|
- * @param type 类型
|
|
|
- * @return Message
|
|
|
- */
|
|
|
- Message *UpMessage::popMessage(const std::string &type){
|
|
|
- for (Message **msg = &stream; *msg != nullptr; msg = &((*msg)->next)) {
|
|
|
- if ((*msg) == old)
|
|
|
- break;
|
|
|
- if ((*msg)->type == type) {
|
|
|
- Message *ret = *msg;
|
|
|
- *msg = ret->next;
|
|
|
+ Message *UpMessage::_getMessage(const std::string &type) const {
|
|
|
+ for (const UpMessage *up = this; up != nullptr; up = up->old) {
|
|
|
+ Message *ret = up->MessageStream::_getMessage(type);
|
|
|
+ if (ret != nullptr)
|
|
|
return ret;
|
|
|
- }
|
|
|
}
|
|
|
return nullptr;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 拼接数据流
|
|
|
+ * 拼接数据流 (将this合并到msg)
|
|
|
* @param msg
|
|
|
*/
|
|
|
void DownMessage::joinMsg(DownMessage &msg){
|
|
|
- Message *m = stream;
|
|
|
- if (m == nullptr)
|
|
|
- return;
|
|
|
- while (m->next != nullptr)
|
|
|
- m = m->next;
|
|
|
- m->next = msg.stream;
|
|
|
- msg.stream = m;
|
|
|
- stream = nullptr;
|
|
|
+ msg.stream.merge(stream);
|
|
|
}
|
|
|
|
|
|
- Message *InterMessage::popFrontMessage() {
|
|
|
- if (stream == nullptr)
|
|
|
+ Message *InterMessage::popFrontMessage(std::string &type) {
|
|
|
+ if (stream.empty())
|
|
|
return nullptr;
|
|
|
- Message *ret = stream;
|
|
|
- stream = ret->next;
|
|
|
+ Message *ret = stream.begin()->second;
|
|
|
+ type = stream.begin()->first;
|
|
|
+ stream.erase(stream.begin());
|
|
|
return ret;
|
|
|
}
|
|
|
}
|