|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2021 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: #include "monitor.h" ! 8: #include <algorithm> ! 9: ! 10: MonitorManager gMonitorManager; ! 11: ! 12: // ! 13: // モニター ! 14: // ! 15: ! 16: // コンストラクタ ! 17: Monitor::Monitor() ! 18: { ! 19: } ! 20: ! 21: // コンストラクタ (obj 指定あり) ! 22: Monitor::Monitor(Object *obj_) ! 23: { ! 24: obj = obj_; ! 25: } ! 26: ! 27: // デストラクタ ! 28: Monitor::~Monitor() ! 29: { ! 30: Unregist(); ! 31: } ! 32: ! 33: // このモニタを登録する ! 34: void ! 35: Monitor::Regist(int id_) ! 36: { ! 37: assert(obj); ! 38: assert(func); ! 39: assert(0 <= id_ && id_ < ID_SUBWIN_MAX); ! 40: ! 41: id = id_; ! 42: gMonitorManager.Regist(this); ! 43: } ! 44: ! 45: // このモニタが登録されていれば削除する ! 46: void ! 47: Monitor::Unregist() ! 48: { ! 49: gMonitorManager.Unregist(this); ! 50: } ! 51: ! 52: ! 53: // ! 54: // モニターマネージャ ! 55: // ! 56: ! 57: // 登録 ! 58: void ! 59: MonitorManager::Regist(Monitor *mon) ! 60: { ! 61: assert(fixed == false); ! 62: ! 63: int id = mon->GetId(); ! 64: // 二重登録防止 ! 65: assert(Find(id) == NULL); ! 66: ! 67: // 登録 ! 68: list.emplace_back(mon); ! 69: ! 70: // 名前が衝突していないことを確認。 ! 71: // どのケースの衝突も検出できるよう、追加後に全部列挙して.. ! 72: std::vector<std::string> names; ! 73: for (const auto& m : list) { ! 74: const std::vector<std::string>& aliases = GetAliases(m->GetId()); ! 75: names.insert(names.end(), aliases.begin(), aliases.end()); ! 76: } ! 77: if (names.size() > 1) { ! 78: // ソートして.. ! 79: std::sort(names.begin(), names.end()); ! 80: // 同じものが並んでいないか。 ! 81: for (int i = 0, sz = names.size() - 1; i < sz; i++) { ! 82: assertmsg(names[i] != names[i + 1], ! 83: "monitor alias \"%s\" duplicated", names[i].c_str()); ! 84: } ! 85: } ! 86: } ! 87: ! 88: // mon がリストにあれば削除する。なければ何もしない。 ! 89: void ! 90: MonitorManager::Unregist(Monitor *mon) ! 91: { ! 92: // 最初に見付かった一つを削除するだけでいい ! 93: for (auto it = list.begin(); it != list.end(); ++it) { ! 94: if (*it == mon) { ! 95: list.erase(it); ! 96: break; ! 97: } ! 98: } ! 99: } ! 100: ! 101: ! 102: // これ以降は追加禁止 ! 103: void ! 104: MonitorManager::Fix() ! 105: { ! 106: assert(fixed == false); ! 107: ! 108: fixed = true; ! 109: } ! 110: ! 111: // id リストから一覧表示用の文字列を生成して返す ! 112: /*static*/ std::string ! 113: MonitorManager::MakeListString(std::vector<int> list) ! 114: { ! 115: std::string str; ! 116: ! 117: // id をモニター情報内の1つ目の名前順にソートする ! 118: std::sort(list.begin(), list.end(), ! 119: [](const auto& a_id, const auto& b_id) { ! 120: const auto& a_alias = gMonitorManager.GetAliases(a_id); ! 121: const auto& b_alias = gMonitorManager.GetAliases(b_id); ! 122: const std::string a_name = a_alias[0]; ! 123: const std::string b_name = b_alias[0]; ! 124: ! 125: return strcmp(a_name.c_str(), b_name.c_str()) < 0; ! 126: } ! 127: ); ! 128: ! 129: for (const auto id : list) { ! 130: const auto& aliases = gMonitorManager.GetAliases(id); ! 131: assert(aliases.empty() == false); ! 132: ! 133: str += ' '; ! 134: str += aliases[0]; ! 135: if (aliases.size() > 1) { ! 136: str += " (alias:"; ! 137: for (int i = 1, sz = aliases.size(); i < sz; i++) { ! 138: str += ' '; ! 139: str += aliases[i]; ! 140: } ! 141: str += ')'; ! 142: } ! 143: str += '\n'; ! 144: } ! 145: return str; ! 146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.