Wiki

Ticket #330: net4-set.patch

File net4-set.patch, 13.8 KB (added by hopscc, 12 years ago)
  • Source/Compiler.cobra

     
    522522        if v, print '    No source file is newer than "[outName]"; skipping compile.' 
    523523        return false 
    524524     
    525     def addRunTimeRef(opts as OptionValues) 
    526         if not opts.containsKey('reference') 
    527             opts['reference'] = List<of String>() 
     525    def addRunTimeRef(opts as OptionValues, libName as String) 
     526        if not opts.containsKey('reference'), opts['reference'] = List<of String>() 
    528527        refs = opts['reference'] to List<of String> 
    529         libName = .backEnd.cobraRuntimeLibFileName 
    530528        if libName not in refs 
    531529            if .verbosity, print 'Adding reference to [libName]' 
    532530            refs.add(libName) 
    533  
     531             
    534532    def runProcess as Process 
    535533        return .runProcess(nil, nil) 
    536534         
  • Source/CommandLine.cobra

     
    194194        }, 
    195195        { 
    196196            'name': 'copy-core', 
     197            'synonyms': ['cc'], 
    197198            'type': 'bool', 
    198199            'description': 'Copy the Cobra.Core library to the same location as the resulting executable which will insulate the executable from newer Cobra installations.', 
    199200            'default': 'no', 
  • Source/BackEnd.cobra

     
    1818    var _tagToTypeName = Dictionary<of String, String>() 
    1919        """ Map from Typename tags used in compiler to backend specific qualified Type name""" 
    2020     
     21    var _additionalRunTimeLibs = List<of String>() 
     22     
    2123    get name from _name as String 
    2224        """Name of this backend: format is 'language-platform' e.g 'c#-clr'."""  
    2325 
     
    2729    get runTimeLibNativeSourceFileName from _runTimeLibNativeSourceFileName as String 
    2830        """Name of the backEnd source file containing any native code support for Cobra.Core.""" 
    2931             
     32    get additionalRunTimeLibs from var 
     33        """Names of additional (System) libs to always reference with ert or not.""" 
     34 
    3035    get compiler from __compiler as Compiler 
    3136     
    3237     
  • Source/Phases/ParsePhase.cobra

     
    153153                for m in List<of Module>(_parsedModules) 
    154154                    if m.isCobraLibrary and not m.fileName.endsWith('.dll') 
    155155                        _parsedModules.remove(m) 
    156                 .compiler.addRunTimeRef(opts)  # add ref to runtime dll 
     156                rtlName = .compiler.backEnd.cobraRuntimeLibFileName 
     157                .compiler.addRunTimeRef(opts, rtlName)  # add ref to runtime dll 
    157158            else 
    158159                opts['embed-run-time'] = .options['embed-run-time'] 
    159160                # errchannel.throwError('Cannot switch -ert:no to -ert:yes in compilerDirective') 
  • Source/Phases/BindRunTimeLibraryPhase.cobra

     
    1414            _embedRunTime 
    1515        else 
    1616            _refRunTime 
    17  
     17        _refAdditionalLibs 
     18         
    1819    def _embedRunTime 
    1920        if .verbosity >= 2, print 'Embedding Cobra run-time' 
    2021 
     
    7172 
    7273    def _refRunTime  
    7374        if .verbosity >= 2, print 'Referencing Cobra run-time' 
    74         .compiler.addRunTimeRef(.options)  # then reference run-time dll 
    75  
     75        rtlName = .compiler.backEnd.cobraRuntimeLibFileName 
     76        .compiler.addRunTimeRef(.options, rtlName)  # then reference run-time dll 
     77         
     78    def _refAdditionalLibs 
     79        for lib in .compiler.backEnd.additionalRunTimeLibs 
     80            .compiler.addRunTimeRef(.options, lib)   
     81         
    7682    get cobraExeDir as String 
    7783        """ 
    7884        Returns the directory where cobra.exe is residing. 
  • Source/BackEndClr/ClrBackEnd.cobra

     
    1414        _name = 'c#-clr' 
    1515        _runTimeLibFileName = 'Cobra.Core.dll' 
    1616        _runTimeLibNativeSourceFileName = 'Native.cs' # backEnd source file containing native code support for Cobra.Core 
     17        # using Net 4.0 compiler 
     18        # if not compiler.options['native-compiler'].length or compiler.options['native-compiler'] contains '4' 
     19        _additionalRunTimeLibs = ['System.Core.dll'] # On .Net4.0 
    1720     
    1821        _tagToTypeName = {  
    1922            'Object'    :       'System.Object', 
  • Source/Cobra.Core/Set.cobra

     
    11namespace Cobra.Core 
    22 
    33    use System.Collections 
     4    #use System.Collections.Generic 
     5    use System.Collections.ObjectModel 
    46     
    5     interface ISet<of T> inherits ICollection<of T>, IEnumerable<of T>, ISet 
     7    interface ISet<of T> inherits System.Collections.Generic.ISet<of T>, ICollection<of T>, IEnumerable<of T>, ISet 
    68 
    79        ## Collection type operations 
    810 
     
    1113         
    1214        ## Set operations 
    1315     
    14         def isSubsetOf(s as ISet<of T>) as bool 
    15         def isSupersetOf(s as ISet<of T>) as bool 
     16        #def isSubsetOf(s as ISet<of T>) as bool 
     17        #def isSupersetOf(s as ISet<of T>) as bool 
    1618        def intersection(s as ISet<of T>) as ISet<of T> 
    1719        def union(s as ISet<of T>) as ISet<of T> 
    1820        def difference(s as ISet<of T>) as ISet<of T> 
     
    2022        def toList as List<of T> 
    2123 
    2224         
    23     class Set<of T> implements ISet<of T>, ICollection<of T>, IEnumerable<of T> 
     25    class Set<of T> inherits System.Collections.Generic.HashSet<of T> implements ISet<of T>, ICollection<of T>, IEnumerable<of T>, ISet 
    2426        """ 
    25         A Set holds a hashed, unordered collections of items. 
     27        A Set holds a hashed, unordered collections of items.  
    2628        Membership testing and set operations (intersection, union, etc.) are faster than with lists, but order is not preserved. 
    2729        Set implements ICollection, so it has the usual collection operations such as `add`, `count` and `contains`. 
    2830        It also has set specific operations including `union`, `intersection` and `isSubsetOf`. 
     
    3032        As with other collections, to create a copy of a set, create a new one passing the original to the initializer: 
    3133            s = Set<of int>(s) 
    3234 
     35        This one is now based on Net4.0 System.Collections.Generic.HashSet<of T> augmented to support same 
     36        API as the original cobra implemented version running on .Net2.0. 
     37     
    3338        TODO: 
    3439            [-] List style items 
    3540            [ ] Can the methods use .getType instead of hardcoding Set? Then subclasses would get created for example .intersection 
     
    4146            [ ] Move some method implementations up to ISet extension 
    4247        """ 
    4348     
    44         const defaultCapacity = 8 
    45  
    46         var _data as Dictionary<of T, T> 
    47  
    4849        ## Initialization 
    4950     
    5051        cue init 
    51             .init(.defaultCapacity, nil, nil) 
     52            base.init 
    5253 
     54        # Just for backward compatibility 
    5355        cue init(capacity as int) 
    54             .init(capacity, nil, nil) 
     56            base.init 
    5557 
    5658        cue init(items as IEnumerable<of T>) 
    5759            # CC: ensure for item in items assert .contains(item)    or, 
    5860            # CC: ensure for item in items get .contains(item) 
    59             .init(.defaultCapacity, items, nil) 
     61            base.init(items) 
    6062 
    6163        cue init(comparer as IEqualityComparer<of T>) 
    62             .init(.defaultCapacity, nil, comparer) 
     64            base.init(comparer) 
    6365             
    6466        cue init(items as IEnumerable<of T>?, comparer as IEqualityComparer<of T>?) 
    65             .init(.defaultCapacity, items, comparer) 
     67            base.init(items, comparer) 
    6668 
     69        # also for backwards compatibility 
    6770        cue init(capacity as int, items as IEnumerable<of T>?, comparer as IEqualityComparer<of T>?) 
    68             base.init 
    69             _data = Dictionary<of T, T>(capacity, comparer) 
    70             if items, for item in items, _data[item] = item 
     71            base.init(items, comparer) 
    7172 
    7273 
    73         ## IEnumerable 
     74        ## IEnumerable  
     75        #def getEnumerator as IEnumerator<of T> - inherited 
     76        #def getEnumerator as System.Collections.IEnumerator - inherited 
    7477     
    75         def getEnumerator as IEnumerator<of T> 
    76             return _data.keys.getEnumerator 
    77  
    78         def getEnumerator as System.Collections.IEnumerator 
    79             implements System.Collections.IEnumerable 
    80             return .getEnumerator to System.Collections.IEnumerator 
    81      
    82      
    8378        ## Object 
    84      
    85         def equals(other as Object?) as bool is override 
     79        def equals(other as Object?) as bool is override  
    8680            # TODO: could this be more efficient? 
    8781            if other inherits Set<of T> 
    8882                if .count <> other.count 
     
    10296                    if not other.contains(item) 
    10397                        return false 
    10498                for item2 in other 
    105                     if not sharp'item2 is T' 
     99                    if not item2 inherits T 
    106100                        return false 
    107101                    if not .contains(item2 to T) 
    108102                        return false 
     
    116110                code ^= item.getHashCode 
    117111            return code 
    118112 
     113        ## ICollection - all inherited 
     114        #def add(item as T) 
     115        #def clear 
     116        #def copyTo(array as T[], arrayIndex as int) 
     117        #get count as int 
     118        #def contains(item as T) as bool 
     119        #get isReadOnly as bool 
     120        #def remove(item as T) as bool 
    119121 
    120         ## ICollection 
    121      
    122         def add(item as T) 
    123             ensure .contains(item) 
    124             _data[item] = item 
    125  
    126         def clear 
    127             ensure .count == 0 
    128             _data.clear 
    129  
    130         def copyTo(array as T[], arrayIndex as int) 
    131             _data.keys.copyTo(array, arrayIndex) 
    132  
    133         get count as int 
    134             ensure result >= 0 
    135             return _data.count 
    136          
    137         def contains(item as T) as bool 
    138             return _data.containsKey(item) 
    139  
    140         get isReadOnly as bool 
    141             return false 
    142  
    143         def remove(item as T) as bool 
    144             ensure 
    145                 not .contains(item) 
    146                 # .contains(item) implies result  TODO: How to say "old this"? 
    147             body 
    148                 return _data.remove(item) 
    149  
    150  
    151122        # ISet 
    152          
    153123        get countOfISet as int 
    154             return _data.count 
     124            return base.count 
    155125 
    156         def contains(item as Object) as bool 
     126        def contains(item as Object) as bool  
    157127            implements ISet 
    158             return if(sharp'item is T', .contains(item to T), false) 
     128            return if(sharp'item is T', base.contains(item to T), false) 
    159129 
    160130 
    161131        ## Set operations 
    162132     
    163         def isSubsetOf(s as ISet<of T>) as bool 
    164             for item in this 
    165                 if not s.contains(item) 
    166                     return false 
    167             return true 
     133        #def isSubsetOf(s as ISet<of T>) as bool 
     134        #def isSupersetOf(s as ISet<of T>) as bool 
    168135 
    169         def isSupersetOf(s as ISet<of T>) as bool 
    170             return s.isSubsetOf(this) 
    171  
    172136        def intersection(s as ISet<of T>) as ISet<of T> 
    173137            """ 
    174138            Returns a new set containing only the elements that are in this set and `s`. (AND) 
     139            base.intersectionWith modifies this set 
    175140            """ 
    176             r = Set<of T>() 
    177             for item in this 
    178                 if s.contains(item) 
    179                     r.add(item) 
     141            #r = Set<of T>() 
     142            #for item in this 
     143            #   if s.contains(item) 
     144            #       r.add(item) 
     145            #return r 
     146            r = Set<of T>(this) 
     147            r.intersectWith(s) 
    180148            return r 
    181149 
    182150        def union(s as ISet<of T>) as ISet<of T> 
    183151            """ 
    184152            Returns a new set containing the elements of that are in this set or `s`. (OR) 
     153            base.unionWith modifies this set 
    185154            """ 
    186155            r = Set<of T>(this) 
    187             r.addRange(s) 
     156            r.unionWith(s) 
    188157            return r 
     158            #r = Set<of T>(this) 
     159            #r.addRange(s) 
     160            #return r 
     161             
    189162     
    190163        def difference(s as ISet<of T>) as ISet<of T> 
    191164            """ 
     
    200173        def symmetricDifference(s as ISet<of T>) as ISet<of T> 
    201174            """ 
    202175            Returns a new set with elements in either s or t but not both. (XOR) 
     176            base.symmetricExceptWith modifies this set. 
    203177            """ 
    204             r = Set<of T>() 
    205             for item in this 
    206                 if not s.contains(item) 
    207                     r.add(item) 
    208             for item in s 
    209                 if not .contains(item) 
    210                     r.add(item) 
     178            r = Set<of T>(this) 
     179            r.symmetricExceptWith(s) 
    211180            return r 
     181            #r = Set<of T>() 
     182            #for item in this 
     183            #   if not s.contains(item) 
     184            #       r.add(item) 
     185            #for item in s 
     186            #   if not .contains(item) 
     187            #       r.add(item) 
     188            #return r 
    212189 
    213190 
    214191        ## List<of T>-inspired Members 
     
    222199            for item in items 
    223200                .add(item) 
    224201 
    225         #def asReadOnly as ReadOnlyCollection<of T> 
    226             # TODO 
    227  
     202        def asReadOnly as ReadOnlyCollection<of T> 
     203            return ReadOnlyCollection<of T>(.toList ) 
     204             
    228205        # TODO 
    229206        #def convertAll<of TOutput>(converter as Converter<of T, TOutput>) as Set<of TOutput> 
    230207        #   newSet = Set<of TOutput>() 
     
    232209        #       newSet.add(converter(item)) 
    233210        #   return newSet 
    234211 
    235         # TODO 
    236         #def exists(predicate as Predicate<of T>) as bool 
    237         #   for item in this 
    238         #       if predicate(item) 
    239         #           return true 
    240         #   return false 
     212        def exists(predicate as Predicate<of T>) as bool 
     213            for item in this 
     214                if predicate(item) 
     215                    return true 
     216            return false 
    241217         
    242218        # TODO: find 
    243219        # TODO: findAll 
     
    258234                result.count == .count 
    259235                result.typeOf is .typeOf 
    260236            body 
    261                 type = .typeOf 
    262                 newList = type(this) 
    263                 return newList 
     237                return .memberwiseClone to ISet<of T> 
    264238 
    265239        def toList as List<of T> 
    266240            return List<of T>(this) 
    267241 
    268     interface ISet inherits IEnumerable 
     242    interface ISet inherits System.Collections.IEnumerable 
    269243        """ 
    270244        This interface is to facilitate Set<of>.equals when the generic types are different (which 
    271245        does not necessarily restrict the two sets from having the same contents). 
     
    280254        test 
    281255            s = Set<of int>() 
    282256            assert s.count == 0 
     257            s1 = Set<of int>() 
     258            assert s1.count == 0 
     259            assert s is not s1 
     260            assert s == s1 
     261            assert s.getHashCode <> s1.getHashCode 
     262             
     263            s = Set<of int>() 
     264            assert s.count == 0 
    283265            t = Set<of int>() to ISet<of int> 
    284266            assert t.count == 0 
    285267            assert s is not t 
     
    354336 
    355337            r = Set<of int>([1, 2]).symmetricDifference(Set<of int>([2, 3])) 
    356338            assert r.toList == [1, 3] or r.toList == [3, 1] 
    357  
     339             
     340            p = Set<of int>([1,2,3,4]).exists( do(i as int)) 
     341                return  i % 2 == 0  
     342            assert p     
     343             
     344            p = Set<of int>([1,2,3,4]).exists( do(i as int)) 
     345                return  i >5  
     346            assert not p     
     347