HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
cache.hpp
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "utility/module.hpp"
8#include <optional>
9#include <functional>
10
11namespace hi { inline namespace v1 {
12
13template<typename T>
14class cache {
15public:
16 using value_type = T;
17
18 ~cache() = default;
19 constexpr cache(cache const&) noexcept = default;
20 constexpr cache(cache&&) noexcept = default;
21 constexpr cache& operator=(cache const&) noexcept = default;
22 constexpr cache& operator=(cache&&) noexcept = default;
23 constexpr cache() noexcept = default;
24
25 constexpr cache& operator=(forward_of<value_type()> auto&& func) noexcept
26 {
27 _loader = hi_forward(func);
28 return *this;
29 }
30
31 constexpr void reset() const noexcept
32 {
33 _value = std::nullopt;
34 }
35
36 [[nodiscard]] constexpr value_type const& load() const noexcept
37 {
38 if (not _value) {
39 hi_axiom(_loader);
40 _value = _loader();
41 }
42 return *_value;
43 }
44
45 [[nodiscard]] constexpr value_type const& reload() const noexcept
46 {
47 hi_axiom(_loader);
48 _value = _loader();
49 return *_value;
50 }
51
52 constexpr operator value_type const &() const noexcept
53 {
54 return load();
55 }
56
57 [[nodiscard]] constexpr value_type const& operator*() const noexcept
58 {
59 return load();
60 }
61
62 [[nodiscard]] constexpr value_type *operator->() const noexcept
63 {
64 return &load();
65 }
66
67#define HI_X(op) \
68 [[nodiscard]] constexpr friend auto operator op(cache const& lhs, cache const& rhs) noexcept \
69 requires requires { operator op(*lhs, *rhs); } \
70 { \
71 return operator op(*lhs, *rhs); \
72 } \
73\
74 [[nodiscard]] constexpr friend auto operator op(cache const& lhs, auto const& rhs) noexcept \
75 requires requires { operator op(*lhs, rhs); } \
76 { \
77 return operator op(*lhs, rhs); \
78 } \
79\
80 [[nodiscard]] constexpr friend auto operator op(auto const& lhs, cache const& rhs) noexcept \
81 requires requires { operator op(lhs, *rhs); } \
82 { \
83 return operator op(lhs, *rhs); \
84 }
85
86 HI_X(+)
87 HI_X(-)
88 HI_X(*)
89 HI_X(/)
90 HI_X(%)
91 HI_X(==)
92 HI_X(<=>)
93 HI_X(!=)
94 HI_X(<)
95 HI_X(>)
96 HI_X(<=)
97 HI_X(>=)
98 HI_X(<<)
99 HI_X(>>)
100#undef HI_X
101
102#define HI_X(op) \
103 [[nodiscard]] constexpr friend auto operator op(cache const& rhs) noexcept \
104 requires requires { operator op(*rhs); } \
105 { \
106 return operator op(*rhs); \
107 }
108
109 HI_X(-)
110 HI_X(+)
111 HI_X(~)
112#undef HI_X
113
114 [[nodiscard]] constexpr auto operator[](auto const &rhs) noexcept
115 {
116 return (*this)[rhs];
117 }
118
119 [[nodiscard]] constexpr auto operator()(auto &&... rhs) noexcept
120 {
121 return (*this)(hi_forward(rhs)...);
122 }
123
124private:
125 mutable std::optional<value_type> _value;
126 std::function<value_type()> _loader;
127};
128
129}} // namespace hi::v1
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
Definition cache.hpp:14