Changeset 758
- Timestamp:
- 06/24/08 21:33:15 (16 years ago)
- Files:
-
- trunk/phobos/internal/object.d (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/phobos/internal/object.d
r664 r758 355 355 356 356 357 357 /** 358 358 * Runtime type information about a type. 359 359 * Can be retrieved for any type using a 360 360 * <a href="../expression.html#typeidexpression">TypeidExpression</a>. 361 361 */ 362 362 class TypeInfo 363 363 { 364 364 override hash_t toHash() 365 { hash_t hash; 366 367 foreach (char c; this.toString()) 368 hash = hash * 9 + c; 369 return hash; 365 { 366 hash_t hash; 367 368 foreach (char c; this.toString()) 369 hash = hash * 9 + c; 370 return hash; 370 371 } 371 372 372 373 override int opCmp(Object o) 373 374 { 374 375 if (this is o) 375 376 return 0; 376 377 TypeInfo ti = cast(TypeInfo)o; 377 378 if (ti is null) 378 379 return 1; 379 380 return std.string.cmp(this.toString(), ti.toString()); … … 503 504 else 504 505 return 0; 505 506 } 506 507 507 508 override size_t tsize() 508 509 { 509 510 return (void*).sizeof; 510 511 } 511 512 512 513 override void swap(void *p1, void *p2) 513 { void* tmp; 514 tmp = *cast(void**)p1; 515 *cast(void**)p1 = *cast(void**)p2; 516 *cast(void**)p2 = tmp; 514 { 515 void* tmp; 516 tmp = *cast(void**)p1; 517 *cast(void**)p1 = *cast(void**)p2; 518 *cast(void**)p2 = tmp; 517 519 } 518 520 519 521 override TypeInfo next() { return m_next; } 520 522 override uint flags() { return 1; } 521 523 522 524 TypeInfo m_next; 523 525 } 524 526 525 527 class TypeInfo_Array : TypeInfo 526 528 { … … 529 531 override int opEquals(Object o) 530 532 { TypeInfo_Array c; 531 533 532 534 return cast(int) 533 535 (this is o || 534 536 ((c = cast(TypeInfo_Array)o) !is null && 535 537 this.value == c.value)); 536 538 } 537 539 538 540 override hash_t getHash(in void *p) 539 { size_t sz = value.tsize(); 540 hash_t hash = 0; 541 void[] a = *cast(void[]*)p; 542 for (size_t i = 0; i < a.length; i++) 543 hash += value.getHash(a.ptr + i * sz); 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); 544 547 return hash; 545 548 } 546 549 547 550 override int equals(in void *p1, in void *p2) 548 551 { 549 552 void[] a1 = *cast(void[]*)p1; 550 553 void[] a2 = *cast(void[]*)p2; 551 554 if (a1.length != a2.length) 552 555 return 0; 553 556 size_t sz = value.tsize(); … … 576 579 } 577 580 return cast(int)a1.length - cast(int)a2.length; 578 581 } 579 582 580 583 override size_t tsize() 581 584 { 582 585 return (void[]).sizeof; 583 586 } 584 587 585 588 override void swap(void *p1, void *p2) 586 { void[] tmp; 587 tmp = *cast(void[]*)p1; 588 *cast(void[]*)p1 = *cast(void[]*)p2; 589 *cast(void[]*)p2 = tmp; 589 { 590 void[] tmp; 591 tmp = *cast(void[]*)p1; 592 *cast(void[]*)p1 = *cast(void[]*)p2; 593 *cast(void[]*)p2 = tmp; 590 594 } 591 595 592 596 TypeInfo value; 593 597 594 598 override TypeInfo next() 595 599 { 596 600 return value; 597 601 } 598 602 599 603 override uint flags() { return 1; } … … 611 615 { TypeInfo_StaticArray c; 612 616 613 617 return cast(int) 614 618 (this is o || 615 619 ((c = cast(TypeInfo_StaticArray)o) !is null && 616 620 this.len == c.len && 617 621 this.value == c.value)); 618 622 } 619 623 620 624 override hash_t getHash(in void *p) 621 { size_t sz = value.tsize(); 622 hash_t hash = 0; 623 for (size_t i = 0; i < len; i++) 624 hash += value.getHash(p + i * sz); 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); 625 630 return hash; 626 631 } 627 632 628 633 override int equals(in void *p1, in void *p2) 629 634 { 630 635 size_t sz = value.tsize(); 631 636 632 637 for (size_t u = 0; u < len; u++) 633 638 { 634 639 if (!value.equals(p1 + u * sz, p2 + u * sz)) … … 649 654 } 650 655 return 0; 651 656 } 652 657 653 658 override size_t tsize() 654 659 { 655 660 return len * value.tsize(); 656 661 } 657 662 658 663 override void swap(void *p1, void *p2) 659 { void* tmp; 660 size_t sz = value.tsize(); 661 ubyte[16] buffer; 662 void* pbuffer; 663 664 if (sz < buffer.sizeof) 665 tmp = buffer.ptr; 666 else 667 tmp = pbuffer = (new void[sz]).ptr; 668 669 for (size_t u = 0; u < len; u += sz) 670 { size_t o = u * sz; 671 memcpy(tmp, p1 + o, sz); 672 memcpy(p1 + o, p2 + o, sz); 673 memcpy(p2 + o, tmp, sz); 674 } 675 if (pbuffer) 676 delete pbuffer; 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; 677 683 } 678 684 679 685 override void[] init() { return value.init(); } 680 686 override TypeInfo next() { return value; } 681 687 override uint flags() { return value.flags(); } 682 688 683 689 override void destroy(void *p) 684 690 { 685 691 auto sz = value.tsize(); 686 692 p += sz * len; … … 771 777 { TypeInfo_Delegate c; 772 778 773 779 return this is o || 774 780 ((c = cast(TypeInfo_Delegate)o) !is null && 775 781 this.next == c.next); 776 782 } 777 783 778 784 // BUG: need to add the rest of the functions 779 785 780 786 override size_t tsize() 781 { alias int delegate() dg; 782 return dg.sizeof; 787 { 788 alias int delegate() dg; 789 return dg.sizeof; 783 790 } 784 791 785 792 override uint flags() { return 1; } 786 793 787 794 TypeInfo next; // delegate return type 788 795 } 789 796 790 797 class TypeInfo_Class : TypeInfo 791 798 { 792 799 override string toString() { return info.name; } … … 808 815 override int equals(in void *p1, in void *p2) 809 816 { 810 817 Object o1 = *cast(Object*)p1; 811 818 Object o2 = *cast(Object*)p2; 812 819 813 820 return (o1 is o2) || (o1 && o1.opEquals(o2)); 814 821 } 815 822 816 823 override int compare(in void *p1, in void *p2) 817 824 { 818 Object o1 = *cast(Object*)p1; 819 Object o2 = *cast(Object*)p2; 820 int c = 0; 821 822 // Regard null references as always being "less than" 823 if (o1 !is o2) 824 { 825 if (o1) 826 { if (!o2) 827 c = 1; 828 else 829 c = o1.opCmp(o2); 830 } 831 else 832 c = -1; 833 } 834 return c; 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; 835 843 } 836 844 837 845 override size_t tsize() 838 846 { 839 847 return Object.sizeof; 840 848 } 841 849 842 850 override uint flags() { return 1; } 843 851 844 852 override OffsetTypeInfo[] offTi() … … 874 882 Interface* pi = **cast(Interface ***)*cast(void**)p1; 875 883 Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); 876 884 pi = **cast(Interface ***)*cast(void**)p2; 877 885 Object o2 = cast(Object)(*cast(void**)p2 - pi.offset); 878 886 879 887 return o1 == o2 || (o1 && o1.opCmp(o2) == 0); 880 888 } 881 889 882 890 override int compare(in void *p1, in void *p2) 883 891 { 884 Interface* pi = **cast(Interface ***)*cast(void**)p1; 885 Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); 886 pi = **cast(Interface ***)*cast(void**)p2; 887 Object o2 = cast(Object)(*cast(void**)p2 - pi.offset); 888 int c = 0; 889 890 // Regard null references as always being "less than" 891 if (o1 != o2) 892 { 893 if (o1) 894 { if (!o2) 895 c = 1; 896 else 897 c = o1.opCmp(o2); 898 } 899 else 900 c = -1; 901 } 902 return c; 892 Interface* pi = **cast(Interface ***)*cast(void**)p1; 893 Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); 894 pi = **cast(Interface ***)*cast(void**)p2; 895 Object o2 = cast(Object)(*cast(void**)p2 - pi.offset); 896 int c = 0; 897 898 // Regard null references as always being "less than" 899 if (o1 != o2) 900 { 901 if (o1) 902 { 903 if (!o2) 904 c = 1; 905 else 906 c = o1.opCmp(o2); 907 } 908 else 909 c = -1; 910 } 911 return c; 903 912 } 904 913 905 914 override size_t tsize() 906 915 { 907 916 return Object.sizeof; 908 917 } 909 918 910 919 override uint flags() { return 1; } 911 920 912 921 ClassInfo info; … … 919 928 override int opEquals(Object o) 920 929 { TypeInfo_Struct s; 921 930 922 931 return this is o || 923 932 ((s = cast(TypeInfo_Struct)o) !is null && 924 933 this.name == s.name && 925 934 this.init.length == s.init.length); 926 935 } 927 936 928 937 override hash_t getHash(in void *p) 929 { hash_t h; 930 931 assert(p); 932 if (xtoHash) 933 { //printf("getHash() using xtoHash\n"); 934 h = (*xtoHash)(p); 935 } 936 else 937 { 938 //printf("getHash() using default hash\n"); 939 // A sorry hash algorithm. 940 // Should use the one for strings. 941 // BUG: relies on the GC not moving objects 942 auto q = cast(const(ubyte)*)p; 943 for (size_t i = 0; i < init.length; i++) 944 { h = h * 9 + *q; 945 q++; 946 } 947 } 948 return h; 938 { 939 hash_t h; 940 941 assert(p); 942 if (xtoHash) 943 { //printf("getHash() using xtoHash\n"); 944 h = (*xtoHash)(p); 945 } 946 else 947 { 948 //printf("getHash() using default hash\n"); 949 // A sorry hash algorithm. 950 // Should use the one for strings. 951 // BUG: relies on the GC not moving objects 952 auto q = cast(const(ubyte)*)p; 953 for (size_t i = 0; i < init.length; i++) 954 { 955 h = h * 9 + *q; 956 q++; 957 } 958 } 959 return h; 949 960 } 950 961 951 962 override int equals(in void *p2, in void *p1) 952 { int c; 953 954 if (p1 == p2) 955 c = 1; 956 else if (!p1 || !p2) 957 c = 0; 958 else if (xopEquals) 959 c = (*xopEquals)(p1, p2); 960 else 961 // BUG: relies on the GC not moving objects 962 c = (memcmp(p1, p2, init.length) == 0); 963 return c; 963 { 964 int c; 965 966 if (p1 == p2) 967 c = 1; 968 else if (!p1 || !p2) 969 c = 0; 970 else if (xopEquals) 971 c = (*xopEquals)(p1, p2); 972 else 973 // BUG: relies on the GC not moving objects 974 c = (memcmp(p1, p2, init.length) == 0); 975 return c; 964 976 } 965 977 966 978 override int compare(in void *p2, in void *p1) 967 979 { 968 int c = 0; 969 970 // Regard null references as always being "less than" 971 if (p1 != p2) 972 { 973 if (p1) 974 { if (!p2) 975 c = 1; 976 else if (xopCmp) 977 c = (*xopCmp)(p1, p2); 978 else 979 // BUG: relies on the GC not moving objects 980 c = memcmp(p1, p2, init.length); 981 } 982 else 983 c = -1; 984 } 985 return c; 980 int c = 0; 981 982 // Regard null references as always being "less than" 983 if (p1 != p2) 984 { 985 if (p1) 986 { 987 if (!p2) 988 c = 1; 989 else if (xopCmp) 990 c = (*xopCmp)(p1, p2); 991 else 992 // BUG: relies on the GC not moving objects 993 c = memcmp(p1, p2, init.length); 994 } 995 else 996 c = -1; 997 } 998 return c; 986 999 } 987 1000 988 1001 override size_t tsize() 989 1002 { 990 1003 return init.length; 991 1004 } 992 1005 993 1006 override void[] init() { return m_init; } 994 1007 995 1008 override uint flags() { return m_flags; }
