Advertisement
Guest User

Untitled

a guest
Aug 27th, 2014
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. // Voir la première ligne serialize() dans le main, en bas
  2. // Compilé sous VS2012, ligne de commande minimale (cl.exe mem.cpp), pas d'optimisation
  3.  
  4. #include <iostream>
  5.  
  6. typedef unsigned char byte_t;
  7.  
  8. template <unsigned N, typename UnitType = byte_t>
  9.     class memory_block {
  10.         UnitType _b[N];
  11.  
  12.     public:
  13.         UnitType*
  14.         bytes () {
  15.             return _b;
  16.         }
  17.  
  18.         UnitType const*
  19.         bytes () const {
  20.             return _b;
  21.         }
  22.  
  23.         const memory_block<N, UnitType>&
  24.         assign (memory_block<N, UnitType> const& other) {
  25.             for (unsigned i = 0; i < N; i++)
  26.                 bytes()[i] = other.bytes()[i];
  27.             return *this;
  28.         }
  29.     };
  30.  
  31. template <typename Type>
  32.     class scalar:
  33.         public memory_block<sizeof(Type), byte_t> {
  34.  
  35.         Type&
  36.         _get () {
  37.             return *reinterpret_cast<Type*>(this);
  38.         }
  39.  
  40.         template <typename... TArgs>
  41.             void
  42.             _construct (TArgs... args) {
  43.                 new (&_get()) Type(args...);
  44.             }
  45.  
  46.         void
  47.         _destruct () {
  48.             _get().~Type();
  49.         }
  50.  
  51.     public:
  52.         template <typename... TArgs>
  53.             scalar (TArgs... args) {
  54.                 _construct(args...);
  55.             }
  56.  
  57.         ~scalar () {
  58.             _destruct();   
  59.         }
  60.  
  61.         #define __nvfi_define_operator__(op) \
  62.             template <typename T> \
  63.                 auto operator op (T value) -> decltype(scalar<Type>(_get() op value)) { \
  64.                     return scalar<Type>(_get() op value); \
  65.                 }
  66.  
  67.         __nvfi_define_operator__(=);
  68.         __nvfi_define_operator__(+=);
  69.         __nvfi_define_operator__(-=);
  70.         __nvfi_define_operator__(*=);
  71.         __nvfi_define_operator__(/=);
  72.         __nvfi_define_operator__(%=);
  73.         __nvfi_define_operator__(+);
  74.         __nvfi_define_operator__(-);
  75.         __nvfi_define_operator__(*);
  76.         __nvfi_define_operator__(/);
  77.         __nvfi_define_operator__(%);
  78.  
  79.         operator Type () {
  80.             return _get();
  81.         }
  82.  
  83.         operator memory_block<sizeof(Type), byte_t>& () {
  84.             return *this;
  85.         }
  86.     };
  87.  
  88. template <unsigned N, typename UnitType>
  89.     void serialize(memory_block<N, UnitType> block) {
  90.         for (unsigned i = 0; i < N; i++)
  91.             std::cout << (i ? ":": "") << std::hex << (unsigned) block.bytes()[i];
  92.     }
  93.  
  94. int main() {
  95.     scalar<int> x = 0;
  96.     std::cout << x << std::endl;
  97.     memory_block<4> mb;
  98.     mb.bytes()[0] = 0x2a;
  99.     std::cout << std::endl;
  100.     //serialize(x);          // A COMMENTER/DECOMMENTER
  101.     std::cout << std::endl;
  102.     x.assign(mb);
  103.     std::cout << x << std::endl;
  104.     serialize(x);
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement