diff --git a/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.h b/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.h index 4349783b8c..a2d96b5bab 100644 --- a/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.h +++ b/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.h @@ -13,6 +13,7 @@ #include #include #include +#include namespace AZ::Dom { @@ -34,6 +35,18 @@ namespace AZ::Dom SubpathsOnly, }; + template + constexpr bool RangeConvertibleToPrefixTree = false; + + template + constexpr bool RangeConvertibleToPrefixTree< + Range, + T, + AZStd::enable_if_t< + AZStd::ranges::input_range && AZStd::tuple_size>::value == 2 && + AZStd::convertible_to>, Path> && + AZStd::convertible_to>, T>>> = true; + //! A prefix tree that maps DOM paths to some arbitrary value. template class DomPrefixTree @@ -43,19 +56,9 @@ namespace AZ::Dom DomPrefixTree(const DomPrefixTree&) = default; DomPrefixTree(DomPrefixTree&&) = default; explicit DomPrefixTree(AZStd::initializer_list> init); - template< - class Range, - class = AZStd::enable_if_t< - AZStd::ranges::input_range && - AZStd::convertible_to>, Path> && - AZStd::convertible_to>, T>>> - explicit DomPrefixTree(Range&& range) - { - for (auto&& [path, value] : AZStd::forward(range)) - { - SetValue(path, value); - } - } + + template>> + explicit DomPrefixTree(Range&& range); DomPrefixTree& operator=(const DomPrefixTree&) = default; DomPrefixTree& operator=(DomPrefixTree&&) = default; diff --git a/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.inl b/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.inl index ea8745413c..8b37d6bb72 100644 --- a/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.inl +++ b/Code/Framework/AzCore/AzCore/DOM/DomPrefixTree.inl @@ -19,6 +19,16 @@ namespace AZ::Dom } } + template + template + DomPrefixTree::DomPrefixTree(Range&& range) + { + for (auto&& [path, value] : AZStd::forward(range)) + { + SetValue(path, value); + } + } + template auto DomPrefixTree::GetNodeForPath(const Path& path) -> Node* { diff --git a/Code/Framework/AzCore/Tests/DOM/DomPrefixTreeTests.cpp b/Code/Framework/AzCore/Tests/DOM/DomPrefixTreeTests.cpp index e79c18aa72..be9c7db0c2 100644 --- a/Code/Framework/AzCore/Tests/DOM/DomPrefixTreeTests.cpp +++ b/Code/Framework/AzCore/Tests/DOM/DomPrefixTreeTests.cpp @@ -13,6 +13,17 @@ namespace AZ::Dom::Tests { using DomPrefixTreeTests = DomTestFixture; + static_assert(!RangeConvertibleToPrefixTree, int>, "Non-pair range should not convert to tree"); + static_assert( + !RangeConvertibleToPrefixTree>, int>, + "Mismatched value type should not convert to tree"); + static_assert( + !RangeConvertibleToPrefixTree>, int>, + "Mismatched value type should not convert to tree"); + static_assert( + RangeConvertibleToPrefixTree>, int>, + "Vector with path / key type pairs should convert to tree"); + TEST_F(DomPrefixTreeTests, InitializeFromInitializerList) { DomPrefixTree tree({ @@ -190,4 +201,4 @@ namespace AZ::Dom::Tests EXPECT_TRUE(validateResult(Path("/foo/1"), 42)); results.clear(); } -} +} // namespace AZ::Dom::Tests