void compzillaWindow::Destroyed () { SPEW ("DestroyWindow this=%p, window=%p, observers=%d, canvases=%d\n", this, mWindow, mObservers.Count(), mContentNodes.Count()); if (mIsDestroyed) return; mIsDestroyed = true; // Allow a caller to remove O(N^2) behavior by removing end-to-start. for (PRUint32 i = mContentNodes.Count() - 1; i != PRUint32(-1); --i) { ConnectListeners (false, mContentNodes.ObjectAt(i)); } mContentNodes.Clear (); // Copy the observers so list iteration is reentrant. nsCOMArray<compzillaIWindowObserver> observers(mObservers); mObservers.Clear (); for (PRUint32 i = observers.Count() - 1; i != PRUint32(-1); --i) { observers.ObjectAt(i)->Destroy (); } }
void ScriptState::disposePerContextData() { Vector<Observer*> observers(m_observers); for (auto& observer : observers) observer->willDisposeScriptState(this); m_perContextData = nullptr; }
// Notify void Notifier::Notify() const { if (!fSuspended) { BList observers(fListeners); int32 count = observers.CountItems(); for (int32 i = 0; i < count; i++) ((Listener*)observers.ItemAtFast(i))->ObjectChanged(this); fPendingNotifications = false; } else { fPendingNotifications = true; } }
TEST(ObserverListTest, Basic) { Observer a(1), b(2), c(3); EXPECT_EQ(1, a.num()); EXPECT_EQ(2, b.num()); EXPECT_EQ(3, c.num()); std::shared_ptr<base::ObserverList<Observer>> observers(new base::ObserverList<Observer>()); observers->AddObserver(&a); observers->AddObserver(&b); observers->AddObserver(&c); FOR_EACH_OBSERVER(Observer, observers, set_num(10)); EXPECT_EQ(10, a.num()); EXPECT_EQ(10, b.num()); EXPECT_EQ(10, c.num()); }
TEST(state, capsule_carries_its_own_watchers) { auto sig = std::shared_ptr<detail::state_up_down_signal<int>>{}; auto s = testing::spy(); { auto st = make_state(42); sig = detail::access::signal(st); watch(st, s); sig->push_down(12); sig->send_down(); sig->notify(); EXPECT_EQ(1, s.count()); } sig->push_down(7); sig->send_down(); sig->notify(); EXPECT_EQ(1, s.count()); EXPECT_TRUE(sig->observers().empty()); }
void nsObserverList::FillObserverArray(nsCOMArray<nsIObserver>& aArray) { aArray.SetCapacity(mObservers.Length()); nsTArray<ObserverRef> observers(mObservers); for (int32_t i = observers.Length() - 1; i >= 0; --i) { if (observers[i].isWeakRef) { nsCOMPtr<nsIObserver> o(do_QueryReferent(observers[i].asWeak())); if (o) { aArray.AppendObject(o); } else { // the object has gone away, remove the weakref mObservers.RemoveElement(observers[i].asWeak()); } } else { aArray.AppendObject(observers[i].asObserver()); } } }
void LineChartCanvas::OnDblClick(wxMouseEvent& event) { wxPoint pos = event.GetPosition(); wxSize size(GetVirtualSize()); int win_width = size.GetWidth(); int win_height = size.GetHeight(); size_t tms = tm_rects.size(); for (size_t t=0; t<tms; ++t) { GdaRectangle r(*((GdaRectangle*) tm_rects[t])); if (r.lower_left.y - pos.y < 40 && r.lower_left.y - pos.y > -40) { bool opened = false; wxPoint pt; FramesManager* fm = project->GetFramesManager(); std::list<FramesManagerObserver*> observers(fm->getCopyObservers()); std::list<FramesManagerObserver*>::iterator it; for (it=observers.begin(); it != observers.end(); ++it) { if (TimeChooserDlg* w = dynamic_cast<TimeChooserDlg*>(*it)) { LOG_MSG("TimeChooserDlg already opened."); w->Show(true); w->Maximize(false); w->Raise(); pt = w->GetPosition(); opened = true; } } if (!opened) { LOG_MSG("Opening a new TimeChooserDlg"); TimeChooserDlg* dlg = new TimeChooserDlg(0, project->GetFramesManager(), project->GetTimeState(), project->GetTableState(), project->GetTableInt()); dlg->Show(true); pt = dlg->GetPosition(); } opened = false; for (it=observers.begin(); it != observers.end(); ++it) { if (VarGroupingEditorDlg* w = dynamic_cast<VarGroupingEditorDlg*>(*it)) { LOG_MSG("VarGroupingEditorDlg already opened."); w->Show(true); w->Maximize(false); w->Raise(); w->SetPosition(wxPoint(pt.x, pt.y + 130)); opened =true; break; } } if (!opened) { LOG_MSG("Opening a new VarGroupingEditorDlg"); VarGroupingEditorDlg* dlg = new VarGroupingEditorDlg(project, this); dlg->Show(true); int start_x = pt.x - 200; if (start_x) start_x = 0; dlg->SetPosition(wxPoint(pt.x, pt.y + 130)); } return; } } }