Advertisement
Swiftkill

ByteAccess

Feb 21st, 2019
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. // GNU++98
  2. #include <iostream>
  3. #include <stdint.h>
  4. #include <bitset>
  5.  
  6. template <class T, unsigned _pos, unsigned _size>
  7. class ByAccess {
  8. public:
  9.     typedef T data_type;
  10.  
  11.     void set(data_type v)
  12.     {
  13.         static const data_type mask = (1 << _size) - 1;
  14.         data_type res = v & mask;
  15.         res <<= _pos;
  16.         data &= ~ (mask << _pos);
  17.         data |= res;
  18.     }
  19.    
  20.     data_type get()
  21.     {
  22.         static const unsigned move = sizeof(data_type)*8 - _size;
  23.         data_type result = data << (move - _pos);
  24.         result >>= move;
  25.         result &= (1 << _size) - 1;
  26.         return result;
  27.     }
  28.    
  29.     operator data_type() { return get(); }
  30.     // non-lvalue;
  31.     ByAccess& operator= (const data_type& v) { set(v); return *this; }
  32. private:
  33.     data_type data;
  34. };
  35.  
  36. struct A {
  37.     union {
  38.         int16_t a;
  39.         ByAccess<int16_t, 0, 3> a1;
  40.         ByAccess<int16_t, 3, 2> a2;
  41.         ByAccess<int16_t, 5, 3> a3;
  42.         ByAccess<int16_t, 8, 4> a4;
  43.         ByAccess<int16_t, 12, 4> a5;
  44.     };
  45. };
  46.  
  47. int main()
  48. {
  49.     A pack;
  50.     pack.a  = 0xAC9B;
  51.     std::cout << "a= " << std::bitset<16>(pack.a) << "\n";
  52.     pack.a1 = 7;
  53.     std::cout << "1) a= " << std::bitset<16>(pack.a) << "\n";
  54.     pack.a2 = 3;
  55.     std::cout << "2) a= " << std::bitset<16>(pack.a) << "\n";
  56.     pack.a2 = pack.a3 = 5;
  57.     std::cout << "3) a= " << std::bitset<16>(pack.a) << "\n";
  58.    
  59.     std::cout << "a1= " << std::bitset<16>(pack.a1) << "\n";
  60.     std::cout << "a2= " << std::bitset<16>(pack.a2) << "\n";
  61.     std::cout << "a3= " << std::bitset<16>(pack.a3) << "\n";
  62.     std::cout << "a4= " << std::bitset<16>(pack.a4) << "\n";
  63.     std::cout << "a5= " << std::bitset<16>(pack.a5) << "\n";
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement