MultiFact: implement second use case (smart pointers)
This commit is contained in:
parent
177eb0fab3
commit
372edbfc85
2 changed files with 43 additions and 6 deletions
|
|
@ -89,6 +89,8 @@ namespace lib {
|
||||||
template<typename TAR>
|
template<typename TAR>
|
||||||
struct PassAsIs
|
struct PassAsIs
|
||||||
{
|
{
|
||||||
|
typedef TAR RawType;
|
||||||
|
typedef TAR BareType;
|
||||||
typedef TAR ResultType;
|
typedef TAR ResultType;
|
||||||
|
|
||||||
template<class FUN, typename... ARGS>
|
template<class FUN, typename... ARGS>
|
||||||
|
|
@ -107,7 +109,9 @@ namespace lib {
|
||||||
template<typename TAR>
|
template<typename TAR>
|
||||||
struct BuildRefcountPtr
|
struct BuildRefcountPtr
|
||||||
{
|
{
|
||||||
typedef std::shared_ptr<TAR> ResultType;
|
using RawType = typename std::remove_pointer<TAR>::type;
|
||||||
|
using BareType = RawType *;
|
||||||
|
using ResultType = std::shared_ptr<RawType>;
|
||||||
|
|
||||||
template<class FUN, typename... ARGS>
|
template<class FUN, typename... ARGS>
|
||||||
ResultType
|
ResultType
|
||||||
|
|
@ -169,11 +173,11 @@ namespace lib {
|
||||||
>
|
>
|
||||||
struct FabConfig
|
struct FabConfig
|
||||||
{
|
{
|
||||||
using FabProduct = TY;
|
|
||||||
using WrapFunctor = Wrapper<TY>;
|
using WrapFunctor = Wrapper<TY>;
|
||||||
|
using BareProduct = typename WrapFunctor::BareType;
|
||||||
using WrappedProduct = typename WrapFunctor::ResultType;
|
using WrappedProduct = typename WrapFunctor::ResultType;
|
||||||
|
|
||||||
typedef FabProduct SIG_Fab(void);
|
typedef BareProduct SIG_Fab(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -249,13 +253,13 @@ namespace lib {
|
||||||
class Singleton
|
class Singleton
|
||||||
: lib::Depend<IMP>
|
: lib::Depend<IMP>
|
||||||
{
|
{
|
||||||
typedef lib::Depend<IMP> SingFac;
|
typedef lib::Depend<IMP> SingleFac;
|
||||||
|
|
||||||
Creator
|
Creator
|
||||||
createSingleton_accessFunction()
|
createSingleton_accessFunction()
|
||||||
{
|
{
|
||||||
return std::bind (&SingFac::operator()
|
return std::bind (&SingleFac::operator()
|
||||||
, static_cast<SingFac*>(this));
|
, static_cast<SingleFac*>(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -200,6 +200,39 @@ namespace test{
|
||||||
void
|
void
|
||||||
produce_smart_pointers()
|
produce_smart_pointers()
|
||||||
{
|
{
|
||||||
|
using TestFactory = factory::MuttiFac<Interface, theID, factory::BuildRefcountPtr>;
|
||||||
|
using PIfa = shared_ptr<Interface>;
|
||||||
|
|
||||||
|
TestFactory theFact;
|
||||||
|
|
||||||
|
// the first "production line" is wired to a free function
|
||||||
|
theFact.defineProduction (ONE, [] { return new Implementation<ONE>; });
|
||||||
|
theFact.defineProduction (TWO, [] { return new Implementation<TWO>; });
|
||||||
|
theFact.defineProduction (THR, [] { return new Implementation<THR>; });
|
||||||
|
theFact.defineProduction (FOU, [] { return new Implementation<FOU>; });
|
||||||
|
CHECK (!isnil (theFact));
|
||||||
|
|
||||||
|
PIfa p1 = theFact(ONE);
|
||||||
|
PIfa p2 = theFact(TWO);
|
||||||
|
PIfa p3 = theFact(THR);
|
||||||
|
PIfa p4 = theFact(FOU);
|
||||||
|
|
||||||
|
PIfa p11 = theFact(ONE);
|
||||||
|
|
||||||
|
CHECK ("Impl-1" == string(*p1));
|
||||||
|
CHECK ("Impl-2" == string(*p2));
|
||||||
|
CHECK ("Impl-3" == string(*p3));
|
||||||
|
CHECK ("Impl-4" == string(*p4));
|
||||||
|
|
||||||
|
CHECK ("Impl-1" == string(*p11));
|
||||||
|
CHECK (!isSameObject(*p1, *p11));
|
||||||
|
|
||||||
|
PIfa p12(p11);
|
||||||
|
CHECK (isSameObject(*p11, *p12));
|
||||||
|
CHECK ("Impl-1" == string(*p12));
|
||||||
|
CHECK (1 == p1.use_count());
|
||||||
|
CHECK (2 == p11.use_count());
|
||||||
|
CHECK (2 == p12.use_count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue