Update DomPrefixTree range ctor with better validation
Signed-off-by: Nicholas Van Sickle <nvsickle@amazon.com>
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include <AzCore/std/containers/unordered_map.h>
|
||||
#include <AzCore/std/optional.h>
|
||||
#include <AzCore/std/ranges/ranges.h>
|
||||
#include <AzCore/std/tuple.h>
|
||||
|
||||
namespace AZ::Dom
|
||||
{
|
||||
@@ -34,6 +35,18 @@ namespace AZ::Dom
|
||||
SubpathsOnly,
|
||||
};
|
||||
|
||||
template<class Range, class T, class = void>
|
||||
constexpr bool RangeConvertibleToPrefixTree = false;
|
||||
|
||||
template<class Range, class T>
|
||||
constexpr bool RangeConvertibleToPrefixTree<
|
||||
Range,
|
||||
T,
|
||||
AZStd::enable_if_t<
|
||||
AZStd::ranges::input_range<Range> && AZStd::tuple_size<AZStd::ranges::range_value_t<Range>>::value == 2 &&
|
||||
AZStd::convertible_to<AZStd::tuple_element_t<0, AZStd::ranges::range_value_t<Range>>, Path> &&
|
||||
AZStd::convertible_to<AZStd::tuple_element_t<1, AZStd::ranges::range_value_t<Range>>, T>>> = true;
|
||||
|
||||
//! A prefix tree that maps DOM paths to some arbitrary value.
|
||||
template<class T>
|
||||
class DomPrefixTree
|
||||
@@ -43,19 +56,9 @@ namespace AZ::Dom
|
||||
DomPrefixTree(const DomPrefixTree&) = default;
|
||||
DomPrefixTree(DomPrefixTree&&) = default;
|
||||
explicit DomPrefixTree(AZStd::initializer_list<AZStd::pair<Path, T>> init);
|
||||
template<
|
||||
class Range,
|
||||
class = AZStd::enable_if_t<
|
||||
AZStd::ranges::input_range<Range> &&
|
||||
AZStd::convertible_to<AZStd::tuple_element_t<0, AZStd::ranges::range_value_t<Range>>, Path> &&
|
||||
AZStd::convertible_to<AZStd::tuple_element_t<1, AZStd::ranges::range_value_t<Range>>, T>>>
|
||||
explicit DomPrefixTree(Range&& range)
|
||||
{
|
||||
for (auto&& [path, value] : AZStd::forward<Range>(range))
|
||||
{
|
||||
SetValue(path, value);
|
||||
}
|
||||
}
|
||||
|
||||
template<class Range, class = AZStd::enable_if_t<RangeConvertibleToPrefixTree<Range, T>>>
|
||||
explicit DomPrefixTree(Range&& range);
|
||||
|
||||
DomPrefixTree& operator=(const DomPrefixTree&) = default;
|
||||
DomPrefixTree& operator=(DomPrefixTree&&) = default;
|
||||
|
||||
@@ -19,6 +19,16 @@ namespace AZ::Dom
|
||||
}
|
||||
}
|
||||
|
||||
template <class T>
|
||||
template<class Range, class>
|
||||
DomPrefixTree<T>::DomPrefixTree(Range&& range)
|
||||
{
|
||||
for (auto&& [path, value] : AZStd::forward<Range>(range))
|
||||
{
|
||||
SetValue(path, value);
|
||||
}
|
||||
}
|
||||
|
||||
template<class T>
|
||||
auto DomPrefixTree<T>::GetNodeForPath(const Path& path) -> Node*
|
||||
{
|
||||
|
||||
@@ -13,6 +13,17 @@ namespace AZ::Dom::Tests
|
||||
{
|
||||
using DomPrefixTreeTests = DomTestFixture;
|
||||
|
||||
static_assert(!RangeConvertibleToPrefixTree<AZStd::vector<int>, int>, "Non-pair range should not convert to tree");
|
||||
static_assert(
|
||||
!RangeConvertibleToPrefixTree<AZStd::vector<AZStd::pair<Path, AZStd::string>>, int>,
|
||||
"Mismatched value type should not convert to tree");
|
||||
static_assert(
|
||||
!RangeConvertibleToPrefixTree<AZStd::vector<AZStd::pair<AZStd::string, int>>, int>,
|
||||
"Mismatched value type should not convert to tree");
|
||||
static_assert(
|
||||
RangeConvertibleToPrefixTree<AZStd::vector<AZStd::pair<Path, int>>, int>,
|
||||
"Vector with path / key type pairs should convert to tree");
|
||||
|
||||
TEST_F(DomPrefixTreeTests, InitializeFromInitializerList)
|
||||
{
|
||||
DomPrefixTree<int> tree({
|
||||
@@ -190,4 +201,4 @@ namespace AZ::Dom::Tests
|
||||
EXPECT_TRUE(validateResult(Path("/foo/1"), 42));
|
||||
results.clear();
|
||||
}
|
||||
}
|
||||
} // namespace AZ::Dom::Tests
|
||||
|
||||
Reference in New Issue
Block a user