diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-27 10:40:20 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-27 10:41:08 +0200 |
commit | 71fd88a5b5839b228c824e61028787be8e825dad (patch) | |
tree | 29f2dcee63fc1a0d103d9dca46ae31b8ce978932 | |
parent | a044a7f0ea054502fb8b6aedcfa213b192a7b05a (diff) | |
download | sink-71fd88a5b5839b228c824e61028787be8e825dad.tar.gz sink-71fd88a5b5839b228c824e61028787be8e825dad.zip |
Use std::shared_ptr instead of QSharedPointer for facade factory.
Because it supports std::shared_ptr<void>, which is a nice alternative
to make everything a QObject subclass for nothing.
-rw-r--r-- | common/clientapi.h | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/common/clientapi.h b/common/clientapi.h index 6d66e40..f7f4c13 100644 --- a/common/clientapi.h +++ b/common/clientapi.h | |||
@@ -490,7 +490,7 @@ public: | |||
490 | } | 490 | } |
491 | 491 | ||
492 | template<class DomainType> | 492 | template<class DomainType> |
493 | QSharedPointer<StoreFacade<DomainType> > getFacade(const QByteArray &resource) | 493 | std::shared_ptr<StoreFacade<DomainType> > getFacade(const QByteArray &resource) |
494 | { | 494 | { |
495 | const QByteArray typeName = ApplicationDomain::getTypeName<DomainType>(); | 495 | const QByteArray typeName = ApplicationDomain::getTypeName<DomainType>(); |
496 | auto factoryFunction = mFacadeRegistry.value(key(resource, typeName)); | 496 | auto factoryFunction = mFacadeRegistry.value(key(resource, typeName)); |
@@ -499,27 +499,19 @@ public: | |||
499 | auto ptr = static_cast<StoreFacade<DomainType>* >(factoryFunction(externallyManaged)); | 499 | auto ptr = static_cast<StoreFacade<DomainType>* >(factoryFunction(externallyManaged)); |
500 | if (externallyManaged) { | 500 | if (externallyManaged) { |
501 | //Allows tests to manage the lifetime of injected facades themselves | 501 | //Allows tests to manage the lifetime of injected facades themselves |
502 | return QSharedPointer<StoreFacade<DomainType> >(ptr, doNothingDeleter); | 502 | return std::shared_ptr<StoreFacade<DomainType> >(ptr, doNothingDeleter); |
503 | } else { | 503 | } else { |
504 | return QSharedPointer<StoreFacade<DomainType> >(ptr); | 504 | return std::shared_ptr<StoreFacade<DomainType> >(ptr); |
505 | } | 505 | } |
506 | } | 506 | } |
507 | qWarning() << "Failed to find facade for resource: " << resource << " and type: " << typeName; | 507 | qWarning() << "Failed to find facade for resource: " << resource << " and type: " << typeName; |
508 | return QSharedPointer<StoreFacade<DomainType> >(); | 508 | return std::shared_ptr<StoreFacade<DomainType> >(); |
509 | } | 509 | } |
510 | 510 | ||
511 | private: | 511 | private: |
512 | QHash<QByteArray, FactoryFunction> mFacadeRegistry; | 512 | QHash<QByteArray, FactoryFunction> mFacadeRegistry; |
513 | }; | 513 | }; |
514 | 514 | ||
515 | template <class DomainType> | ||
516 | struct LifeExtender { | ||
517 | LifeExtender(const QSharedPointer<StoreFacade<DomainType> > &f) : facade(f) {} | ||
518 | private: | ||
519 | QSharedPointer<StoreFacade<DomainType> > facade; | ||
520 | }; | ||
521 | |||
522 | |||
523 | /** | 515 | /** |
524 | * Store interface used in the client API. | 516 | * Store interface used in the client API. |
525 | */ | 517 | */ |
@@ -551,8 +543,7 @@ public: | |||
551 | auto facade = FacadeFactory::instance().getFacade<DomainType>(resource); | 543 | auto facade = FacadeFactory::instance().getFacade<DomainType>(resource); |
552 | facade->load(query, resultSet).template then<void>([&future](){future.setFinished();}).exec(); | 544 | facade->load(query, resultSet).template then<void>([&future](){future.setFinished();}).exec(); |
553 | //Keep the facade alive for the duration for the lifetime of the resultSet. | 545 | //Keep the facade alive for the duration for the lifetime of the resultSet. |
554 | //TODO If the factory returned a std::shared_ptr we wouldn't require LifeExtender | 546 | resultSet->setFacade(facade); |
555 | resultSet->setFacade(std::make_shared<LifeExtender<DomainType> >(facade)); | ||
556 | }).template then<void>([query, resultSet]() { | 547 | }).template then<void>([query, resultSet]() { |
557 | resultSet->initialResultSetComplete(); | 548 | resultSet->initialResultSetComplete(); |
558 | if (!query.liveQuery) { | 549 | if (!query.liveQuery) { |