/runtime/typeinfo/ti_double.d

http://github.com/wilkie/djehuty · D · 68 lines · 47 code · 14 blank · 7 comment · 6 complexity · e89cfa593e0fe3ed904e6528f78b7bfc MD5 · raw file

  1. /*
  2. * ti_double.d
  3. *
  4. * This module implements the TypeInfo for the double type.
  5. *
  6. */
  7. module runtime.typeinfo.ti_double;
  8. import runtime.util;
  9. class TypeInfo_d : TypeInfo {
  10. char[] toString() {
  11. return "double";
  12. }
  13. hash_t getHash(void *p) {
  14. return (cast(uint *)p)[0] + (cast(uint *)p)[1];
  15. }
  16. int equals(void *p1, void *p2) {
  17. return _equals(*cast(double *)p1, *cast(double *)p2);
  18. }
  19. int compare(void *p1, void *p2)
  20. {
  21. return _compare(*cast(double *)p1, *cast(double *)p2);
  22. }
  23. size_t tsize() {
  24. return double.sizeof;
  25. }
  26. void swap(void *p1, void *p2) {
  27. double t;
  28. t = *cast(double *)p1;
  29. *cast(double *)p1 = *cast(double *)p2;
  30. *cast(double *)p2 = t;
  31. }
  32. void[] init() {
  33. static double r;
  34. return (cast(double *)&r)[0 .. 1];
  35. }
  36. package:
  37. static int _equals(double f1, double f2) {
  38. return f1 == f2 ||
  39. (isnan(f1) && isnan(f2));
  40. }
  41. static int _compare(double d1, double d2) {
  42. // if either are NaN
  43. if (d1 !<>= d2) {
  44. if (isnan(d1)) {
  45. if (isnan(d2)) {
  46. return 0;
  47. }
  48. return -1;
  49. }
  50. return 1;
  51. }
  52. return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1);
  53. }
  54. }