Guest User

Untitled

a guest
Nov 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.09 KB | None | 0 0
  1. #include <type_traits>
  2. #include <array>
  3.  
  4. namespace spy
  5. {
  6. template<int M, int N, int P> struct version
  7. {
  8. constexpr operator int() const { return P + 1000*(N + 1000*M); }
  9. };
  10.  
  11. namespace detail
  12. {
  13. template<char... c> constexpr int find(int i0)
  14. {
  15. char arr[] = {c...};
  16. while(i0<sizeof...(c) && arr[i0] != '\'') { ++i0; }
  17. return i0;
  18. }
  19.  
  20. template<char... c> constexpr int parse(int i0, int i1)
  21. {
  22. char arr[] = {c...};
  23. int value = 0;
  24.  
  25. while(i0<i1 && arr[i0] != '\'')
  26. value = value*10 + (arr[i0++] - 48);
  27.  
  28. return value;
  29. }
  30. }
  31.  
  32. namespace literal
  33. {
  34. template<char ...c> constexpr auto operator"" _version()
  35. {
  36. using detail::parse;
  37. using detail::find;
  38.  
  39. constexpr int e0 = find<c...>(0);
  40. constexpr int b1 = e0 + 1, e1 = find<c...>(b1);
  41. constexpr int b2 = e1+1 , e2 = sizeof...(c);
  42.  
  43. return version<parse<c...>(0,e0)
  44. ,parse<c...>(b1,e1)
  45. ,parse<c...>(b2,e2)
  46. >{};
  47. }
  48. }
  49. }
  50.  
  51. using namespace spy::literal;
  52.  
  53. int x = 0'0'7_version;
Add Comment
Please, Sign In to add comment