Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* A simple implementation of C++ getter / setter without validation feature;
- * There is no storage overhead and performance overhead.
- * Author: Seyeon Oh (vee@dgist.ac.kr)
- */
- #ifndef _MIXX_PROPERTY_H_
- #define _MIXX_PROPERTY_H_
- #include <forward_list>
- namespace mixx {
- namespace property_impl {
- #define MIXX_PUBLIC 1
- #define MIXX_PRIVATE 2
- template <typename ValueType>
- class base_storage {
- public:
- using value_type = ValueType;
- value_type _value;
- };
- template <typename Storage, int Attr>
- class getter {};
- template <typename Storage>
- class getter<Storage, MIXX_PUBLIC>: protected Storage {
- public:
- using storage_t = Storage;
- using value_type = typename storage_t::value_type;
- const value_type& get() const {
- return Storage::_value;
- }
- };
- template <typename Storage>
- class getter<Storage, MIXX_PRIVATE>: protected getter<Storage, MIXX_PUBLIC> {
- public:
- using storage_t = Storage;
- using value_type = typename storage_t::value_type;
- };
- template <typename Getter, int Attr>
- class setter {};
- template <typename Getter>
- class setter<Getter, MIXX_PUBLIC>: public Getter {
- public:
- using getter_t = Getter;
- using storage_t = typename getter_t::storage_t;
- using value_type = typename storage_t::value_type;
- template <typename T>
- void set(T&& value) {
- getter_t::_value = std::forward<T>(value);
- }
- template <typename T>
- void operator=(T&& value) {
- getter_t::_value = std::forward<T>(value);
- }
- };
- template <typename Getter>
- class setter<Getter, MIXX_PRIVATE>: public Getter {
- protected:
- using getter_t = Getter;
- using storage_t = typename getter_t::storage_t;
- using value_type = typename storage_t::value_type;
- template <typename T>
- void set(T&& value) {
- getter_t::_value = std::forward<T>(value);
- }
- template <typename T>
- void operator=(T&& value) {
- getter_t::_value = std::forward<T>(value);
- }
- };
- template <typename ValueType, int GetterAttr, int SetterAttr>
- struct traits {
- using storage_t = base_storage<ValueType>;
- using getter_t = getter<storage_t, GetterAttr>;
- using setter_t = setter<getter_t, SetterAttr>;
- };
- template <typename ValueType, int GetterAttr, int SetterAttr, typename Locale>
- class cxx_property: public ::mixx::property_impl::traits<ValueType, GetterAttr, SetterAttr>::setter_t {
- friend Locale;
- };
- #define USING_CXX_PROPERTY(Locale) \
- template <typename ValueType, int GetterAttr, int SetterAttr>\
- using cxxprop = ::mixx::property_impl::cxx_property<ValueType, GetterAttr, SetterAttr, Locale>
- } // !namespace property_impl
- } // !namespace mixx
- #endif // !_MIXX_PROPERTY_H_
Add Comment
Please, Sign In to add comment