RADLib
RADical C++ application framework
rad_cpp.h
Go to the documentation of this file.
1 #ifndef RADEMBEDDEDKERNEL_RAD_CPP_H
2 #define RADEMBEDDEDKERNEL_RAD_CPP_H
3 
5 #include <stddef.h>
6 #include <stdint.h>
7 
8 namespace rad {
9 
10 enum class Status : int32_t {
11  ok = RAD_STATUS_OK,
20 };
21 
22 inline constexpr bool succeeded(rad_status_t status) { return status == RAD_STATUS_OK; }
23 inline constexpr bool failed(rad_status_t status) { return status != RAD_STATUS_OK; }
24 
25 template <typename T>
26 class Span {
27 public:
28  constexpr Span() = default;
29  constexpr Span(T *data, size_t size) : data_(data), size_(size) {}
30  constexpr T *data() const { return data_; }
31  constexpr size_t size() const { return size_; }
32  constexpr bool empty() const { return size_ == 0; }
33  constexpr T& operator[](size_t index) const { return data_[index]; }
34  constexpr T *begin() const { return data_; }
35  constexpr T *end() const { return data_ + size_; }
36 private:
37  T *data_ = nullptr;
38  size_t size_ = 0;
39 };
40 
41 template <typename Handle, void (*CloseFn)(Handle)>
42 class UniqueHandle {
43 public:
44  constexpr UniqueHandle() = default;
45  explicit constexpr UniqueHandle(Handle handle) : handle_(handle) {}
47  UniqueHandle(const UniqueHandle&) = delete;
48  UniqueHandle& operator=(const UniqueHandle&) = delete;
49  UniqueHandle(UniqueHandle&& other) noexcept : handle_(other.release()) {}
50  UniqueHandle& operator=(UniqueHandle&& other) noexcept {
51  if (this != &other) reset(other.release());
52  return *this;
53  }
54  constexpr Handle get() const { return handle_; }
55  constexpr explicit operator bool() const { return handle_ != nullptr; }
56  Handle release() {
57  Handle handle = handle_;
58  handle_ = nullptr;
59  return handle;
60  }
61  void reset(Handle handle = nullptr) {
62  if (handle_) CloseFn(handle_);
63  handle_ = handle;
64  }
65 private:
66  Handle handle_ = nullptr;
67 };
68 
73 
74 class Mutex {
75 public:
76  Mutex() { status_ = rad_mutex_create(&handle_); }
77  ~Mutex() { if (handle_) rad_mutex_destroy(handle_); }
78  Mutex(const Mutex&) = delete;
79  Mutex& operator=(const Mutex&) = delete;
80  rad_status_t status() const { return status_; }
81  rad_status_t lock() { return handle_ ? rad_mutex_lock(handle_) : RAD_STATUS_NOT_INITIALIZED; }
83  rad_mutex_t native() const { return handle_; }
84 private:
85  rad_mutex_t handle_ = nullptr;
87 };
88 
89 class Event {
90 public:
91  explicit Event(bool signaled = false) { status_ = rad_event_create(&handle_, signaled ? 1 : 0); }
92  ~Event() { if (handle_) rad_event_destroy(handle_); }
93  Event(const Event&) = delete;
94  Event& operator=(const Event&) = delete;
95  rad_status_t status() const { return status_; }
96  rad_status_t wait(uint32_t timeout_ms) { return handle_ ? rad_event_wait(handle_, timeout_ms) : RAD_STATUS_NOT_INITIALIZED; }
98  rad_status_t reset() { return handle_ ? rad_event_reset(handle_) : RAD_STATUS_NOT_INITIALIZED; }
99 private:
100  rad_event_t handle_ = nullptr;
102 };
103 
104 class Module {
105 public:
106  explicit Module(const rad_module_descriptor_t& descriptor) : name_(descriptor.name) {
107  status_ = rad_module_register(&descriptor);
108  }
109  ~Module() { if (name_ && status_ == RAD_STATUS_OK) rad_module_unregister(name_); }
110  Module(const Module&) = delete;
111  Module& operator=(const Module&) = delete;
112  rad_status_t status() const { return status_; }
113 private:
114  const char *name_ = nullptr;
116 };
117 
118 } // namespace rad
119 
120 #endif
Definition: rad_cpp.h:89
Event(bool signaled=false)
Definition: rad_cpp.h:91
rad_status_t status() const
Definition: rad_cpp.h:95
rad_status_t reset()
Definition: rad_cpp.h:98
~Event()
Definition: rad_cpp.h:92
rad_status_t signal()
Definition: rad_cpp.h:97
Event & operator=(const Event &)=delete
Event(const Event &)=delete
rad_status_t wait(uint32_t timeout_ms)
Definition: rad_cpp.h:96
Definition: rad_cpp.h:104
Module(const rad_module_descriptor_t &descriptor)
Definition: rad_cpp.h:106
Module(const Module &)=delete
rad_status_t status() const
Definition: rad_cpp.h:112
Module & operator=(const Module &)=delete
~Module()
Definition: rad_cpp.h:109
Definition: rad_cpp.h:74
~Mutex()
Definition: rad_cpp.h:77
Mutex()
Definition: rad_cpp.h:76
Mutex & operator=(const Mutex &)=delete
rad_mutex_t native() const
Definition: rad_cpp.h:83
rad_status_t lock()
Definition: rad_cpp.h:81
rad_status_t status() const
Definition: rad_cpp.h:80
Mutex(const Mutex &)=delete
rad_status_t unlock()
Definition: rad_cpp.h:82
Definition: rad_cpp.h:26
constexpr Span(T *data, size_t size)
Definition: rad_cpp.h:29
constexpr size_t size() const
Definition: rad_cpp.h:31
constexpr Span()=default
constexpr bool empty() const
Definition: rad_cpp.h:32
constexpr T & operator[](size_t index) const
Definition: rad_cpp.h:33
constexpr T * data() const
Definition: rad_cpp.h:30
constexpr T * end() const
Definition: rad_cpp.h:35
constexpr T * begin() const
Definition: rad_cpp.h:34
Definition: rad_cpp.h:42
void reset(Handle handle=nullptr)
Definition: rad_cpp.h:61
constexpr Handle get() const
Definition: rad_cpp.h:54
Handle release()
Definition: rad_cpp.h:56
constexpr UniqueHandle()=default
UniqueHandle(UniqueHandle &&other) noexcept
Definition: rad_cpp.h:49
UniqueHandle & operator=(const UniqueHandle &)=delete
UniqueHandle(const UniqueHandle &)=delete
UniqueHandle & operator=(UniqueHandle &&other) noexcept
Definition: rad_cpp.h:50
~UniqueHandle()
Definition: rad_cpp.h:46
constexpr UniqueHandle(Handle handle)
Definition: rad_cpp.h:45
Definition: rad_cpp.h:8
constexpr bool failed(rad_status_t status)
Definition: rad_cpp.h:23
constexpr bool succeeded(rad_status_t status)
Definition: rad_cpp.h:22
Status
Definition: rad_cpp.h:10
Portable embedded kernel service ABI for RADLib.
rad_status_t rad_module_unregister(const char *name)
rad_status_t rad_mutex_unlock(rad_mutex_t mutex)
struct rad_mutex_handle * rad_mutex_t
Definition: radekernel.h:875
rad_status_t rad_event_create(rad_event_t *event, int initially_signaled)
rad_status_t rad_mutex_create(rad_mutex_t *mutex)
rad_status_t rad_module_register(const rad_module_descriptor_t *descriptor)
rad_status_t rad_mutex_lock(rad_mutex_t mutex)
rad_status_t rad_event_wait(rad_event_t event, uint32_t timeout_ms)
@ RAD_STATUS_NOT_INITIALIZED
Definition: radekernel.h:107
@ RAD_STATUS_ERROR
Definition: radekernel.h:100
@ RAD_STATUS_NO_MEMORY
Definition: radekernel.h:103
@ RAD_STATUS_NOT_SUPPORTED
Definition: radekernel.h:105
@ RAD_STATUS_NOT_FOUND
Definition: radekernel.h:102
@ RAD_STATUS_ALREADY_EXISTS
Definition: radekernel.h:106
@ RAD_STATUS_INVALID_ARGUMENT
Definition: radekernel.h:101
@ RAD_STATUS_TIMEOUT
Definition: radekernel.h:104
@ RAD_STATUS_OK
Definition: radekernel.h:99
rad_status_t rad_event_signal(rad_event_t event)
rad_status_t rad_event_reset(rad_event_t event)
void rad_event_destroy(rad_event_t event)
struct rad_event_handle * rad_event_t
Definition: radekernel.h:876
void rad_mutex_destroy(rad_mutex_t mutex)
enum rad_status rad_status_t
Definition: radekernel.h:742