Skip to content

Commit 9118cea

Browse files
committed
[Core, Log, Wsi, Image] fix ascasts
1 parent e491f8c commit 9118cea

File tree

12 files changed

+1350
-1645
lines changed

12 files changed

+1350
-1645
lines changed

examples/wsi/event_handler/src/main.cpp

Lines changed: 57 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -23,68 +23,69 @@ auto main(std::span<const std::string_view> args) -> int {
2323

2424
const auto monitors = wsi::Window::getMonitorSettings();
2525
logger.ilog("--- Monitors ---");
26-
logger.ilog("{}",
27-
monitors | std::views::transform([](auto&& v) { return toString(v); }) |
28-
std::views::join | std::ranges::to<std::string>());
26+
logger.ilog("{}", monitors);
2927

30-
auto window = wsi::Window { "Hello world", { 800u, 600u }, wsi::WindowStyle::All };
28+
auto window = wsi::Window {
29+
"Hello world",
30+
{ 800u, 600u },
31+
wsi::WindowStyle::All
32+
};
3133

3234
auto fullscreen = false;
3335
auto toggle_fullscreen = false;
3436

3537
auto event_handler = wsi::EventHandler {};
36-
event_handler.setCallbacks(
37-
{ { wsi::EventType::Closed,
38-
[&]([[maybe_unused]] const wsi::Event& event) { window.close(); } },
39-
{ wsi::EventType::Resized,
40-
[](const wsi::Event& event) {
41-
const auto& event_data = as<wsi::ResizedEventData>(event.data);
42-
logger.ilog("Resize event: {}", event_data.extent);
43-
} },
44-
{ wsi::EventType::MouseMoved,
45-
[](const wsi::Event& event) {
46-
const auto& event_data = as<wsi::MouseMovedEventData>(event.data);
47-
logger.ilog("Mouse move event: {}", event_data.position);
48-
} },
49-
{ wsi::EventType::MouseButtonPushed,
50-
[](const wsi::Event& event) {
51-
const auto& event_data = as<wsi::MouseButtonPushedEventData>(event.data);
52-
logger.ilog("Mouse button push event: {} {}",
53-
event_data.button,
54-
event_data.position);
55-
} },
56-
{ wsi::EventType::MouseButtonReleased,
57-
[](const wsi::Event& event) {
58-
const auto& event_data = as<wsi::MouseButtonReleasedEventData>(event.data);
59-
logger.ilog("Mouse button release event: {} {}",
60-
event_data.button,
61-
event_data.position);
62-
} },
63-
{ wsi::EventType::MouseEntered,
64-
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Mouse Entered event"); } },
65-
{ wsi::EventType::MouseExited,
66-
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Mouse Exited event"); } },
67-
{ wsi::EventType::LostFocus,
68-
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Lost focus event"); } },
69-
{ wsi::EventType::GainedFocus,
70-
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Gained focus event"); } },
71-
{ wsi::EventType::KeyPressed,
72-
[&](const wsi::Event& event) {
73-
const auto& event_data = as<wsi::KeyPressedEventData>(event.data);
74-
75-
if (event_data.key == wsi::Key::Escape) {
76-
window.close();
77-
logger.ilog("Closing window");
78-
} else if (event_data.key == wsi::Key::F11)
79-
toggle_fullscreen = true;
80-
81-
logger.ilog("Key pressed: {}", event_data.key);
82-
} },
83-
{ wsi::EventType::KeyReleased, [](const wsi::Event& event) {
84-
const auto& event_data = as<wsi::KeyReleasedEventData>(event.data);
85-
86-
logger.ilog("Key release: {}", event_data.key);
87-
} } });
38+
event_handler.setCallbacks({
39+
{ wsi::EventType::Closed,
40+
[&]([[maybe_unused]] const wsi::Event& event) { window.close(); } },
41+
{ wsi::EventType::Resized,
42+
[](const wsi::Event& event) {
43+
const auto& event_data = as<wsi::ResizedEventData>(event.data);
44+
logger.ilog("Resize event: {}", event_data.extent);
45+
} },
46+
{ wsi::EventType::MouseMoved,
47+
[](const wsi::Event& event) {
48+
const auto& event_data = as<wsi::MouseMovedEventData>(event.data);
49+
logger.ilog("Mouse move event: {}", event_data.position);
50+
} },
51+
{ wsi::EventType::MouseButtonPushed,
52+
[](const wsi::Event& event) {
53+
const auto& event_data = as<wsi::MouseButtonPushedEventData>(event.data);
54+
logger.ilog("Mouse button push event: {} {}", event_data.button, event_data.position);
55+
} },
56+
{ wsi::EventType::MouseButtonReleased,
57+
[](const wsi::Event& event) {
58+
const auto& event_data = as<wsi::MouseButtonReleasedEventData>(event.data);
59+
logger.ilog("Mouse button release event: {} {}",
60+
event_data.button,
61+
event_data.position);
62+
} },
63+
{ wsi::EventType::MouseEntered,
64+
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Mouse Entered event"); } },
65+
{ wsi::EventType::MouseExited,
66+
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Mouse Exited event"); } },
67+
{ wsi::EventType::LostFocus,
68+
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Lost focus event"); } },
69+
{ wsi::EventType::GainedFocus,
70+
[]([[maybe_unused]] const wsi::Event& event) { logger.ilog("Gained focus event"); } },
71+
{ wsi::EventType::KeyPressed,
72+
[&](const wsi::Event& event) {
73+
const auto& event_data = as<wsi::KeyPressedEventData>(event.data);
74+
75+
if (event_data.key == wsi::Key::Escape) {
76+
window.close();
77+
logger.ilog("Closing window");
78+
} else if (event_data.key == wsi::Key::F11)
79+
toggle_fullscreen = true;
80+
81+
logger.ilog("Key pressed: {}", event_data.key);
82+
} },
83+
{ wsi::EventType::KeyReleased, [](const wsi::Event& event) {
84+
const auto& event_data = as<wsi::KeyReleasedEventData>(event.data);
85+
86+
logger.ilog("Key release: {}", event_data.key);
87+
} }
88+
});
8889

8990
while (window.isOpen()) {
9091
event_handler.update(window);

examples/wsi/polling/src/main.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ auto main(std::span<const std::string_view> args) -> int {
2525

2626
const auto monitors = wsi::Window::getMonitorSettings();
2727
polling_logger.ilog("--- Monitors ---");
28-
polling_logger.ilog("{}",
29-
monitors |
30-
std::views::transform([](auto&& v) { return wsi::toString(v); }) |
31-
std::views::join | std::ranges::to<std::string>());
28+
polling_logger.ilog("{}", monitors);
3229

3330
auto window = wsi::Window { "Hello world", { 800u, 600u }, wsi::WindowStyle::All };
3431

modules/stormkit/Core/Functional/Monadic.mpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ export namespace stormkit::core::monadic {
2828
template<typename T>
2929
[[nodiscard]] constexpr auto value() noexcept -> decltype(auto);
3030
template<typename T>
31-
[[nodiscard]] constexpr auto as() noexcept -> decltype(auto);
31+
[[nodiscard]] constexpr auto as(const std::source_location& location
32+
= std::source_location::current()) noexcept -> decltype(auto);
3233
template<typename T>
3334
[[nodiscard]] constexpr auto narrow() noexcept -> decltype(auto);
3435
[[nodiscard]] constexpr auto discard() noexcept -> decltype(auto);
3536
[[nodiscard]] constexpr auto set(auto& output) noexcept -> decltype(auto);
36-
[[nodiscard]] constexpr auto
37-
emplaceTo(std::ranges::range auto& container) noexcept -> decltype(auto);
37+
[[nodiscard]] constexpr auto emplaceTo(std::ranges::range auto& container) noexcept
38+
-> decltype(auto);
3839
[[nodiscard]] constexpr auto is(auto&& value) noexcept;
3940
[[nodiscard]] constexpr auto appendTo(std::ranges::range auto& range) noexcept;
4041
[[nodiscard]] constexpr auto wrap(auto&& func) noexcept;
@@ -92,9 +93,10 @@ namespace stormkit::core::monadic {
9293
/////////////////////////////////////
9394
/////////////////////////////////////
9495
template<typename T>
95-
STORMKIT_FORCE_INLINE constexpr auto as() noexcept -> decltype(auto) {
96-
return []<typename U>(U&& value) static noexcept -> decltype(auto) {
97-
return core::as<T>(std::forward<U>(value));
96+
STORMKIT_FORCE_INLINE constexpr auto as(const std::source_location& location) noexcept
97+
-> decltype(auto) {
98+
return [location]<typename U>(U&& value) noexcept -> T {
99+
return core::as<T>(std::forward<U>(value), location);
98100
};
99101
}
100102

@@ -144,7 +146,7 @@ namespace stormkit::core::monadic {
144146
////////////////////////////////////////
145147
////////////////////////////////////////
146148
STORMKIT_FORCE_INLINE constexpr auto asByte() noexcept {
147-
return [](auto&& val) static noexcept { return core::as<std::byte>(val); };
149+
return [](auto&& val) static noexcept { return core::as<Byte>(val); };
148150
}
149151

150152
/////////////////////////////////////
@@ -162,31 +164,31 @@ namespace stormkit::core::monadic {
162164

163165
/////////////////////////////////////
164166
/////////////////////////////////////
165-
STORMKIT_FORCE_INLINE constexpr auto
166-
emplaceTo(std::ranges::range auto& container) noexcept -> decltype(auto) {
167+
STORMKIT_FORCE_INLINE constexpr auto emplaceTo(std::ranges::range auto& container) noexcept
168+
-> decltype(auto) {
167169
return [&container]<typename T>(T&& value) noexcept -> void {
168170
container.emplace_back(std::forward<T>(value));
169171
};
170172
}
171173

172174
template<typename First, typename Second, typename... Args>
173-
inline constexpr auto is_noexcept =
174-
noexcept(std::declval<Second>()(std::declval<First>()(std::declval<Args>()...)));
175+
inline constexpr auto is_noexcept
176+
= noexcept(std::declval<Second>()(std::declval<First>()(std::declval<Args>()...)));
175177

176178
/////////////////////////////////////
177179
/////////////////////////////////////
178180
template<typename T,
179181
std::invocable<T> First,
180182
std::invocable<std::invoke_result_t<First, T>> Second>
181-
STORMKIT_FORCE_INLINE constexpr auto map(First&& first,
182-
Second&& second) noexcept -> decltype(auto) {
183+
STORMKIT_FORCE_INLINE constexpr auto map(First&& first, Second&& second) noexcept
184+
-> decltype(auto) {
183185
return map(std::forward<First>(first), std::forward<Second>(second));
184186
}
185187

186188
/////////////////////////////////////
187189
/////////////////////////////////////
188-
STORMKIT_FORCE_INLINE constexpr auto map(auto&& first,
189-
auto&& second) noexcept -> decltype(auto) {
190+
STORMKIT_FORCE_INLINE constexpr auto map(auto&& first, auto&& second) noexcept
191+
-> decltype(auto) {
190192
using First = decltype(first);
191193
using Second = decltype(second);
192194
using FirstP = core::CanonicalType<First>;
@@ -203,10 +205,10 @@ namespace stormkit::core::monadic {
203205
/////////////////////////////////////
204206
/////////////////////////////////////
205207
template<typename T>
206-
STORMKIT_FORCE_INLINE constexpr auto
207-
either(IsUnaryPredicate<T> auto&& predicate,
208-
std::invocable<T> auto&& true_,
209-
std::invocable<T> auto&& false_) noexcept -> decltype(auto) {
208+
STORMKIT_FORCE_INLINE constexpr auto either(IsUnaryPredicate<T> auto&& predicate,
209+
std::invocable<T> auto&& true_,
210+
std::invocable<T> auto&& false_) noexcept
211+
-> decltype(auto) {
210212
[predicate = std::move(predicate), true_ = std::move(true_), false_ = std::move(false_)](
211213
auto&& elem) noexcept -> decltype(auto) {
212214
if (predicate(elem)) return first(std::forward<decltype(elem)>(elem));
@@ -235,8 +237,8 @@ namespace stormkit::core::monadic {
235237
/////////////////////////////////////
236238
STORMKIT_FORCE_INLINE constexpr auto
237239
either(std::regular_invocable<Anything> auto&&... visitors) noexcept -> decltype(auto) {
238-
return [... visitors =
239-
std::forward<decltype(visitors)>(visitors)](auto&& variant) mutable noexcept {
240+
return [... visitors
241+
= std::forward<decltype(visitors)>(visitors)](auto&& variant) mutable noexcept {
240242
return std::visit(core::Overloaded { std::forward<decltype(visitors)>(visitors)... },
241243
std::forward<decltype(variant)>(variant));
242244
};

modules/stormkit/Core/Meta.mpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export module stormkit.Core:Meta;
77
export import :Meta.Concepts;
88
export import :Meta.Traits;
99
export import :Meta.NamedType;
10+
export import :Meta.PriorityTag;
1011

1112
export namespace stormkit::core {
1213
template<class... Ts>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (C) 2024 Arthur LAURENT <arthur.laurent4@gmail.com>
2+
// This file is subject to the license terms in the LICENSE file
3+
// found in the top-level of this distribution
4+
5+
export module stormkit.Core:Meta.PriorityTag;
6+
7+
import std;
8+
9+
export namespace stormkit::core {
10+
template<std::size_t I>
11+
struct PriorityTag: PriorityTag<I - 1> {};
12+
13+
template<>
14+
struct PriorityTag<0> {};
15+
} // namespace stormkit::core

modules/stormkit/Core/String/Format.mpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import magic_enum;
99

1010
import :Meta;
1111
import :TypeSafe.Integer;
12+
import :TypeSafe.AsCast;
1213
import :Utils.Time;
1314
import :Utils.Math;
1415

@@ -33,12 +34,18 @@ export namespace std {
3334

3435
template<stormkit::core::math::IsVectorType T, typename CharT>
3536
struct formatter<T, CharT>: public formatter<basic_string<CharT>, CharT> {
37+
template<class ParseContext>
38+
constexpr auto parse(ParseContext& ctx) noexcept;
39+
3640
template<class FormatContext>
3741
auto format(const T& data, FormatContext& ctx) const -> decltype(ctx.out());
3842
};
3943

4044
template<stormkit::core::math::IsExtentLike T, typename CharT>
4145
struct formatter<T, CharT>: public formatter<basic_string<CharT>, CharT> {
46+
template<class ParseContext>
47+
constexpr auto parse(ParseContext& ctx) noexcept;
48+
4249
template<class FormatContext>
4350
auto format(const T& data, FormatContext& ctx) const -> decltype(ctx.out());
4451
};
@@ -74,13 +81,29 @@ namespace std {
7481
return formatter<float, CharT>::format(data.count(), ctx);
7582
}
7683

84+
/////////////////////////////////////
85+
/////////////////////////////////////
86+
template<stormkit::core::math::IsVectorType T, typename CharT>
87+
template<class ParseContext>
88+
constexpr auto formatter<T, CharT>::parse(ParseContext& ctx) noexcept {
89+
return ctx.begin();
90+
}
91+
7792
/////////////////////////////////////
7893
/////////////////////////////////////
7994
template<stormkit::core::math::IsVectorType T, typename CharT>
8095
template<class FormatContext>
8196
auto formatter<T, CharT>::format(const T& data, FormatContext& ctx) const
8297
-> decltype(ctx.out()) {
83-
return formatter<basic_string<CharT>, CharT>::format(stormkit::core::toString(data), ctx);
98+
return std::format_to(ctx.out(), "{}", stormkit::core::as<std::string>(data));
99+
}
100+
101+
/////////////////////////////////////
102+
/////////////////////////////////////
103+
template<stormkit::core::math::IsExtentLike T, typename CharT>
104+
template<class ParseContext>
105+
constexpr auto formatter<T, CharT>::parse(ParseContext& ctx) noexcept {
106+
return ctx.begin();
84107
}
85108

86109
/////////////////////////////////////
@@ -89,7 +112,7 @@ namespace std {
89112
template<class FormatContext>
90113
auto formatter<T, CharT>::format(const T& data, FormatContext& ctx) const
91114
-> decltype(ctx.out()) {
92-
return formatter<basic_string<CharT>, CharT>::format(stormkit::core::toString(data), ctx);
115+
return std::format_to(ctx.out(), "{}", stormkit::core::as<std::string>(data));
93116
}
94117

95118
/////////////////////////////////////

modules/stormkit/Core/String/Operations.mpp

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ export namespace stormkit::core {
2222
[[nodiscard]] auto toUpper(std::string_view string,
2323
std::locale locale = std::locale { "" }) noexcept -> std::string;
2424

25-
[[nodiscard]] constexpr auto toString(auto&& value) noexcept -> std::string;
26-
2725
[[nodiscard]] auto toCZString(std::string_view value) noexcept -> const char*;
2826

2927
template<std::size_t N>
@@ -93,25 +91,6 @@ namespace stormkit::core {
9391
return result;
9492
}
9593

96-
////////////////////////////////////////
97-
////////////////////////////////////////
98-
STORMKIT_INLINE constexpr auto toString(auto&& value) noexcept -> std::string {
99-
using Type = CanonicalType<decltype(value)>;
100-
if constexpr (IsArithmetic<Type>) {
101-
if consteval {
102-
expects(IsIntegral<Type>,
103-
"Only integers are supported for constexpr toString");
104-
}
105-
106-
static thread_local auto buf = std::array<char, 20> {};
107-
const auto result = std::to_chars(std::begin(buf), std::end(buf), value);
108-
ensures(result.ec != std::errc {}, std::make_error_code(result.ec).message());
109-
return std::string { std::begin(buf),
110-
static_cast<std::size_t>(result.ptr - std::begin(buf)) };
111-
} else
112-
return std::to_string(std::forward<decltype(value)>(value));
113-
}
114-
11594
////////////////////////////////////////
11695
////////////////////////////////////////
11796
STORMKIT_INLINE auto toCZString(std::string_view value) noexcept -> const char* {

0 commit comments

Comments
 (0)