TEST_F(ContextMemberTest, ComplexResetCase) { std::weak_ptr<CoreContext> ctxtWeak; std::weak_ptr<RefersToTweedleDee> deeWeak; std::weak_ptr<RefersToTweedleDum> dumWeak; { // Set up the cycle: AutoCreateContext ctxt; ctxtWeak = ctxt; ctxt->Inject<RefersToTweedleDee>(); ctxt->Inject<RefersToTweedleDum>(); // Now try to reset the cycle: Autowired<RefersToTweedleDee> dee(ctxt); Autowired<RefersToTweedleDum> dum(ctxt); dee->td.reset(); // Get weak pointers so we can verify that everything cleaned up deeWeak = dee; dumWeak = dum; } // Context should have gone away by now ASSERT_TRUE(ctxtWeak.expired()) << "Context was leaked even after a local cycle was reset"; ASSERT_TRUE(dumWeak.expired()) << "Leak detected of a member that was explicitly released"; ASSERT_TRUE(deeWeak.expired()) << "Leak detected of a member that was not explicitly released"; }
int main() { int x; char s[20]; FILE *g; g=fopen("input.dat","r"); while (fscanf(g,"%s",&s)==1) { if (strcmp("AF",s)==0) { fscanf(g,"%d",&x); adf(x); } else if (strcmp("AL",s)==0) { fscanf(g,"%d",&x); adl(x); } else if (strcmp("DF",s)==0) def(); else if (strcmp("DL",s)==0) del(); else if (strcmp("DE",s)==0) {fscanf(g,"%d",&x); dee(x);} else if (strcmp("PRINT_ALL",s)==0) print_alll(); else if (strcmp("PRINT_F",s)==0) { fscanf(g,"%d",&x); print_fi(x); } else if (strcmp("PRINT_L",s)==0) { fscanf(g,"%d",&x); print_la(x); } else if (strcmp("DOOM_THE_LIST",s)==0) doom_the_listt(); } return 0; }
bool QDragManager::eventFilter(QObject *o, QEvent *e) { if (beingCancelled) { if (e->type() == QEvent::KeyRelease && static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape) { qApp->removeEventFilter(this); Q_ASSERT(object == 0); beingCancelled = false; #ifndef QT_NO_LOCALEVENTLOOP eventLoop->exit(); #else asyncDragFinished(); #endif return true; // block the key release } return false; } if (!o->isWidgetType()) return false; switch(e->type()) { case QEvent::ShortcutOverride: // prevent accelerators from firing while dragging e->accept(); return true; case QEvent::KeyPress: case QEvent::KeyRelease: { QKeyEvent *ke = ((QKeyEvent*)e); if (ke->key() == Qt::Key_Escape && e->type() == QEvent::KeyPress) { cancel(); qApp->removeEventFilter(this); beingCancelled = false; #ifndef QT_NO_LOCALEVENTLOOP eventLoop->exit(); #else asyncDragFinished(); #endif } else { updateCursor(); } return true; // Eat all key events } case QEvent::MouseButtonPress: case QEvent::MouseMove: { if (!object) { //#### this should not happen qWarning("QDragManager::eventFilter: No object"); return true; } QDragManager *manager = QDragManager::self(); QMimeData *dropData = manager->object ? manager->dragPrivate()->data : manager->dropData; if (manager->object) possible_actions = manager->dragPrivate()->possible_actions; else possible_actions = Qt::IgnoreAction; QMouseEvent *me = (QMouseEvent *)e; if (me->buttons()) { Qt::DropAction prevAction = global_accepted_action; QWidget *cw = QApplication::widgetAt(me->globalPos()); // Fix for when we move mouse on to the deco widget if (qt_qws_dnd_deco && cw == qt_qws_dnd_deco) cw = object->target(); while (cw && !cw->acceptDrops() && !cw->isWindow()) cw = cw->parentWidget(); if (object->target() != cw) { if (object->target()) { QDragLeaveEvent dle; QApplication::sendEvent(object->target(), &dle); willDrop = false; global_accepted_action = Qt::IgnoreAction; updateCursor(); restoreCursor = true; object->d_func()->target = 0; } if (cw && cw->acceptDrops()) { object->d_func()->target = cw; QDragEnterEvent dee(cw->mapFromGlobal(me->globalPos()), possible_actions, dropData, me->buttons(), me->modifiers()); QApplication::sendEvent(object->target(), &dee); willDrop = dee.isAccepted() && dee.dropAction() != Qt::IgnoreAction; global_accepted_action = willDrop ? dee.dropAction() : Qt::IgnoreAction; updateCursor(); restoreCursor = true; } } else if (cw) { QDragMoveEvent dme(cw->mapFromGlobal(me->globalPos()), possible_actions, dropData, me->buttons(), me->modifiers()); if (global_accepted_action != Qt::IgnoreAction) { dme.setDropAction(global_accepted_action); dme.accept(); } QApplication::sendEvent(cw, &dme); willDrop = dme.isAccepted(); global_accepted_action = willDrop ? dme.dropAction() : Qt::IgnoreAction; updatePixmap(); updateCursor(); } if (global_accepted_action != prevAction) emitActionChanged(global_accepted_action); } return true; // Eat all mouse events } case QEvent::MouseButtonRelease: { qApp->removeEventFilter(this); if (restoreCursor) { willDrop = false; #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); #endif restoreCursor = false; } if (object && object->target()) { QMouseEvent *me = (QMouseEvent *)e; QDragManager *manager = QDragManager::self(); QMimeData *dropData = manager->object ? manager->dragPrivate()->data : manager->dropData; QDropEvent de(object->target()->mapFromGlobal(me->globalPos()), possible_actions, dropData, me->buttons(), me->modifiers()); QApplication::sendEvent(object->target(), &de); if (de.isAccepted()) global_accepted_action = de.dropAction(); else global_accepted_action = Qt::IgnoreAction; if (object) object->deleteLater(); drag_object = object = 0; } #ifndef QT_NO_LOCALEVENTLOOP eventLoop->exit(); #else asyncDragFinished(); #endif return true; // Eat all mouse events } default: break; } return false; }
bool QDragManager::eventFilter( QObject *o, QEvent *e ) { if ( !o->isWidgetType() ) return FALSE; switch( e->type() ) { case QEvent::KeyPress: case QEvent::KeyRelease: { QKeyEvent *ke = ((QKeyEvent*)e); if ( ke->key() == Key_Escape && e->type() == QEvent::KeyPress ) { cancel(); qApp->removeEventFilter( this ); dragSource = 0; } else { updateMode(ke->stateAfter()); updateCursor(); } return TRUE; // Eat all key events } case QEvent::MouseButtonPress: case QEvent::MouseMove: { QMouseEvent *me = (QMouseEvent *)e; if ( me->state() & ( QMouseEvent::LeftButton | QMouseEvent::MidButton | QMouseEvent::RightButton ) ) { QWidget *cw = QApplication::widgetAt( me->globalPos(), TRUE ); // Fix for when we move mouse on to the deco widget if ( qt_qws_dnd_deco && cw == qt_qws_dnd_deco ) cw = dropWidget; if ( dropWidget != cw ) { if ( dropWidget ) { QDragLeaveEvent dle; QApplication::sendEvent( dropWidget, &dle ); willDrop = FALSE; updateCursor(); restoreCursor = TRUE; dropWidget = NULL; } if ( cw && cw->acceptDrops() ) { dropWidget = cw; QDragEnterEvent dee( me->pos() ); QApplication::sendEvent( dropWidget, &dee ); willDrop = dee.isAccepted(); updateCursor(); restoreCursor = TRUE; } } else if ( cw ) { QDragMoveEvent dme( me->pos() ); QApplication::sendEvent( cw, &dme ); updatePixmap(); } } return TRUE; // Eat all mouse events } case QEvent::MouseButtonRelease: { qApp->removeEventFilter( this ); if ( qt_qws_dnd_deco ) delete qt_qws_dnd_deco; qt_qws_dnd_deco = 0; if ( restoreCursor ) { willDrop = FALSE; myRestoreOverrideCursor(); restoreCursor = FALSE; } if ( dropWidget ) { QMouseEvent *me = (QMouseEvent *)e; QDropEvent de( me->pos() ); QApplication::sendEvent( dropWidget, &de ); dropWidget = NULL; } return TRUE; // Eat all mouse events } default: break; } return FALSE; }
bool QDragManager::eventFilter(QObject *o, QEvent *e) { if (beingCancelled) { return false; } if (!o->isWidgetType()) return false; switch(e->type()) { case QEvent::MouseButtonPress: { } case QEvent::MouseMove: { if (!object) { //#### this should not happen qWarning("QDragManager::eventFilter: No object"); return true; } QDragManager *manager = QDragManager::self(); QMimeData *dropData = manager->object ? manager->dragPrivate()->data : manager->dropData; if (manager->object) possible_actions = manager->dragPrivate()->possible_actions; else possible_actions = Qt::IgnoreAction; QMouseEvent *me = (QMouseEvent *)e; if (me->buttons()) { Qt::DropAction prevAction = global_accepted_action; QWidget *cw = QApplication::widgetAt(me->globalPos()); // map the Coords relative to the window. if (!cw) return true; while (cw && !cw->acceptDrops() && !cw->isWindow()) cw = cw->parentWidget(); bool oldWillDrop = willDrop; if (object->target() != cw) { if (object->target()) { QDragLeaveEvent dle; QApplication::sendEvent(object->target(), &dle); willDrop = false; global_accepted_action = Qt::IgnoreAction; if (oldWillDrop != willDrop) updateCursor(); object->d_func()->target = 0; } if (cw && cw->acceptDrops()) { object->d_func()->target = cw; QDragEnterEvent dee(cw->mapFromGlobal(me->globalPos()), possible_actions, dropData, me->buttons(), me->modifiers()); QApplication::sendEvent(object->target(), &dee); willDrop = dee.isAccepted() && dee.dropAction() != Qt::IgnoreAction; global_accepted_action = willDrop ? dee.dropAction() : Qt::IgnoreAction; if (oldWillDrop != willDrop) updateCursor(); } } else if (cw) { QDragMoveEvent dme(cw->mapFromGlobal(me->globalPos()), possible_actions, dropData, me->buttons(), me->modifiers()); if (global_accepted_action != Qt::IgnoreAction) { dme.setDropAction(global_accepted_action); dme.accept(); } QApplication::sendEvent(cw, &dme); willDrop = dme.isAccepted(); global_accepted_action = willDrop ? dme.dropAction() : Qt::IgnoreAction; if (oldWillDrop != willDrop) { updatePixmap(); updateCursor(); } } if (global_accepted_action != prevAction) emitActionChanged(global_accepted_action); } return true; // Eat all mouse events } case QEvent::MouseButtonRelease: { qApp->removeEventFilter(this); #ifndef QT_NO_CURSOR if (restoreCursor) { QApplication::restoreOverrideCursor(); willDrop = false; restoreCursor = false; } #endif if (object && object->target()) { QMouseEvent *me = (QMouseEvent *)e; QDragManager *manager = QDragManager::self(); QMimeData *dropData = manager->object ? manager->dragPrivate()->data : manager->dropData; QDropEvent de(object->target()->mapFromGlobal(me->globalPos()), possible_actions, dropData, me->buttons(), me->modifiers()); QApplication::sendEvent(object->target(), &de); if (de.isAccepted()) global_accepted_action = de.dropAction(); else global_accepted_action = Qt::IgnoreAction; if (object) object->deleteLater(); drag_object = object = 0; } eventLoop->exit(); return true; // Eat all mouse events } default: break; } return false; }
void test() { { TypeList<int, int, std::string>::type tl; // ############## test length ############## static_assert(3 == TypeListLength<decltype(tl)>::value, "TypeListLength failed!"); // ############## test typelist to tuple ############## TypeListToTuple<decltype(tl)>::type tpl; static_assert(std::is_same<std::tuple<int, int, std::string>, decltype(tpl)>::value, "TypeListToTuple failed!"); // constructor should work... TypeListToTuple<decltype(tl)>::type blah{1, 2, "somethingisgoingon"}; // ############## test tuple to typelist ############## TupleToTypeList<decltype(tpl)>::type tl2; static_assert(std::is_same<decltype(tl), decltype(tl2)>::value, "TupleToTypeList failed!"); // just to be sure... static_assert(3 == TypeListLength<decltype(tl2)>::value, "TupleToTypeList failed!"); // ############## test to a tuple one last time ############## TypeListToTuple<decltype(tl2)>::type tpl2; static_assert(std::is_same<decltype(tpl), decltype(tpl2)>::value, "TypeListToTuple failed!"); // just to be sure... static_assert(std::is_same<std::tuple<int, int, std::string>, decltype(tpl2)>::value, "TypeListToTuple failed!"); // constructor should work... TypeListToTuple<decltype(tl)>::type blahbar{1, 2, "somethingisgoingon"}; } { // ############## test getting a type by name ############## Get<F::x, DTypes>::type exx; static_assert(std::is_same<int, decltype(exx)>::value, "Get failed!"); // assignment should work exx = 20; Get<F::z, DTypes>::type zee; static_assert(std::is_same<std::string, decltype(zee)>::value, "Get failed!"); zee = "somestring"; // ############## test getting multiple types by name ############## GetMany<TypeList<F::x, F::z>::type, DTypes>::type tl; // printType<decltype(tl)>(); static_assert(std::is_same<TypeList<int, std::string>::type, decltype(tl)>::value, "GetMany failed!"); } { typedef TypeList<F::x, F::y, F::x>::type SimpleTypeList; // ############## test Haz ############## static_assert(true == Haz<F::x, SimpleTypeList>::value, "Haz failed!"); struct q; static_assert(false == Haz<q, SimpleTypeList>::value, "Faz failed!"); } { // ############## test MemberPairTypeList ############## MemberPairTypeList<DTypes>::type mpairs; static_assert(std::is_same<decltype(mpairs), TypeList<int, int, std::string>::type>::value, "MemberPairTypeList failed!"); } { const int x = 100; const std::string z = "ring"; { // ############## test expansion from partial ############## const auto tpl = DBase::expandAndTuple<TypeList<F::x, F::z>::type >(x, z); static_assert(std::is_same<const std::tuple<int, int, std::string>, decltype(tpl)>::value, "expandAndTuple failed!"); assert(std::get<0>(tpl) == x && std::get<2>(tpl) == z); } const int y = 450; { // ############## test expansion from full ############## const auto tpl2 = DBase::expandAndTuple<TypeList<F::x, F::y, F::z>::type>(x, y, z); static_assert(std::is_same<const std::tuple<int, int, std::string>, decltype(tpl2)>::value, "expandAndTuple failed!"); assert(std::get<0>(tpl2) == x && std::get<1>(tpl2) == y && std::get<2>(tpl2) == z); } { // ############## test expansion from nothing ############## const auto tpl3 = DBase::expandAndTuple<TypeList<>::type>(); static_assert(std::is_same<const std::tuple<int, int, std::string>, decltype(tpl3)>::value, "expandAndTuple failed!"); } } { const int x = 450; const std::string z = "hiyo"; D dee(x, z); assert((450 == static_cast<DBase &>(dee).member_pair.value && "hiyo" == static_cast<A<D, TypeList<MemberPair<F::z, std::string> >::type>&>(dee).member_pair.value)); } }