| #pragma once |
| |
| #ifndef TCG_CONTROLLED_ACCESS_H |
| #define TCG_CONTROLLED_ACCESS_H |
| |
| |
| #include "base.h" |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| namespace tcg |
| { |
| |
| enum DirectAccess { direct_access }; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| template <typename Obj, typename Func = tcg::empty_type> |
| class controlled_access : tcg::noncopyable<> |
| { |
| Obj m_obj; |
| Func m_func; |
| |
| public: |
| typedef Obj obj_type; |
| typedef Func func_type; |
| |
| public: |
| controlled_access(const func_type &func) : m_obj(), m_func(func) {} |
| controlled_access(const obj_type &obj, const func_type &func) |
| : m_obj(obj), m_func(func) {} |
| |
| const obj_type &operator()(DirectAccess) const { return m_obj; } |
| obj_type &operator()(DirectAccess) { return m_obj; } |
| |
| const obj_type &operator()() const |
| { |
| m_func(m_obj); |
| return m_obj; |
| } |
| obj_type &operator()() |
| { |
| m_func(m_obj); |
| return m_obj; |
| } |
| }; |
| |
| |
| |
| |
| |
| |
| |
| |
| template <typename Obj> |
| class controlled_access<Obj, tcg::empty_type> : tcg::noncopyable<> |
| { |
| Obj m_obj; |
| |
| public: |
| typedef Obj obj_type; |
| |
| public: |
| controlled_access() : m_obj() {} |
| controlled_access(const obj_type &obj) : m_obj(obj) {} |
| |
| const obj_type &operator()(DirectAccess) const { return m_obj; } |
| obj_type &operator()(DirectAccess) { return m_obj; } |
| |
| template <typename Func> |
| const obj_type &operator()(Func func) const |
| { |
| func(m_obj); |
| return m_obj; |
| } |
| |
| template <typename Func> |
| obj_type &operator()(Func func) |
| { |
| func(m_obj); |
| return m_obj; |
| } |
| }; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| template <typename Obj, typename Func = tcg::empty_type> |
| class invalidable : tcg::noncopyable<> |
| { |
| mutable Obj m_obj; |
| mutable bool m_invalid; |
| |
| Func m_func; |
| |
| public: |
| typedef Obj obj_type; |
| typedef Func func_type; |
| |
| public: |
| invalidable(const func_type &func, bool invalid = false) |
| : m_obj(), m_func(func), m_invalid(invalid) {} |
| invalidable(const obj_type &obj, const func_type &func, bool invalid = false) |
| : m_obj(obj), m_func(func), m_invalid(invalid) {} |
| |
| void invalidate() { m_invalid = true; } |
| bool isInvalid() const { return m_invalid; } |
| |
| const obj_type &operator()(DirectAccess) const { return m_obj; } |
| obj_type &operator()(DirectAccess) { return m_obj; } |
| |
| const obj_type &operator()() const |
| { |
| if (m_invalid) |
| m_func(m_obj), m_invalid = false; |
| |
| return m_obj; |
| } |
| |
| obj_type &operator()() |
| { |
| if (m_invalid) |
| m_func(m_obj), m_invalid = false; |
| |
| return m_obj; |
| } |
| }; |
| |
| |
| |
| |
| |
| |
| |
| |
| template <typename Obj> |
| class invalidable<Obj, tcg::empty_type> : tcg::noncopyable<> |
| { |
| mutable Obj m_obj; |
| mutable bool m_invalid; |
| |
| public: |
| typedef Obj obj_type; |
| |
| public: |
| invalidable(bool invalid = false) |
| : m_obj(), m_invalid(invalid) {} |
| invalidable(const obj_type &obj, bool invalid = false) |
| : m_obj(obj), m_invalid(invalid) {} |
| |
| void invalidate() { m_invalid = true; } |
| bool isInvalid() const { return m_invalid; } |
| |
| const obj_type &operator()(DirectAccess) const { return m_obj; } |
| obj_type &operator()(DirectAccess) { return m_obj; } |
| |
| template <typename Func> |
| const obj_type &operator()(Func func) const |
| { |
| if (m_invalid) |
| func(m_obj), m_invalid = false; |
| |
| return m_obj; |
| } |
| |
| template <typename Func> |
| obj_type &operator()(Func func) |
| { |
| if (m_invalid) |
| func(m_obj), m_invalid = false; |
| |
| return m_obj; |
| } |
| }; |
| |
| } |
| |
| #endif |