From 6b4bd70c587ca533ceec4400deb4b36f6e8aa817 Mon Sep 17 00:00:00 2001 From: Yohan Bainier Date: Fri, 23 Sep 2016 15:59:34 +0200 Subject: [PATCH] AsSelf can no longer be applied to a registration which instance type is not registered as other type(s)/alias(es) --- Hypodermic/AsSelf.h | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/Hypodermic/AsSelf.h b/Hypodermic/AsSelf.h index 5e8d0a2..5cc6a64 100644 --- a/Hypodermic/AsSelf.h +++ b/Hypodermic/AsSelf.h @@ -7,12 +7,38 @@ namespace Hypodermic { namespace RegistrationDescriptorOperations { + + namespace Details + { + + struct InstanceRegistrationNotResolvable {}; + struct InstanceRegistrationResolvable {}; + + template + struct GetInstanceRegistrationResolvability + { + private: + typedef typename TDescriptorInfo::RegisteredBases RegisteredBases; + typedef typename TDescriptorInfo::InstanceRegistrationTag InstanceRegistrationTag; + + public: + typedef typename std::conditional + < + (RegisteredBases::count == 0) || std::is_same< InstanceRegistrationTag, Tags::SelfRegistered >::value, + InstanceRegistrationResolvable, + InstanceRegistrationNotResolvable + > + ::type Type; + }; + + } // namespace Details + template < class TDescriptor, class TDescriptorInfo, - class TInstanceRegistrationTag = typename TDescriptorInfo::InstanceRegistrationTag + class TInstanceRegistrationResolvability = typename Details::GetInstanceRegistrationResolvability< TDescriptorInfo >::Type > class AsSelf; @@ -22,7 +48,7 @@ namespace RegistrationDescriptorOperations class TDescriptor, class TDescriptorInfo > - class AsSelf< TDescriptor, TDescriptorInfo, Tags::NotSelfRegistered > + class AsSelf< TDescriptor, TDescriptorInfo, Details::InstanceRegistrationNotResolvable > { public: // This template avoids Early Template Instantiation issue @@ -52,7 +78,7 @@ namespace RegistrationDescriptorOperations class TDescriptor, class TDescriptorInfo > - class AsSelf< TDescriptor, TDescriptorInfo, Tags::SelfRegistered > + class AsSelf< TDescriptor, TDescriptorInfo, Details::InstanceRegistrationResolvable > { protected: virtual ~AsSelf() {}