From 6635cee143eb4cf3882bac519b8c12b83b62de62 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 1 Apr 2026 14:21:10 +0100 Subject: Add helper to Decompose a member pointer --- lib/util.cpp | 1 - lib/util.h | 10 ++++++++++ test/Jamfile.jam | 1 + test/test-static-util.cpp | 29 +++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) delete mode 100644 lib/util.cpp create mode 100644 test/test-static-util.cpp diff --git a/lib/util.cpp b/lib/util.cpp deleted file mode 100644 index 408a76a..0000000 --- a/lib/util.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "util.h" diff --git a/lib/util.h b/lib/util.h index b60b093..093462d 100644 --- a/lib/util.h +++ b/lib/util.h @@ -35,6 +35,16 @@ inline constexpr auto GetFirst = Nth<0>; inline constexpr auto GetSecond = Nth<1>; inline constexpr auto GetSwapped = Nth<0, 1>; +template struct Decompose { + consteval Decompose(M T::*) { } + + using ValueType = M; + using ContainerType = T; +}; + +template using MemberValueType = typename decltype(Decompose {MbrPtr})::ValueType; +template using ContainerType = typename decltype(Decompose {MbrPtr})::ContainerType; + template bool createIfRequired(std::shared_ptr & instance, std::weak_ptr & common) diff --git a/test/Jamfile.jam b/test/Jamfile.jam index da2a61a..baf0db4 100644 --- a/test/Jamfile.jam +++ b/test/Jamfile.jam @@ -79,5 +79,6 @@ run test-environment.cpp : : : test ; run test-ui.cpp : : : test ; compile test-static-enumDetails.cpp ; compile test-static-stream_support.cpp ; +compile test-static-util.cpp ; alias perf : perf-assetFactory perf-persistence perf-geoData perf-instancing perf-terrain ; explicit perf ; diff --git a/test/test-static-util.cpp b/test/test-static-util.cpp new file mode 100644 index 0000000..2a8aa81 --- /dev/null +++ b/test/test-static-util.cpp @@ -0,0 +1,29 @@ +#include "util.h" + +namespace { + struct Base1 { + int a; + float b; + }; + + struct Base2 { + int x; + float y; + }; + + struct Sub : Base1, Base2 { + double value; + }; + + static_assert(std::is_same_v, int>); + static_assert(std::is_same_v, float>); + static_assert(std::is_same_v, int>); + static_assert(std::is_same_v, float>); + static_assert(std::is_same_v, double>); + + static_assert(std::is_same_v, Base1>); + static_assert(std::is_same_v, Base2>); + static_assert(std::is_same_v, Base1>); + static_assert(std::is_same_v, Base2>); + static_assert(std::is_same_v, Sub>); +} -- cgit v1.3