22#include "pw_assert/assert.h"
23#include "pw_checksum/crc16_ccitt.h"
24#include "pw_preprocessor/compiler.h"
25#include "pw_span/span.h"
34enum class GetterAction {
73 : persistent_(persistent) {}
74 ~Mutator() { persistent_.crc_ = persistent_.CalculateCrc(); }
78 T* operator->() {
return const_cast<T*
>(&persistent_.contents_); }
84 T& value() {
return persistent_.contents_; }
85 T& operator*() {
return *
const_cast<T*
>(&persistent_.contents_); }
99 template <
class... Args>
100 const T& emplace(Args&&... args) {
101 new (
const_cast<T*
>(&contents_)) T(std::forward<Args>(args)...);
102 crc_ = CalculateCrc();
103 return const_cast<T&
>(contents_);
107 template <
typename U = T>
108 Persistent& operator=(U&& value) {
109 contents_ = std::forward<U>(value);
110 crc_ = CalculateCrc();
117 std::memset(
const_cast<T*
>(&contents_), 0,
sizeof(contents_));
122 [[deprecated]]
void reset() { Invalidate(); }
125 bool has_value()
const {
126 return crc_ == CalculateCrc();
132 const T& value()
const {
133 PW_ASSERT(has_value());
134 return const_cast<T&
>(contents_);
144 Mutator mutator(GetterAction action = GetterAction::kAssertValid) {
145 if (action == GetterAction::kReset) {
148 PW_ASSERT(has_value());
150 return Mutator(*
this);
154 friend class Mutator;
156 static_assert(std::is_trivially_copy_constructible<T>::value,
157 "If a Persistent persists across reboots, it is effectively "
158 "loaded through a trivial copy constructor.");
160 static_assert(std::is_trivially_destructible<T>::value,
161 "A Persistent's destructor does not invoke the value's "
162 "destructor, ergo only trivially destructible types are "
165 uint16_t CalculateCrc()
const {
166 return checksum::Crc16Ccitt::Calculate(
167 as_bytes(span(
const_cast<const T*
>(&contents_), 1)));
175 volatile T contents_;
178 volatile uint16_t crc_;
Definition: persistent.h:70
Definition: persistent.h:58
#define PW_MODIFY_DIAGNOSTICS_POP()
Definition: compiler.h:194
#define PW_MODIFY_DIAGNOSTIC(kind, option)
Definition: compiler.h:203
#define PW_MODIFY_DIAGNOSTIC_GCC(kind, option)
Definition: compiler.h:211
#define PW_MODIFY_DIAGNOSTICS_PUSH()
Definition: compiler.h:189
Persistent RAM utilities and containers.
Definition: persistent.h:28