Changeset 761

Show
Ignore:
Timestamp:
06/25/08 02:25:40 (2 months ago)
Author:
walter
Message:

change opEquals to return bool

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/phobos/internal/object.d

    r758 r761  
    77 * This module is implicitly imported. 
    88 * Macros: 
    9  *  WIKI = Phobos/Object 
     9 * WIKI = Phobos/Object 
    1010 */ 
    1111 
     
    9494    void print() 
    9595    { 
    96         printf("%.*s\n", toString()); 
     96   printf("%.*s\n", toString()); 
    9797    } 
    9898 
     
    102102    string toString() 
    103103    { 
    104         return this.classinfo.name; 
     104   return this.classinfo.name; 
    105105    } 
    106106 
     
    110110    hash_t toHash() 
    111111    { 
    112         // BUG: this prevents a compacting GC from working, needs to be fixed 
    113         return cast(uint)cast(void *)this; 
     112   // BUG: this prevents a compacting GC from working, needs to be fixed 
     113   return cast(uint)cast(void *)this; 
    114114    } 
    115115 
     
    117117     * Compare with another Object obj. 
    118118     * Returns: 
    119      *  $(TABLE 
     119     * $(TABLE 
    120120     *  $(TR $(TD this < obj) $(TD < 0)) 
    121121     *  $(TR $(TD this == obj) $(TD 0)) 
     
    125125    int opCmp(Object o) 
    126126    { 
    127         // BUG: this prevents a compacting GC from working, needs to be fixed 
    128         //return cast(int)cast(void *)this - cast(int)cast(void *)o; 
    129  
    130         throw new Error(cast(string) ("need opCmp for class " 
     127   // BUG: this prevents a compacting GC from working, needs to be fixed 
     128   //return cast(int)cast(void *)this - cast(int)cast(void *)o; 
     129 
     130   throw new Error(cast(string) ("need opCmp for class " 
    131131                                      ~ this.classinfo.name)); 
    132132    } 
     
    135135     * Returns !=0 if this object does have the same contents as obj. 
    136136     */ 
    137     int opEquals(Object o) 
    138     { 
    139         return cast(int)(this is o); 
     137    bool opEquals(Object o) 
     138    { 
     139   return (this is o); 
    140140    } 
    141141 
     
    151151    final void notifyRegister(void delegate(Object) dg) 
    152152    { 
    153         //printf("notifyRegister(dg = %llx, o = %p)\n", dg, this); 
    154         synchronized (this) 
    155        
    156             Monitor* m = cast(Monitor*)(cast(void**)this)[1]; 
    157             foreach (inout x; m.delegates) 
    158             { 
    159                 if (!x || x == dg) 
    160                 {   x = dg; 
    161                     return; 
    162                
    163             } 
    164  
    165             // Increase size of delegates[] 
    166             auto len = m.delegates.length; 
    167             auto startlen = len; 
    168             if (len == 0) 
    169             { 
    170                 len = 4; 
    171                 auto p = calloc((void delegate(Object)).sizeof, len); 
    172                 if (!p) 
    173                     _d_OutOfMemory(); 
    174                 m.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 
    175             } 
    176             else 
    177             { 
    178                 len += len + 4; 
    179                 auto p = realloc(m.delegates.ptr, (void delegate(Object)).sizeof * len); 
    180                 if (!p) 
    181                     _d_OutOfMemory(); 
    182                 m.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 
    183                 m.delegates[startlen .. len] = null; 
    184             } 
    185             m.delegates[startlen] = dg; 
    186        
     153   //printf("notifyRegister(dg = %llx, o = %p)\n", dg, this); 
     154   synchronized (this) 
     155   
     156       Monitor* m = cast(Monitor*)(cast(void**)this)[1]; 
     157       foreach (inout x; m.delegates) 
     158       { 
     159       if (!x || x == dg) 
     160       {   x = dg; 
     161           return; 
     162       
     163       } 
     164 
     165       // Increase size of delegates[] 
     166       auto len = m.delegates.length; 
     167       auto startlen = len; 
     168       if (len == 0) 
     169       { 
     170       len = 4; 
     171       auto p = calloc((void delegate(Object)).sizeof, len); 
     172       if (!p) 
     173           _d_OutOfMemory(); 
     174       m.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 
     175       } 
     176       else 
     177       { 
     178       len += len + 4; 
     179       auto p = realloc(m.delegates.ptr, (void delegate(Object)).sizeof * len); 
     180       if (!p) 
     181           _d_OutOfMemory(); 
     182       m.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 
     183       m.delegates[startlen .. len] = null; 
     184       } 
     185       m.delegates[startlen] = dg; 
     186   
    187187    } 
    188188 
     
    194194    final void notifyUnRegister(void delegate(Object) dg) 
    195195    { 
    196         synchronized (this) 
    197        
    198             Monitor* m = cast(Monitor*)(cast(void**)this)[1]; 
    199             foreach (inout x; m.delegates) 
    200             { 
    201                 if (x == dg) 
    202                     x = null; 
    203             } 
    204        
     196   synchronized (this) 
     197   
     198       Monitor* m = cast(Monitor*)(cast(void**)this)[1]; 
     199       foreach (inout x; m.delegates) 
     200       { 
     201       if (x == dg) 
     202           x = null; 
     203       } 
     204   
    205205    } 
    206206 
     
    210210     * a default constructor. 
    211211     * Returns: 
    212      *  null if failed 
     212     * null if failed 
    213213     */ 
    214214    static Object factory(string classname) 
    215215    { 
    216         auto ci = ClassInfo.find(classname); 
    217         if (ci) 
    218        
    219             return ci.create(); 
    220        
    221         return null; 
     216   auto ci = ClassInfo.find(classname); 
     217   if (ci) 
     218   
     219       return ci.create(); 
     220   
     221   return null; 
    222222    } 
    223223} 
     
    229229    if (m.delegates.length) 
    230230    { 
    231         auto dgs = m.delegates; 
    232         synchronized (o) 
    233        
    234             dgs = m.delegates; 
    235             m.delegates = null; 
    236        
    237  
    238         foreach (dg; dgs) 
    239        
    240             if (dg) 
    241             {  //printf("calling dg = %llx (%p)\n", dg, o); 
    242                 dg(o); 
    243             } 
    244        
    245  
    246         free(dgs.ptr); 
     231   auto dgs = m.delegates; 
     232   synchronized (o) 
     233   
     234       dgs = m.delegates; 
     235       m.delegates = null; 
     236   
     237 
     238   foreach (dg; dgs) 
     239   
     240       if (dg) 
     241       {   //printf("calling dg = %llx (%p)\n", dg, o); 
     242       dg(o); 
     243       } 
     244   
     245 
     246   free(dgs.ptr); 
    247247    } 
    248248} 
     
    256256struct Interface 
    257257{ 
    258     ClassInfo classinfo;       /// .classinfo for this interface (not for containing class) 
     258    ClassInfo classinfo;   /// .classinfo for this interface (not for containing class) 
    259259    void *[] vtbl; 
    260     int offset;                /// offset to Interface 'this' from Object 'this' 
     260    int offset;            /// offset to Interface 'this' from Object 'this' 
    261261} 
    262262 
     
    269269class ClassInfo : Object 
    270270{ 
    271     byte[] init;                /** class static initializer 
    272                                 * (init.length gives size in bytes of class) 
    273                                 */ 
    274     string name;                /// class name 
    275     void *[] vtbl;              /// virtual function pointer table 
    276     Interface[] interfaces;     /// interfaces this class implements 
    277     ClassInfo base;             /// base class 
     271    byte[] init;       /** class static initializer 
     272                * (init.length gives size in bytes of class) 
     273                */ 
     274    string name;       /// class name 
     275    void *[] vtbl;     /// virtual function pointer table 
     276    Interface[] interfaces;    /// interfaces this class implements 
     277    ClassInfo base;        /// base class 
    278278    void *destructor; 
    279279    void (*classInvariant)(Object); 
    280280    uint flags; 
    281     //  1:  // is IUnknown or is derived from IUnknown 
    282     //  2:  // has no possible pointers into GC memory 
    283     //  4:  // has offTi[] member 
    284     //  8:  // has constructors 
    285     // 16:  // has xgetMembers member 
     281    // 1:          // is IUnknown or is derived from IUnknown 
     282    // 2:          // has no possible pointers into GC memory 
     283    // 4:          // has offTi[] member 
     284    // 8:          // has constructors 
     285    // 16:         // has xgetMembers member 
    286286    void *deallocator; 
    287287    OffsetTypeInfo[] offTi; 
    288     void function(Object) defaultConstructor;  // default Constructor 
     288    void function(Object) defaultConstructor;  // default Constructor 
    289289    const(MemberInfo[]) function(string) xgetMembers; 
    290290 
     
    295295    static ClassInfo find(string classname) 
    296296    { 
    297         foreach (m; ModuleInfo.modules()) 
    298        
    299             //writefln("module %s, %d", m.name, m.localClasses.length); 
    300             foreach (c; m.localClasses) 
    301             { 
    302                 //writefln("\tclass %s", c.name); 
    303                 if (c.name == classname) 
    304                     return c; 
    305             } 
    306        
    307         return null; 
     297   foreach (m; ModuleInfo.modules()) 
     298   
     299       //writefln("module %s, %d", m.name, m.localClasses.length); 
     300       foreach (c; m.localClasses) 
     301       { 
     302       //writefln("\tclass %s", c.name); 
     303       if (c.name == classname) 
     304           return c; 
     305       } 
     306   
     307   return null; 
    308308    } 
    309309 
     
    311311     * Create instance of Object represented by 'this'. 
    312312     * Returns: 
    313      *  the object created, or null if the Object does 
    314      *  does not have a default constructor 
     313     * the object created, or null if the Object does 
     314     * does not have a default constructor 
    315315     */ 
    316316    Object create() 
    317317    { 
    318         if (flags & 8 && !defaultConstructor) 
    319             return null; 
    320         Object o = _d_newclass(this); 
    321         if (flags & 8 && defaultConstructor) 
    322        
    323             defaultConstructor(o); 
    324        
    325         return o; 
     318   if (flags & 8 && !defaultConstructor) 
     319       return null; 
     320   Object o = _d_newclass(this); 
     321   if (flags & 8 && defaultConstructor) 
     322   
     323       defaultConstructor(o); 
     324   
     325   return o; 
    326326    } 
    327327 
     
    332332    const(MemberInfo[]) getMembers(string name) 
    333333    { 
    334         if (flags & 16 && xgetMembers) 
    335        
    336             return xgetMembers(name); 
    337        
    338         return null; 
     334   if (flags & 16 && xgetMembers) 
     335   
     336       return xgetMembers(name); 
     337   
     338   return null; 
    339339    } 
    340340} 
     
    350350struct OffsetTypeInfo 
    351351{ 
    352     size_t offset; /// Offset of member from start of object 
    353     TypeInfo ti;   /// TypeInfo for this member 
     352    size_t offset; /// Offset of member from start of object 
     353    TypeInfo ti;   /// TypeInfo for this member 
    354354} 
    355355 
     
    363363{ 
    364364    override hash_t toHash() 
    365     { 
    366         hash_t hash; 
    367  
    368         foreach (char c; this.toString()) 
    369             hash = hash * 9 + c; 
    370         return hash; 
     365    {   hash_t hash; 
     366 
     367    foreach (char c; this.toString()) 
     368        hash = hash * 9 + c; 
     369    return hash; 
    371370    } 
    372371 
    373372    override int opCmp(Object o) 
    374373    { 
    375         if (this is o) 
    376             return 0; 
    377         TypeInfo ti = cast(TypeInfo)o; 
    378         if (ti is null) 
    379             return 1; 
    380         return std.string.cmp(this.toString(), ti.toString()); 
    381     } 
    382  
    383     override int opEquals(Object o) 
    384     { 
    385         /* TypeInfo instances are singletons, but duplicates can exist 
    386         * across DLL's. Therefore, comparing for a name match is 
    387         * sufficient. 
    388         */ 
    389         if (this is o) 
    390             return 1; 
    391         TypeInfo ti = cast(TypeInfo)o; 
    392         return cast(int)(ti && this.toString() == ti.toString()); 
     374   if (this is o) 
     375       return 0; 
     376   TypeInfo ti = cast(TypeInfo)o; 
     377   if (ti is null) 
     378       return 1; 
     379   return std.string.cmp(this.toString(), ti.toString()); 
     380    } 
     381 
     382    override bool opEquals(Object o) 
     383    { 
     384   /* TypeInfo instances are singletons, but duplicates can exist 
     385    * across DLL's. Therefore, comparing for a name match is 
     386    * sufficient. 
     387    */ 
     388   if (this is o) 
     389       return 1; 
     390   TypeInfo ti = cast(TypeInfo)o; 
     391   return (ti && this.toString() == ti.toString()); 
    393392    } 
    394393 
     
    397396 
    398397    /// Compares two instances for equality. 
    399     int equals(in void *p1, in void *p2) { return cast(int)(p1 == p2); } 
     398    bool equals(in void *p1, in void *p2) { return (p1 == p2); } 
    400399 
    401400    /// Compares two instances for <, ==, or >. 
     
    408407    void swap(void *p1, void *p2) 
    409408    { 
    410         size_t n = tsize(); 
    411         for (size_t i = 0; i < n; i++) 
    412         {   byte t; 
    413  
    414             t = (cast(byte *)p1)[i]; 
    415             (cast(byte *)p1)[i] = (cast(byte *)p2)[i]; 
    416             (cast(byte *)p2)[i] = t; 
    417        
     409   size_t n = tsize(); 
     410   for (size_t i = 0; i < n; i++) 
     411   {   byte t; 
     412 
     413       t = (cast(byte *)p1)[i]; 
     414       (cast(byte *)p1)[i] = (cast(byte *)p2)[i]; 
     415       (cast(byte *)p2)[i] = t; 
     416   
    418417    } 
    419418 
     
    442441    override string toString() { return name; } 
    443442 
    444     override int opEquals(Object o) 
     443    override bool opEquals(Object o) 
    445444    {   TypeInfo_Typedef c; 
    446445 
    447         return cast(int) 
    448                 (this is o || 
    449                 ((c = cast(TypeInfo_Typedef)o) !is null && 
    450                  this.name == c.name && 
    451                  this.base == c.base)); 
     446    return  this is o || 
     447        ((c = cast(TypeInfo_Typedef)o) !is null && 
     448         this.name == c.name && 
     449         this.base == c.base); 
    452450    } 
    453451 
    454452    override hash_t getHash(in void *p) { return base.getHash(p); } 
    455     override int equals(in void *p1, in void *p2) { return base.equals(p1, p2); } 
     453    override bool equals(in void *p1, in void *p2) { return base.equals(p1, p2); } 
    456454    override int compare(in void *p1, in void *p2) { return base.compare(p1, p2); } 
    457455    override size_t tsize() { return base.tsize(); } 
     
    478476    override string toString() { return cast(string) (m_next.toString() ~ "*"); } 
    479477 
    480     override int opEquals(Object o) 
     478    override bool opEquals(Object o) 
    481479    {   TypeInfo_Pointer c; 
    482480 
    483         return this is o || 
    484                 ((c = cast(TypeInfo_Pointer)o) !is null && 
    485                 this.m_next == c.m_next); 
     481   return this is o || 
     482       ((c = cast(TypeInfo_Pointer)o) !is null && 
     483        this.m_next == c.m_next); 
    486484    } 
    487485 
     
    491489    } 
    492490 
    493     override int equals(in void *p1, in void *p2) 
    494     { 
    495         return cast(int)(*cast(void* *)p1 == *cast(void* *)p2); 
     491    override bool equals(in void *p1, in void *p2) 
     492    { 
     493        return (*cast(void* *)p1 == *cast(void* *)p2); 
    496494    } 
    497495 
    498496    override int compare(in void *p1, in void *p2) 
    499497    { 
    500         if (*cast(void* *)p1 < *cast(void* *)p2) 
    501             return -1; 
    502         else if (*cast(void* *)p1 > *cast(void* *)p2) 
    503             return 1; 
    504         else 
    505             return 0; 
     498   if (*cast(void* *)p1 < *cast(void* *)p2) 
     499       return -1; 
     500   else if (*cast(void* *)p1 > *cast(void* *)p2) 
     501       return 1; 
     502   else 
     503       return 0; 
    506504    } 
    507505 
    508506    override size_t tsize() 
    509507    { 
    510         return (void*).sizeof; 
     508   return (void*).sizeof; 
    511509    } 
    512510 
    513511    override void swap(void *p1, void *p2) 
    514     { 
    515         void* tmp; 
    516         tmp = *cast(void**)p1; 
    517         *cast(void**)p1 = *cast(void**)p2; 
    518         *cast(void**)p2 = tmp; 
     512    {   void* tmp; 
     513    tmp = *cast(void**)p1; 
     514    *cast(void**)p1 = *cast(void**)p2; 
     515    *cast(void**)p2 = tmp; 
    519516    } 
    520517 
     
    529526    override string toString() { return cast(string) (value.toString() ~ "[]"); } 
    530527 
    531     override int opEquals(Object o) 
     528    override bool opEquals(Object o) 
    532529    {   TypeInfo_Array c; 
    533530 
    534         return cast(int) 
    535                (this is o || 
    536                 ((c = cast(TypeInfo_Array)o) !is null && 
    537                  this.value == c.value)); 
     531    return  this is o || 
     532        ((c = cast(TypeInfo_Array)o) !is null && 
     533         this.value == c.value); 
    538534    } 
    539535 
    540536    override hash_t getHash(in void *p) 
    541     { 
    542         size_t sz = value.tsize(); 
    543         hash_t hash = 0; 
    544         void[] a = *cast(void[]*)p; 
    545         for (size_t i = 0; i < a.length; i++) 
    546             hash += value.getHash(a.ptr + i * sz); 
     537    {   size_t sz = value.tsize(); 
     538    hash_t hash = 0; 
     539    void[] a = *cast(void[]*)p; 
     540    for (size_t i = 0; i < a.length; i++) 
     541        hash += value.getHash(a.ptr + i * sz); 
    547542        return hash; 
    548543    } 
    549544 
    550     override int equals(in void *p1, in void *p2) 
    551     { 
    552         void[] a1 = *cast(void[]*)p1; 
    553         void[] a2 = *cast(void[]*)p2; 
    554         if (a1.length != a2.length) 
    555             return 0; 
    556         size_t sz = value.tsize(); 
    557         for (size_t i = 0; i < a1.length; i++) 
    558        
    559             if (!value.equals(a1.ptr + i * sz, a2.ptr + i * sz)) 
    560                 return 0; 
    561        
     545    override bool equals(in void *p1, in void *p2) 
     546    { 
     547   void[] a1 = *cast(void[]*)p1; 
     548   void[] a2 = *cast(void[]*)p2; 
     549   if (a1.length != a2.length) 
     550       return 0; 
     551   size_t sz = value.tsize(); 
     552   for (size_t i = 0; i < a1.length; i++) 
     553   
     554       if (!value.equals(a1.ptr + i * sz, a2.ptr + i * sz)) 
     555       return 0; 
     556   
    562557        return 1; 
    563558    } 
     
    565560    override int compare(in void *p1, in void *p2) 
    566561    { 
    567         void[] a1 = *cast(void[]*)p1; 
    568         void[] a2 = *cast(void[]*)p2; 
    569         size_t sz = value.tsize(); 
    570         size_t len = a1.length; 
     562   void[] a1 = *cast(void[]*)p1; 
     563   void[] a2 = *cast(void[]*)p2; 
     564   size_t sz = value.tsize(); 
     565   size_t len = a1.length; 
    571566 
    572567        if (a2.length < len) 
     
    583578    override size_t tsize() 
    584579    { 
    585         return (void[]).sizeof; 
     580   return (void[]).sizeof; 
    586581    } 
    587582 
    588583    override void swap(void *p1, void *p2) 
    589     { 
    590         void[] tmp; 
    591         tmp = *cast(void[]*)p1; 
    592         *cast(void[]*)p1 = *cast(void[]*)p2; 
    593         *cast(void[]*)p2 = tmp; 
     584    {   void[] tmp; 
     585    tmp = *cast(void[]*)p1; 
     586    *cast(void[]*)p1 = *cast(void[]*)p2; 
     587    *cast(void[]*)p2 = tmp; 
    594588    } 
    595589 
     
    598592    override TypeInfo next() 
    599593    { 
    600         return value; 
     594   return value; 
    601595    } 
    602596 
     
    608602    override string toString() 
    609603    { 
    610         return cast(string) 
     604   return cast(string) 
    611605            (value.toString() ~ "[" ~ std.string.toString(len) ~ "]"); 
    612606    } 
    613607 
    614     override int opEquals(Object o) 
     608    override bool opEquals(Object o) 
    615609    {   TypeInfo_StaticArray c; 
    616610 
    617         return cast(int) 
    618                (this is o || 
    619                 ((c = cast(TypeInfo_StaticArray)o) !is null && 
    620                  this.len == c.len && 
    621                  this.value == c.value)); 
     611    return  this is o || 
     612        ((c = cast(TypeInfo_StaticArray)o) !is null && 
     613         this.len == c.len && 
     614         this.value == c.value); 
    622615    } 
    623616 
    624617    override hash_t getHash(in void *p) 
    625     { 
    626         size_t sz = value.tsize(); 
    627         hash_t hash = 0; 
    628         for (size_t i = 0; i < len; i++) 
    629             hash += value.getHash(p + i * sz); 
     618    {   size_t sz = value.tsize(); 
     619    hash_t hash = 0; 
     620    for (size_t i = 0; i < len; i++) 
     621        hash += value.getHash(p + i * sz); 
    630622        return hash; 
    631623    } 
    632624 
    633     override int equals(in void *p1, in void *p2) 
    634     { 
    635         size_t sz = value.tsize(); 
     625    override bool equals(in void *p1, in void *p2) 
     626    { 
     627   size_t sz = value.tsize(); 
    636628 
    637629        for (size_t u = 0; u < len; u++) 
    638630        { 
    639             if (!value.equals(p1 + u * sz, p2 + u * sz)) 
    640                 return 0; 
     631       if (!value.equals(p1 + u * sz, p2 + u * sz)) 
     632       return 0; 
    641633        } 
    642634        return 1; 
     
    645637    override int compare(in void *p1, in void *p2) 
    646638    { 
    647         size_t sz = value.tsize(); 
     639   size_t sz = value.tsize(); 
    648640 
    649641        for (size_t u = 0; u < len; u++) 
     
    658650    override size_t tsize() 
    659651    { 
    660         return len * value.tsize(); 
     652   return len * value.tsize(); 
    661653    } 
    662654 
    663655    override void swap(void *p1, void *p2) 
    664     { 
    665         void* tmp; 
    666         size_t sz = value.tsize(); 
    667         ubyte[16] buffer; 
    668         void* pbuffer; 
    669  
    670         if (sz < buffer.sizeof) 
    671             tmp = buffer.ptr; 
    672         else 
    673             tmp = pbuffer = (new void[sz]).ptr; 
    674  
    675         for (size_t u = 0; u < len; u += sz) 
    676         {   size_t o = u * sz; 
    677             memcpy(tmp, p1 + o, sz); 
    678             memcpy(p1 + o, p2 + o, sz); 
    679             memcpy(p2 + o, tmp, sz); 
    680         } 
    681         if (pbuffer) 
    682             delete pbuffer; 
     656    {   void* tmp; 
     657    size_t sz = value.tsize(); 
     658    ubyte[16] buffer; 
     659    void* pbuffer; 
     660 
     661    if (sz < buffer.sizeof) 
     662        tmp = buffer.ptr; 
     663    else 
     664        tmp = pbuffer = (new void[sz]).ptr; 
     665 
     666    for (size_t u = 0; u < len; u += sz) 
     667    {   size_t o = u * sz; 
     668        memcpy(tmp, p1 + o, sz); 
     669        memcpy(p1 + o, p2 + o, sz); 
     670        memcpy(p2 + o, tmp, sz); 
     671    } 
     672    if (pbuffer) 
     673        delete pbuffer; 
    683674    } 
    684675 
     
    689680    override void destroy(void *p) 
    690681    { 
    691         auto sz = value.tsize(); 
    692         p += sz * len; 
    693         foreach (i; 0 .. len) 
    694        
    695             p -= sz; 
    696             value.destroy(p); 
    697        
     682   auto sz = value.tsize(); 
     683   p += sz * len; 
     684   foreach (i; 0 .. len) 
     685   
     686       p -= sz; 
     687       value.destroy(p); 
     688   
    698689    } 
    699690 
    700691    override void postblit(void *p) 
    701692    { 
    702         auto sz = value.tsize(); 
    703         foreach (i; 0 .. len) 
    704        
    705             value.postblit(p); 
    706             p += sz; 
    707        
     693   auto sz = value.tsize(); 
     694   foreach (i; 0 .. len) 
     695   
     696       value.postblit(p); 
     697       p += sz; 
     698   
    708699    } 
    709700 
     
    716707    override string toString() 
    717708    { 
    718         return cast(string) (value.toString() ~ "[" ~ key.toString() ~ "]"); 
    719     } 
    720  
    721     override int opEquals(Object o) 
     709   return cast(string) (value.toString() ~ "[" ~ key.toString() ~ "]"); 
     710    } 
     711 
     712    override bool opEquals(Object o) 
    722713    {   TypeInfo_AssociativeArray c; 
    723714 
    724         return this is o || 
    725                 ((c = cast(TypeInfo_AssociativeArray)o) !is null && 
    726                 this.key == c.key && 
    727                 this.value == c.value); 
     715   return this is o || 
     716       ((c = cast(TypeInfo_AssociativeArray)o) !is null && 
     717        this.key == c.key && 
     718        this.value == c.value); 
    728719    } 
    729720 
     
    732723    override size_t tsize() 
    733724    { 
    734         return (char[int]).sizeof; 
     725   return (char[int]).sizeof; 
    735726    } 
    736727 
     
    746737    override string toString() 
    747738    { 
    748         return cast(string) (next.toString() ~ "()"); 
    749     } 
    750  
    751     override int opEquals(Object o) 
     739   return cast(string) (next.toString() ~ "()"); 
     740    } 
     741 
     742    override bool opEquals(Object o) 
    752743    {   TypeInfo_Function c; 
    753744 
    754         return this is o || 
    755                 ((c = cast(TypeInfo_Function)o) !is null && 
    756                 this.next == c.next); 
     745   return this is o || 
     746       ((c = cast(TypeInfo_Function)o) !is null && 
     747        this.next == c.next); 
    757748    } 
    758749 
     
    761752    override size_t tsize() 
    762753    { 
    763         return 0;   // no size for functions 
    764     } 
    765  
    766     TypeInfo next;  // function return type 
     754   return 0;   // no size for functions 
     755    } 
     756 
     757    TypeInfo next; // function return type 
    767758} 
    768759 
     
    771762    override string toString() 
    772763    { 
    773         return cast(string) (next.toString() ~ " delegate()"); 
    774     } 
    775  
    776     override int opEquals(Object o) 
     764   return cast(string) (next.toString() ~ " delegate()"); 
     765    } 
     766 
     767    override bool opEquals(Object o) 
    777768    {   TypeInfo_Delegate c; 
    778769 
    779         return this is o || 
    780                 ((c = cast(TypeInfo_Delegate)o) !is null && 
    781                 this.next == c.next); 
     770   return this is o || 
     771       ((c = cast(TypeInfo_Delegate)o) !is null && 
     772        this.next == c.next); 
    782773    } 
    783774 
     
    785776 
    786777    override size_t tsize() 
    787     { 
    788         alias int delegate() dg; 
    789         return dg.sizeof; 
     778    {   alias int delegate() dg; 
     779    return dg.sizeof; 
    790780    } 
    791781 
    792782    override uint flags() { return 1; } 
    793783 
    794     TypeInfo next;  // delegate return type 
     784    TypeInfo next; // delegate return type 
    795785} 
    796786 
     
    799789    override string toString() { return info.name; } 
    800790 
    801     override int opEquals(Object o) 
     791    override bool opEquals(Object o) 
    802792    {   TypeInfo_Class c; 
    803793 
    804         return this is o || 
    805                 ((c = cast(TypeInfo_Class)o) !is null && 
    806                 this.info.name == c.classinfo.name); 
     794   return this is o || 
     795       ((c = cast(TypeInfo_Class)o) !is null && 
     796        this.info.name == c.classinfo.name); 
    807797    } 
    808798 
    809799    override hash_t getHash(in void *p) 
    810800    { 
    811         Object o = *cast(Object*)p; 
    812         return o ? o.toHash() : 0; 
    813     } 
    814  
    815     override int equals(in void *p1, in void *p2) 
    816     { 
    817         Object o1 = *cast(Object*)p1; 
    818         Object o2 = *cast(Object*)p2; 
    819  
    820         return (o1 is o2) || (o1 && o1.opEquals(o2)); 
     801   Object o = *cast(Object*)p; 
     802   return o ? o.toHash() : 0; 
     803    } 
     804 
     805    override bool equals(in void *p1, in void *p2) 
     806    { 
     807   Object o1 = *cast(Object*)p1; 
     808   Object o2 = *cast(Object*)p2; 
     809 
     810   return (o1 is o2) || (o1 && o1.opEquals(o2)); 
    821811    } 
    822812 
    823813    override int compare(in void *p1, in void *p2) 
    824814    { 
    825         Object o1 = *cast(Object*)p1; 
    826         Object o2 = *cast(Object*)p2; 
    827         int c = 0; 
    828  
    829         // Regard null references as always being "less than" 
    830         if (o1 !is o2) 
    831         { 
    832             if (o1) 
    833             { 
    834                 if (!o2) 
    835                     c = 1; 
    836                 else 
    837                     c = o1.opCmp(o2); 
    838             } 
    839             else 
    840                 c = -1; 
    841         } 
    842         return c; 
     815    Object o1 = *cast(Object*)p1; 
     816    Object o2 = *cast(Object*)p2; 
     817    int c = 0; 
     818 
     819    // Regard null references as always being "less than" 
     820    if (o1 !is o2) 
     821    { 
     822        if (o1) 
     823        {   if (!o2) 
     824            c = 1; 
     825        else 
     826            c = o1.opCmp(o2); 
     827        } 
     828        else 
     829        c = -1; 
     830    } 
     831    return c; 
    843832    } 
    844833 
    845834    override size_t tsize() 
    846835    { 
    847         return Object.sizeof; 
     836   return Object.sizeof; 
    848837    } 
    849838 
     
    852841    override OffsetTypeInfo[] offTi() 
    853842    { 
    854         return (info.flags & 4) ? info.offTi : null; 
     843   return (info.flags & 4) ? info.offTi : null; 
    855844    } 
    856845 
     
    862851    override string toString() { return info.name; } 
    863852 
    864     override int opEquals(Object o) 
     853    override bool opEquals(Object o) 
    865854    {   TypeInfo_Interface c; 
    866855 
    867         return this is o || 
    868                 ((c = cast(TypeInfo_Interface)o) !is null && 
    869                 this.info.name == c.classinfo.name); 
     856   return this is o || 
     857       ((c = cast(TypeInfo_Interface)o) !is null && 
     858        this.info.name == c.classinfo.name); 
    870859    } 
    871860 
    872861    override hash_t getHash(in void *p) 
    873862    { 
    874         Interface* pi = **cast