Update DomPrefixTree range ctor with better validation

Signed-off-by: Nicholas Van Sickle <nvsickle@amazon.com>
monroegm-disable-blank-issue-2
Nicholas Van Sickle 4 years ago
parent f60a24e07d
commit de8b1496f0

@ -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

Loading…
Cancel
Save