// Insert a record into a list in the proper location // Order records ascending by their order // Look at ascPref for records with the same order bool DnsRecord::insert(ObjList& list, DnsRecord* rec, bool ascPref) { if (!rec || list.find(rec)) return false; XDebug(DebugAll,"DnsRecord::insert(%p) order=%d pref=%d",rec,rec->order(),rec->pref()); ObjList* o = list.skipNull(); for (; o; o = o->skipNext()) { DnsRecord* crt = static_cast<DnsRecord*>(o->get()); if (rec->order() > crt->order()) continue; if (rec->order() == crt->order()) { for (; o; o = o->skipNext()) { DnsRecord* crt = static_cast<DnsRecord*>(o->get()); if (crt->order() != rec->order()) break; if (crt->pref() == rec->pref()) continue; if (ascPref == (rec->pref() < crt->pref())) break; } } break; } if (o) o->insert(rec); else list.append(rec); return true; }
bool MessageDispatcher::install(MessageHandler* handler) { DDebug(DebugAll,"MessageDispatcher::install(%p)",handler); if (!handler) return false; Lock lock(this); ObjList *l = m_handlers.find(handler); if (l) return false; unsigned p = handler->priority(); int pos = 0; for (l=&m_handlers; l; l=l->next(),pos++) { MessageHandler *h = static_cast<MessageHandler *>(l->get()); if (!h) continue; if (h->priority() < p) continue; if (h->priority() > p) break; // at the same priority we sort them in pointer address order if (h > handler) break; } m_changes++; if (l) { XDebug(DebugAll,"Inserting handler [%p] on place #%d",handler,pos); l->insert(handler); } else { XDebug(DebugAll,"Appending handler [%p] on place #%d",handler,pos); m_handlers.append(handler); } handler->m_dispatcher = this; if (handler->null()) Debug(DebugInfo,"Registered broadcast message handler %p",handler); return true; }
void ExpEvaluator::pushOne(ObjList& stack, ExpOperation* oper) { if (oper) stack.insert(oper); }