Advertisement
Guest User

Untitled

a guest
Nov 14th, 2012
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. template<typename NumberT, typename Tag = void>
  2.   class strong_number {
  3.     private:
  4.       static constexpr bool is_integral = std::is_integral<NumberT>::value;
  5.     public:
  6.       static strong_number convert(NumberT num) {
  7.         return { num };
  8.       }
  9.      
  10.       strong_number(strong_number const&) = default;
  11.       strong_number(strong_number&&) = default;
  12.  
  13.       strong_number& operator=(strong_number const&) = default;
  14.       strong_number& operator=(strong_number&&) = default;
  15.  
  16.       NumberT value() { return val; }
  17.  
  18.       template<typename OtherNumberT>
  19.       explicit operator strong_number<OtherNumberT, Tag>() {
  20.         return { val };
  21.       }
  22.  
  23.       template<typename OtherNumberT, typename OtherTag = Tag>
  24.       strong_number<OtherNumberT, OtherTag> convert() {
  25.         return { static_cast<OtherNumberT>(val) };
  26.       }
  27.  
  28.       bool operator!() { return val; }
  29.       bool operator&&(strong_number const& other) { return val && other.val; }
  30.       bool operator||(strong_number const& other) { return val || other.val; }
  31.  
  32.       #define gen_unary_op(op, arg, cond) \
  33.       typename std::enable_if<cond, strong_number>::type\
  34.       operator op(arg) { return { op val }; }
  35.         gen_unary_op(+,     , true)
  36.         gen_unary_op(-,     , true)
  37.         gen_unary_op(~,     , is_integral)
  38.         gen_unary_op(++,    , is_integral)
  39.         gen_unary_op(++, int, is_integral)
  40.         gen_unary_op(--,    , is_integral)
  41.         gen_unary_op(--, int, is_integral)
  42.       #undef gen_unary_op
  43.  
  44.       #define gen_binary_op(op, cond) \
  45.       typename std::enable_if<cond, strong_number>::type\
  46.       operator op(strong_number other) { return { val op other.val }; }
  47.         gen_binary_op(+,  true)
  48.         gen_binary_op(-,  true)
  49.         gen_binary_op(*,  true)
  50.         gen_binary_op(/,  true)
  51.         gen_binary_op(%,  is_integral)
  52.         gen_binary_op(&,  is_integral)
  53.         gen_binary_op(|,  is_integral)
  54.         gen_binary_op(^,  is_integral)
  55.         gen_binary_op(<<, is_integral)
  56.         gen_binary_op(>>, is_integral)
  57.       #undef gen_binary_op
  58.  
  59.       #define gen_comparison_op(op) \
  60.       bool operator op(strong_number other) { return val op other.val; }
  61.         gen_comparison_op(==)
  62.         gen_comparison_op(!=)
  63.         gen_comparison_op(>)
  64.         gen_comparison_op(>=)
  65.         gen_comparison_op(<)
  66.         gen_comparison_op(<=)
  67.       #undef gen_comparison_op
  68.  
  69.       #define gen_compound_assignment(op, cond) \
  70.       typename std::enable_if<cond, strong_number&>::type\
  71.       operator op(strong_number other) { val op other.val; return *this; }
  72.         gen_compound_assignment(+=,  true)
  73.         gen_compound_assignment(-=,  true)
  74.         gen_compound_assignment(*=,  true)
  75.         gen_compound_assignment(/=,  true)
  76.         gen_compound_assignment(%=,  is_integral)
  77.         gen_compound_assignment(&=,  is_integral)
  78.         gen_compound_assignment(|=,  is_integral)
  79.         gen_compound_assignment(^=,  is_integral)
  80.         gen_compound_assignment(<<=, is_integral)
  81.         gen_compound_assignment(>>=, is_integral)
  82.       #undef gen_compound_assignment
  83.  
  84.     private:
  85.       strong_number(NumberT val) : val(val) {}
  86.  
  87.       NumberT val;
  88.   };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement