Guest User

Untitled

a guest
Oct 15th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. /* A simple implementation of C++ getter / setter without validation feature;
  2. * There is no storage overhead and performance overhead.
  3. * Author: Seyeon Oh (vee@dgist.ac.kr)
  4. */
  5.  
  6. #ifndef _MIXX_PROPERTY_H_
  7. #define _MIXX_PROPERTY_H_
  8. #include <forward_list>
  9.  
  10. namespace mixx {
  11.  
  12. namespace property_impl {
  13.  
  14. #define MIXX_PUBLIC 1
  15. #define MIXX_PRIVATE 2
  16.  
  17. template <typename ValueType>
  18. class base_storage {
  19. public:
  20. using value_type = ValueType;
  21. value_type _value;
  22. };
  23.  
  24. template <typename Storage, int Attr>
  25. class getter {};
  26.  
  27. template <typename Storage>
  28. class getter<Storage, MIXX_PUBLIC>: protected Storage {
  29. public:
  30. using storage_t = Storage;
  31. using value_type = typename storage_t::value_type;
  32. const value_type& get() const {
  33. return Storage::_value;
  34. }
  35. };
  36.  
  37. template <typename Storage>
  38. class getter<Storage, MIXX_PRIVATE>: protected getter<Storage, MIXX_PUBLIC> {
  39. public:
  40. using storage_t = Storage;
  41. using value_type = typename storage_t::value_type;
  42. };
  43.  
  44. template <typename Getter, int Attr>
  45. class setter {};
  46.  
  47. template <typename Getter>
  48. class setter<Getter, MIXX_PUBLIC>: public Getter {
  49. public:
  50. using getter_t = Getter;
  51. using storage_t = typename getter_t::storage_t;
  52. using value_type = typename storage_t::value_type;
  53.  
  54. template <typename T>
  55. void set(T&& value) {
  56. getter_t::_value = std::forward<T>(value);
  57. }
  58.  
  59. template <typename T>
  60. void operator=(T&& value) {
  61. getter_t::_value = std::forward<T>(value);
  62. }
  63. };
  64.  
  65. template <typename Getter>
  66. class setter<Getter, MIXX_PRIVATE>: public Getter {
  67. protected:
  68. using getter_t = Getter;
  69. using storage_t = typename getter_t::storage_t;
  70. using value_type = typename storage_t::value_type;
  71.  
  72. template <typename T>
  73. void set(T&& value) {
  74. getter_t::_value = std::forward<T>(value);
  75. }
  76.  
  77. template <typename T>
  78. void operator=(T&& value) {
  79. getter_t::_value = std::forward<T>(value);
  80. }
  81. };
  82.  
  83. template <typename ValueType, int GetterAttr, int SetterAttr>
  84. struct traits {
  85. using storage_t = base_storage<ValueType>;
  86. using getter_t = getter<storage_t, GetterAttr>;
  87. using setter_t = setter<getter_t, SetterAttr>;
  88. };
  89.  
  90. template <typename ValueType, int GetterAttr, int SetterAttr, typename Locale>
  91. class cxx_property: public ::mixx::property_impl::traits<ValueType, GetterAttr, SetterAttr>::setter_t {
  92. friend Locale;
  93. };
  94.  
  95. #define USING_CXX_PROPERTY(Locale) \
  96. template <typename ValueType, int GetterAttr, int SetterAttr>\
  97. using cxxprop = ::mixx::property_impl::cxx_property<ValueType, GetterAttr, SetterAttr, Locale>
  98.  
  99. } // !namespace property_impl
  100.  
  101. } // !namespace mixx
  102.  
  103. #endif // !_MIXX_PROPERTY_H_
Add Comment
Please, Sign In to add comment