24#include <esp_heap_caps.h>
38template<
typename R,
typename... Args>
42 using args = std::tuple<Args...>;
45template<
typename R,
typename T,
typename... Args>
49 using args = std::tuple<Args...>;
52template<[[maybe_unused]]
auto Unique = [] {},
typename F>
55 typename signature<
decltype(std::function{std::declval<F>()})>::args;
57 return []<
size_t... Is>(std::index_sequence<Is...>) {
58 return [](std::tuple_element_t<Is, Args>... args) {
59 return std::invoke(_f, std::forward<
decltype(args)>(args)...);
61 }(std::make_index_sequence<std::tuple_size_v<Args>>{});
64template<[[maybe_unused]]
auto Unique = [] {},
typename Self,
typename F>
67 static auto _self{self};
69 return []<
size_t... Is>(std::index_sequence<Is...>) {
70 return [](std::tuple_element_t<Is, Args>... args) {
71 return std::invoke(_f, _self, std::forward<
decltype(args)>(args)...);
73 }(std::make_index_sequence<std::tuple_size_v<Args>>{});
85 string_view p{__PRETTY_FUNCTION__};
86 return string_view(data(p) + 34, size(p) - 34 - 1);
87#elif defined(__GNUC__)
88 string_view p{__PRETTY_FUNCTION__};
89# if __cplusplus < 201402
90 return string_view(data(p) + 36, size(p) - 36 - 1);
92 return string_view(data(p) + 49, p.find(
';', 49) - 49);
94#elif defined(_MSC_VER)
95 string_view p{__FUNCSIG__};
96 return string_view(data(p) + 84, size(p) - 84 - 7);
102template<std::
unsigned_
integral T>
103constexpr T
prime{
sizeof(T) <= 4uz ? 16777619ull : 1099511628211ull};
105template<std::
unsigned_
integral T>
106constexpr T
offset{
sizeof(T) <= 4uz ? 2166136261ull : 14695981039346656037ull};
111template<std::
unsigned_
integral T = u
int32_t>
116template<std::
unsigned_
integral T = u
int32_t>
117constexpr T
fnv1a(std::span<char const> str) {
118 return std::accumulate(cbegin(str),
121 [](T a,
char b) {
return fnv1a(b, a); });
124std::optional<dcc::Address::value_type>
uri2address(std::string_view uri);
129template<std::output_iterator<
char> OutputIt>
131 auto first{begin(uri)};
132 auto const last{cend(uri)};
133 while (first < last) {
135 if (c ==
'+') c =
' ';
137 std::from_chars(first, first + 2, c, 16);
160template<
typename F,
typename... Ts>
162 using R =
decltype(f(std::forward<Ts>(ts)...));
165 if (core_id == xPortGetCoreID())
166 return std::invoke(std::forward<F>(f), std::forward<Ts>(ts)...);
168 else if constexpr (
constexpr auto default_stacksize{4096uz};
171 std::tuple<F, std::tuple<Ts...>> t{
172 std::forward<F>(f), std::tuple<Ts...>{std::forward<Ts>(ts)...}};
176 if (!xTaskCreatePinnedToCore(
178 auto& _t{*
static_cast<decltype(t)*
>(pv)};
179 std::apply(std::get<0uz>(_t), std::get<1uz>(_t));
185 ESP_TASK_PRIO_MAX - 1u,
189 while (eTaskGetState(handle) < eDeleted) vTaskDelay(1u);
194 std::tuple<R, F, std::tuple<Ts...>> t{
195 {}, std::forward<F>(f), std::tuple<Ts...>{std::forward<Ts>(ts)...}};
199 if (!xTaskCreatePinnedToCore(
201 auto& _t{*
static_cast<decltype(t)*
>(pv)};
203 std::apply(std::get<1uz>(_t), std::get<2uz>(_t));
209 ESP_TASK_PRIO_MAX - 1u,
213 while (eTaskGetState(handle) < eDeleted) vTaskDelay(1u);
215 return std::get<0uz>(t);
220template<
typename... Ts>
226template<
typename... Ts>
Definition utility.hpp:100
constexpr T offset
Definition utility.hpp:106
constexpr T prime
Definition utility.hpp:103
httpd_handle_t handle
Handle to server instance.
Definition config.hpp:302
Definition config.hpp:358
R(Args...) type
Definition utility.hpp:47
R return_type
Definition utility.hpp:48
std::tuple< Args... > args
Definition utility.hpp:49
std::tuple< Args... > args
Definition utility.hpp:42
R(Args...) type
Definition utility.hpp:40
R return_type
Definition utility.hpp:41
Definition utility.hpp:36
std::optional< dcc::Address > uri2loco_address(std::string_view uri)
Definition utility.cpp:62
auto httpd_ws_send_frame_async(Ts &&... ts)
Definition utility.hpp:221
void esp_delayed_restart()
Definition utility.cpp:38
bool validate_json(std::string_view json)
Definition utility.cpp:44
auto httpd_sess_trigger_close(Ts &&... ts)
Definition utility.hpp:227
constexpr auto make_unique_caps(size_t size, uint32_t caps)
Definition utility.hpp:151
uint32_t http_receive_timeout2ms()
Definition utility.cpp:72
OutputIt decode_uri(std::string_view uri, OutputIt out)
https://rosettacode.org/wiki/URL_decoding#C
Definition utility.hpp:130
auto make_tramp(F &&f)
Definition utility.hpp:53
std::unique_ptr< T, decltype(heap_caps_free) * > unique_caps_ptr
Definition utility.hpp:147
consteval std::string_view type_name()
Definition utility.hpp:82
std::optional< dcc::Address::value_type > uri2address(std::string_view uri)
Definition utility.cpp:51
constexpr T fnv1a(uint8_t byte, T hash=::detail::offset< T >)
Definition utility.hpp:112
auto invoke_on_core(BaseType_t core_id, F &&f, Ts &&... ts)
Definition utility.hpp:161