/runtime/typeinfo/ti_array_object.d

http://github.com/wilkie/djehuty · D · 96 lines · 74 code · 14 blank · 8 comment · 18 complexity · b565be09812962397c3c3ff86695ef2b MD5 · raw file

  1. /*
  2. * ti_array_object.d
  3. *
  4. * This module implements the TypeInfo for Object[]
  5. *
  6. */
  7. module runtime.typeinfo.ti_array_object;
  8. class TypeInfo_AC : TypeInfo {
  9. hash_t getHash(void *p) {
  10. Object[] s = *cast(Object[]*)p;
  11. hash_t hash = 0;
  12. foreach (Object o; s) {
  13. if (o) {
  14. hash += o.toHash();
  15. }
  16. }
  17. return hash;
  18. }
  19. int equals(void *p1, void *p2) {
  20. Object[] s1 = *cast(Object[]*)p1;
  21. Object[] s2 = *cast(Object[]*)p2;
  22. if (s1.length == s2.length) {
  23. for (size_t u = 0; u < s1.length; u++) {
  24. Object o1 = s1[u];
  25. Object o2 = s2[u];
  26. // Do not pass null's to Object.opEquals()
  27. if (o1 is o2 || (!(o1 is null) && !(o2 is null) && o1.opEquals(o2))) {
  28. continue;
  29. }
  30. return 0;
  31. }
  32. return 1;
  33. }
  34. return 0;
  35. }
  36. int compare(void *p1, void *p2) {
  37. Object[] s1 = *cast(Object[]*)p1;
  38. Object[] s2 = *cast(Object[]*)p2;
  39. ptrdiff_t c;
  40. c = cast(ptrdiff_t)s1.length - cast(ptrdiff_t)s2.length;
  41. if (c == 0) {
  42. for (size_t u = 0; u < s1.length; u++) {
  43. Object o1 = s1[u];
  44. Object o2 = s2[u];
  45. if (o1 is o2) {
  46. continue;
  47. }
  48. // Regard null references as always being "less than"
  49. if (o1) {
  50. if (!o2) {
  51. c = 1;
  52. break;
  53. }
  54. c = o1.opCmp(o2);
  55. if (c) {
  56. break;
  57. }
  58. }
  59. else {
  60. c = -1;
  61. break;
  62. }
  63. }
  64. }
  65. if (c < 0) {
  66. c = -1;
  67. }
  68. else if (c > 0) {
  69. c = 1;
  70. }
  71. return c;
  72. }
  73. size_t tsize() {
  74. return (Object[]).sizeof;
  75. }
  76. uint flags() {
  77. return 1;
  78. }
  79. TypeInfo next() {
  80. return typeid(Object);
  81. }
  82. }