1 2 module rt.compiler.gdc.typeinfo.ti_Ag; 3 4 private import rt.compiler.util.string; 5 private import rt.compiler.util.hash; 6 private import tango.stdc.string : memcmp; 7 8 // byte[] 9 10 class TypeInfo_Ag : TypeInfo_Array 11 { 12 override char[] toString() { return "byte[]"; } 13 14 override hash_t getHash(in void* p) { 15 byte[] s = *cast(byte[]*)p; 16 size_t len = s.length; 17 byte *str = s.ptr; 18 return rt_hash_str(str,len*byte.sizeof,0); 19 } 20 21 override equals_t equals(in void* p1, in void* p2) 22 { 23 byte[] s1 = *cast(byte[]*)p1; 24 byte[] s2 = *cast(byte[]*)p2; 25 26 return s1.length == s2.length && 27 memcmp(cast(byte *)s1, cast(byte *)s2, s1.length) == 0; 28 } 29 30 override int compare(in void* p1, in void* p2) 31 { 32 byte[] s1 = *cast(byte[]*)p1; 33 byte[] s2 = *cast(byte[]*)p2; 34 size_t len = s1.length; 35 36 if (s2.length < len) 37 len = s2.length; 38 for (size_t u = 0; u < len; u++) 39 { 40 int result = s1[u] - s2[u]; 41 if (result) 42 return result; 43 } 44 if (s1.length < s2.length) 45 return -1; 46 else if (s1.length > s2.length) 47 return 1; 48 return 0; 49 } 50 51 override size_t talign() 52 { 53 return (byte[]).alignof; 54 } 55 56 override size_t tsize() 57 { 58 return (byte[]).sizeof; 59 } 60 61 override uint flags() 62 { 63 return 1; 64 } 65 66 override TypeInfo next() 67 { 68 return typeid(byte); 69 } 70 } 71 72 73 // ubyte[] 74 75 class TypeInfo_Ah : TypeInfo_Ag 76 { 77 override char[] toString() { return "ubyte[]"; } 78 79 override int compare(in void* p1, in void* p2) 80 { 81 char[] s1 = *cast(char[]*)p1; 82 char[] s2 = *cast(char[]*)p2; 83 84 return stringCompare(s1, s2); 85 } 86 87 override TypeInfo next() 88 { 89 return typeid(ubyte); 90 } 91 } 92 93 // void[] 94 95 class TypeInfo_Av : TypeInfo_Ah 96 { 97 override char[] toString() { return "void[]"; } 98 99 override TypeInfo next() 100 { 101 return typeid(void); 102 } 103 } 104 105 // bool[] 106 107 class TypeInfo_Ab : TypeInfo_Ah 108 { 109 override char[] toString() { return "bool[]"; } 110 111 override TypeInfo next() 112 { 113 return typeid(bool); 114 } 115 } 116 117 // char[] 118 119 class TypeInfo_Aa : TypeInfo_Ag 120 { 121 override char[] toString() { return "char[]"; } 122 123 override hash_t getHash(in void* p){ 124 char[] s = *cast(char[]*)p; 125 version (OldHash) 126 { 127 hash_t hash = 0; 128 foreach (char c; s) 129 hash = hash * 11 + c; 130 return hash; 131 } else { 132 //return rt_hash_utf8(s,0); // this would be encoding independent 133 return rt_hash_str(s.ptr,s.length,0); 134 } 135 } 136 137 override TypeInfo next() 138 { 139 return typeid(char); 140 } 141 142 version (X86_64) override int argTypes(out TypeInfo arg1, out TypeInfo arg2) 143 { 144 return 0; 145 } 146 }