/runtime/typeinfo/ti_staticarray.d

http://github.com/wilkie/djehuty · D · 96 lines · 71 code · 19 blank · 6 comment · 10 complexity · 9335e4c51e5888bbec16bf8b8d361ea1 MD5 · raw file

  1. /*
  2. * ti_staticarray.d
  3. *
  4. * This module implements the TypeInfo for static arrays.
  5. *
  6. */
  7. module runtime.typeinfo.ti_staticarray;
  8. class TypeInfo_StaticArray : TypeInfo {
  9. char[] toString() {
  10. char[20] buf;
  11. return value.toString() ~ "[" ~ itoa(buf, 'd', len) ~ "]";
  12. }
  13. int opEquals(Object o) {
  14. TypeInfo_StaticArray c;
  15. return cast(int)
  16. (this is o ||
  17. ((c = cast(TypeInfo_StaticArray)o) !is null &&
  18. this.len == c.len &&
  19. this.value == c.value));
  20. }
  21. hash_t getHash(void *p) {
  22. size_t sz = value.tsize();
  23. hash_t hash = 0;
  24. for (size_t i = 0; i < len; i++)
  25. hash += value.getHash(p + i * sz);
  26. return hash;
  27. }
  28. int equals(void *p1, void *p2) {
  29. size_t sz = value.tsize();
  30. for (size_t u = 0; u < len; u++) {
  31. if (!value.equals(p1 + u * sz, p2 + u * sz))
  32. return 0;
  33. }
  34. return 1;
  35. }
  36. int compare(void *p1, void *p2) {
  37. size_t sz = value.tsize();
  38. for (size_t u = 0; u < len; u++) {
  39. int result = value.compare(p1 + u * sz, p2 + u * sz);
  40. if (result)
  41. return result;
  42. }
  43. return 0;
  44. }
  45. size_t tsize() {
  46. return len * value.tsize();
  47. }
  48. void swap(void *p1, void *p2) {
  49. void* tmp;
  50. size_t sz = value.tsize();
  51. ubyte[16] buffer;
  52. void* pbuffer;
  53. if (sz < buffer.sizeof)
  54. tmp = buffer.ptr;
  55. else
  56. tmp = pbuffer = (new void[sz]).ptr;
  57. for (size_t u = 0; u < len; u += sz) {
  58. size_t o = u * sz;
  59. tmp[0 .. sz] = (p1 + o)[0 .. sz];
  60. (p1 + o)[0 .. sz] = (p2 + o)[0 .. sz];
  61. (p2 + o)[0 .. sz] = tmp[0 .. sz];
  62. }
  63. if (pbuffer)
  64. delete pbuffer;
  65. }
  66. void[] init() {
  67. return value.init();
  68. }
  69. TypeInfo next() {
  70. return value;
  71. }
  72. uint flags() {
  73. return value.flags();
  74. }
  75. TypeInfo value;
  76. size_t len;
  77. }