Advertisement
Guest User

Untitled

a guest
Nov 19th, 2014
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. namespace property {
  2.     template <typename T>
  3.     struct default_accessor {
  4.         typedef T value_type;
  5.         typedef value_type& reference;
  6.         typedef const reference const_reference;
  7.  
  8.         default_accessor(reference ref) : m_object(ref)
  9.         {
  10.             // Do nothing.
  11.         }
  12.  
  13.         const_reference operator()() const noexcept
  14.         {
  15.             return m_object;
  16.         }
  17.  
  18.         reference operator()() noexcept
  19.         {
  20.             return m_object;
  21.         }
  22.     private:
  23.         reference m_object;
  24.     };
  25.  
  26.     template <typename T>
  27.     struct default_mutator {
  28.         typedef T value_type;
  29.         typedef value_type& reference;
  30.         typedef const reference const_reference;
  31.  
  32.         default_mutator(reference ref) : m_object(ref)
  33.         {
  34.             // Do nothing.
  35.         }
  36.  
  37.         void operator()(value_type value) noexcept
  38.         {
  39.             m_object = value;
  40.         }
  41.     private:
  42.         reference m_object;
  43.     };
  44.  
  45.     template <typename T, class AccessorT = default_accessor<T>, class MutatorT = default_mutator<T>>
  46.     class readwrite {
  47.     public:
  48.         typedef AccessorT accessor_type;
  49.         typedef MutatorT mutator_type;
  50.         typedef T value_type;
  51.         typedef value_type& reference;
  52.         typedef const reference const_reference;
  53.  
  54.         readwrite() : m_getter(m_object), m_setter(m_object)
  55.         {
  56.             // Do nothing.
  57.         }
  58.  
  59.         readwrite(accessor_type getter, mutator_type setter) : m_getter(getter), m_setter(setter)
  60.         {
  61.             // Do nothing.
  62.         }
  63.  
  64.         readwrite(value_type value) : m_getter(m_object), m_setter(m_object)
  65.         {
  66.             m_object = value;
  67.         }
  68.  
  69.         operator T() const noexcept
  70.         {
  71.             return m_getter();
  72.         }
  73.  
  74.         operator T() noexcept
  75.         {
  76.             return m_getter();
  77.         }
  78.  
  79.         void operator=(const_reference ref) noexcept
  80.         {
  81.             m_setter(ref);
  82.         }
  83.         // can overload arithmetic operators, ->, [], etc.
  84.     private:
  85.         value_type m_object;
  86.         accessor_type m_getter;
  87.         mutator_type m_setter;
  88.     };
  89.  
  90.     template <typename T>
  91.     struct null_mutator {
  92.         typedef T value_type;
  93.         typedef value_type& reference;
  94.         typedef const reference const_reference;
  95.  
  96.         null_mutator(const_reference ignored)
  97.         {
  98.             ((void)ignored);
  99.         }
  100.        
  101.         void operator()(const_reference) = delete;
  102.     };
  103.  
  104.     template <typename T, class AccessorT = default_accessor<T>>
  105.     class readonly : public readwrite<T, AccessorT, null_mutator<T>> {
  106.     public:
  107.         typedef T value_type;
  108.         typedef value_type& reference;
  109.         typedef const reference const_reference;
  110.         typedef AccessorT accessor_type;
  111.  
  112.         readonly(value_type value, accessor_type getter = accessor_type()) : base(value), m_getter(getter)
  113.         {
  114.             // Do nothing.
  115.         }
  116.  
  117.         readonly(const readonly&) = delete;
  118.  
  119.         void operator=(const readonly&) = delete;
  120.     private:
  121.         typedef readwrite<T, AccessorT, null_mutator<T>> base;
  122.         accessor_type m_getter;
  123.     };
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement