Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.12 KB | None | 0 0
  1. #include <cstddef>
  2. #include <cstdint>
  3. #include <iostream>
  4.  
  5. template <std::size_t W>
  6. struct BV {
  7. std::uint32_t const value;
  8.  
  9. template <std::size_t MSB, std::size_t LSB>
  10. constexpr
  11. BV<MSB-LSB+1> slice() const {
  12. static_assert(W>MSB && MSB>=LSB, "range error");
  13.  
  14. constexpr std::size_t newWid{MSB-LSB+1};
  15. constexpr std::uint32_t mask{(1<<newWid)-1};
  16. return BV<newWid>{(value>>LSB)&mask};
  17. }
  18. };
  19.  
  20. template <std::size_t V, std::size_t W>
  21. constexpr
  22. BV<V+W> concat_binary(BV<V> const& lhs, BV<W> const& rhs) {
  23. return BV<V+W>{(lhs.value<<W) + rhs.value};
  24. }
  25.  
  26. constexpr
  27. auto concat() {
  28. return BV<0>{0};
  29. }
  30.  
  31. template <std::size_t W, typename... Ts>
  32. constexpr
  33. auto concat(BV<W> const& v, Ts... rest) {
  34. return concat_binary(v, concat(rest...));
  35. }
  36.  
  37. int main() {
  38. std::cout << std::hex;
  39.  
  40. constexpr BV<8> v0{0x58};
  41. std::cout << v0.value << std::endl;
  42. std::cout << v0.slice<7,4>().value << std::endl;
  43. std::cout << v0.slice<3,0>().value << std::endl;
  44.  
  45. BV<0> mzero{concat()};
  46. std::cout << mzero.value << std::endl;
  47.  
  48. auto v1{v0.slice<3,0>()};
  49. std::cout << concat(v1, v1, v0.slice<7,4>()).value << std::endl;
  50.  
  51. return 0;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement