|
14 | 14 |
|
15 | 15 | namespace arch { |
16 | 16 |
|
17 | | -struct mem_space { |
18 | | - constexpr mem_space() |
| 17 | +namespace _details { |
| 18 | + |
| 19 | +template<template<typename> typename Ops> |
| 20 | +struct base_mem_space { |
| 21 | + constexpr base_mem_space() |
19 | 22 | : _base(0) { } |
20 | 23 |
|
21 | | - constexpr mem_space(uintptr_t base) |
| 24 | + constexpr base_mem_space(uintptr_t base) |
22 | 25 | : _base(base) { } |
23 | 26 |
|
24 | | - mem_space(void *base) |
| 27 | + base_mem_space(void *base) |
25 | 28 | : _base(reinterpret_cast<uintptr_t>(base)) { } |
26 | 29 |
|
27 | | - mem_space subspace(ptrdiff_t offset) const { |
28 | | - return mem_space(reinterpret_cast<void *>(_base + offset)); |
| 30 | + base_mem_space subspace(ptrdiff_t offset) const { |
| 31 | + return base_mem_space(reinterpret_cast<void *>(_base + offset)); |
29 | 32 | } |
30 | 33 |
|
31 | 34 | template<typename RT> |
32 | 35 | void store(RT r, typename RT::rep_type value) const { |
33 | 36 | auto p = reinterpret_cast<typename RT::bits_type *>(_base + r.offset()); |
34 | 37 | auto v = static_cast<typename RT::bits_type>(value); |
35 | | - mem_ops<typename RT::bits_type>::store(p, v); |
| 38 | + Ops<typename RT::bits_type>::store(p, v); |
36 | 39 | } |
37 | 40 |
|
38 | 41 | template<typename RT> |
39 | 42 | typename RT::rep_type load(RT r) const { |
40 | 43 | auto p = reinterpret_cast<const typename RT::bits_type *>(_base + r.offset()); |
41 | | - auto b = mem_ops<typename RT::bits_type>::load(p); |
| 44 | + auto b = Ops<typename RT::bits_type>::load(p); |
42 | 45 | return static_cast<typename RT::rep_type>(b); |
43 | 46 | } |
44 | 47 |
|
45 | 48 | template<typename RT> |
46 | 49 | void store_relaxed(RT r, typename RT::rep_type value) const { |
47 | 50 | auto p = reinterpret_cast<typename RT::bits_type *>(_base + r.offset()); |
48 | 51 | auto v = static_cast<typename RT::bits_type>(value); |
49 | | - mem_ops<typename RT::bits_type>::store_relaxed(p, v); |
| 52 | + Ops<typename RT::bits_type>::store_relaxed(p, v); |
50 | 53 | } |
51 | 54 |
|
52 | 55 | template<typename RT> |
53 | 56 | typename RT::rep_type load_relaxed(RT r) const { |
54 | 57 | auto p = reinterpret_cast<const typename RT::bits_type *>(_base + r.offset()); |
55 | | - auto b = mem_ops<typename RT::bits_type>::load_relaxed(p); |
| 58 | + auto b = Ops<typename RT::bits_type>::load_relaxed(p); |
56 | 59 | return static_cast<typename RT::rep_type>(b); |
57 | 60 | } |
58 | 61 |
|
59 | 62 | private: |
60 | 63 | uintptr_t _base; |
61 | 64 | }; |
62 | 65 |
|
| 66 | +} // namespace _details |
| 67 | + |
| 68 | +using mem_space = _details::base_mem_space<mem_ops>; |
| 69 | + |
63 | 70 | static constexpr mem_space global_mem{}; |
64 | 71 |
|
65 | 72 | } // namespace arch |
0 commit comments