From 5c678e284862e6b52b0dd4118ef857d7b6b17ef9 Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Fri, 28 Apr 2017 18:26:33 +0300 Subject: alternative fake covariance based on converters --- tests/generics/tfakecovariance.nim | 26 ++++++++++++++++++++++++-- tests/generics/tptrinheritance.nim | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/generics/tfakecovariance.nim b/tests/generics/tfakecovariance.nim index bca285283..0920cb504 100644 --- a/tests/generics/tfakecovariance.nim +++ b/tests/generics/tfakecovariance.nim @@ -35,8 +35,8 @@ reject wantsSpecificContainers(derived) # Now, let's make a more general solution able to catch all derived types: type - DerivedFrom[T] = concept type A - var derived: ref A + DerivedFrom[T] = concept type D + var derived: ref D var base: ref T = derived proc wantsDerived(x: DerivedFrom[BaseObj]) = discard @@ -54,3 +54,25 @@ accept wantsDerivedContainer(derivedContainer) reject wantsDerivedContainer(nonDerivedContainer) +# The previous solutions were solving the problem for a single overload. +# Let's solve it for multiple overloads by introducing a converter: + +type + OtherContainer[T] = object + +proc wantsBaseContainer1(c: OtherContainer[BaseObj]) = discard +proc wantsBaseContainer2(c: OtherContainer[BaseObj]) = discard + +converter derivedToBase(c: OtherContainer[DerivedFrom[BaseObj]]): OtherContainer[BaseObj] = discard + +block: + var baseContainer: OtherContainer[BaseObj] + var derivedContainer: OtherContainer[DerivedObj] + var nonDerivedContainer: OtherContainer[NonDerivedObj] + + accept wantsBaseContainer1(derivedContainer) + reject wantsBaseContainer1(nonDerivedContainer) + + accept wantsBaseContainer2(derivedContainer) + reject wantsBaseContainer2(nonDerivedContainer) + diff --git a/tests/generics/tptrinheritance.nim b/tests/generics/tptrinheritance.nim index 1e1115fa5..221b8777b 100644 --- a/tests/generics/tptrinheritance.nim +++ b/tests/generics/tptrinheritance.nim @@ -10,7 +10,7 @@ proc newMutableArrayAbstract*(): NSMutableArrayAbstract = discard template newMutableArray*(T: typedesc): NSMutableArray[T] = cast[NSMutableArray[T]](newMutableArrayAbstract()) -proc writeObjects*(p: NSPasteboard, o: ptr NSArray[NSPasteboardItem]) = discard +proc writeObjects*(p: NSPasteboard, o: NSArray[NSPasteboardItem]) = discard let a = newMutableArray NSPasteboardItem var x: NSMutableArray[NSPasteboardItem] -- cgit 1.4.1-2-gfad0