Guest User

Untitled

a guest
Nov 17th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.84 KB | None | 0 0
  1. namespace private_TODO
  2. {
  3. CONSTEXPR bool is_digit(char c)
  4. {
  5. return c <= '9' && c >= '0';
  6. }
  7.  
  8. CONSTEXPR unsigned stoi_impl(const char* str, int rec = 0, int value = 0)
  9. {
  10. return rec != 0 ?
  11. is_digit(*str) ?
  12. stoi_impl(str + 1, rec--, (*str - '0') + value * 10)
  13. : throw "Compile-time-error: not a digit"
  14. : value;
  15. }
  16.  
  17. CONSTEXPR unsigned stoi(const char* str, int maxIter)
  18. {
  19. return stoi_impl(str, maxIter);
  20. }
  21.  
  22. CONSTEXPR unsigned year(const char* str)
  23. {
  24. return stoi(str, 4);
  25. }
  26.  
  27. CONSTEXPR bool str_cmp(const char* str, const char* str2, unsigned sz)
  28. {
  29. return sz != 0 ?
  30. *str == *str2 ? str_cmp(str + 1, str2 + 1, sz--)
  31. : false
  32. : true;
  33. }
  34.  
  35. CONSTEXPR unsigned month(const char* str)
  36. {
  37. return str_cmp(str, "Jan", 3) ? 1 :
  38. str_cmp(str, "Feb", 3) ? 2 :
  39. str_cmp(str, "Mar", 3) ? 3 :
  40. str_cmp(str, "Apr", 3) ? 4 :
  41. str_cmp(str, "May", 3) ? 5 :
  42. str_cmp(str, "Jun", 3) ? 6 :
  43. str_cmp(str, "Jul", 3) ? 7 :
  44. str_cmp(str, "Aug", 3) ? 8 :
  45. str_cmp(str, "Set", 3) ? 9 :
  46. str_cmp(str, "Oct", 3) ? 10 :
  47. str_cmp(str, "Nov", 3) ? 11 :
  48. str_cmp(str, "Dec", 3) ? 12 :
  49. throw "Compile-time error: Not a month!";
  50. }
  51.  
  52. CONSTEXPR unsigned day(const char* str)
  53. {
  54. return stoi(str, 2);
  55. }
  56.  
  57. CONSTEXPR unsigned str_size(const char* str, unsigned value = 0)
  58. {
  59. return *str != 0 ?
  60. str_size(str++, value++)
  61. : value;
  62. }
  63.  
  64. CONSTEXPR unsigned total(const char* str)
  65. {
  66. return (str_size(str) == 11 && str[3] == ' ' && str[6] == ' ') ?
  67. year(str + 7) * 512 + month(str) * 32 + day(str + 4)
  68. : throw "invalid string";
  69. }
  70. }
  71.  
  72. #define TODO(DATE, MESSAGE)
  73. static_assert(::private_TODO::total(__DATE__) < ::private_TODO::total(DATE), MESSAGE)
  74. void test()
  75. {
  76. TODO("NOV 16 2017", "THIS SHOULD THROW"); //11/16/17 is when I tested
  77. }
Add Comment
Please, Sign In to add comment