aboutsummaryrefslogtreecommitdiff
path: root/source/include/memory/asm_pointer.hpp
blob: 20015610844a1077111accfbfe72d27d4f37debf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef TEACHOS_MEMORY_ASM_POINTER_HPP
#define TEACHOS_MEMORY_ASM_POINTER_HPP

namespace teachos::memory
{

  template<typename Type>
  struct asm_pointer
  {
    using pointer = Type;

    constexpr asm_pointer(Type & pointer)
        : m_pointer{&pointer}
    {
    }

    auto constexpr operator->() -> Type * { return m_pointer; }
    auto constexpr operator->() const -> Type const * { return m_pointer; }
    auto constexpr operator*() -> Type & { return *m_pointer; }
    auto constexpr operator*() const -> Type const & { return *m_pointer; }

  private:
    Type * m_pointer;
  };

  template<typename Type>
  struct asm_pointer<Type const>
  {
    constexpr asm_pointer(Type const & pointer)
        : m_pointer{&pointer}
    {
    }

    auto constexpr operator->() -> Type const * { return m_pointer; }
    auto constexpr operator->() const -> Type const * { return m_pointer; }
    auto constexpr operator*() -> Type const & { return *m_pointer; }
    auto constexpr operator*() const -> Type const & { return *m_pointer; }

  private:
    Type const * m_pointer;
  };

}  // namespace teachos::memory

#endif