xrpld
Loading...
Searching...
No Matches
RangeSet.cpp
1#include <xrpl/basics/RangeSet.h>
2
3#include <boost/icl/concept/interval_associator.hpp>
4#include <boost/icl/concept/interval_set.hpp>
5
6#include <gtest/gtest.h>
7
8#include <cstdint>
9#include <optional>
10
11using namespace xrpl;
12
14{
15 // Set will include:
16 // [ 0, 5]
17 // [10,15]
18 // [20,25]
19 // etc...
20
22 for (std::uint32_t i = 0; i < 10; ++i)
23 set.insert(range(10 * i, (10 * i) + 5));
24
25 for (std::uint32_t i = 1; i < 100; ++i)
26 {
28 // no prev missing in domain for i <= 6
29 if (i > 6)
30 {
31 std::uint32_t const oneBelowRange = (10 * (i / 10)) - 1;
32
33 expected = ((i % 10) > 6) ? (i - 1) : oneBelowRange;
34 }
35 EXPECT_EQ(prevMissing(set, i), expected);
36 }
37}
38
39TEST(RangeSet, toString)
40{
42 EXPECT_EQ(to_string(set), "empty");
43
44 set.insert(1);
45 EXPECT_EQ(to_string(set), "1");
46
47 set.insert(range(4u, 6u));
48 EXPECT_EQ(to_string(set), "1,4-6");
49
50 set.insert(2);
51 EXPECT_EQ(to_string(set), "1-2,4-6");
52
53 set.erase(range(4u, 5u));
54 EXPECT_EQ(to_string(set), "1-2,6");
55}
56
58{
60
61 EXPECT_FALSE(fromString(set, ""));
62 EXPECT_EQ(boost::icl::length(set), 0);
63
64 EXPECT_FALSE(fromString(set, "#"));
65 EXPECT_EQ(boost::icl::length(set), 0);
66
67 EXPECT_FALSE(fromString(set, ","));
68 EXPECT_EQ(boost::icl::length(set), 0);
69
70 EXPECT_FALSE(fromString(set, ",-"));
71 EXPECT_EQ(boost::icl::length(set), 0);
72
73 EXPECT_FALSE(fromString(set, "1,,2"));
74 EXPECT_EQ(boost::icl::length(set), 0);
75
76 EXPECT_TRUE(fromString(set, "1"));
77 EXPECT_EQ(boost::icl::length(set), 1);
78 EXPECT_EQ(boost::icl::first(set), 1);
79
80 EXPECT_TRUE(fromString(set, "1,1"));
81 EXPECT_EQ(boost::icl::length(set), 1);
82 EXPECT_EQ(boost::icl::first(set), 1);
83
84 EXPECT_TRUE(fromString(set, "1-1"));
85 EXPECT_EQ(boost::icl::length(set), 1);
86 EXPECT_EQ(boost::icl::first(set), 1);
87
88 EXPECT_TRUE(fromString(set, "1,4-6"));
89 EXPECT_EQ(boost::icl::length(set), 4);
90 EXPECT_EQ(boost::icl::first(set), 1);
91 EXPECT_FALSE(boost::icl::contains(set, 2));
92 EXPECT_FALSE(boost::icl::contains(set, 3));
93 EXPECT_TRUE(boost::icl::contains(set, 4));
94 EXPECT_TRUE(boost::icl::contains(set, 5));
95 EXPECT_EQ(boost::icl::last(set), 6);
96
97 EXPECT_TRUE(fromString(set, "1-2,4-6"));
98 EXPECT_EQ(boost::icl::length(set), 5);
99 EXPECT_EQ(boost::icl::first(set), 1);
100 EXPECT_TRUE(boost::icl::contains(set, 2));
101 EXPECT_TRUE(boost::icl::contains(set, 4));
102 EXPECT_EQ(boost::icl::last(set), 6);
103
104 EXPECT_TRUE(fromString(set, "1-2,6"));
105 EXPECT_EQ(boost::icl::length(set), 3);
106 EXPECT_EQ(boost::icl::first(set), 1);
107 EXPECT_TRUE(boost::icl::contains(set, 2));
108 EXPECT_EQ(boost::icl::last(set), 6);
109}
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
bool set(T &target, std::string const &name, Section const &section)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
std::optional< T > prevMissing(RangeSet< T > const &rs, T t, T minVal=0)
Find the largest value not in the set that is less than a given value.
Definition RangeSet.h:173
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
Definition RangeSet.h:34
std::string to_string(BaseUInt< Bits, Tag > const &a)
Definition base_uint.h:633
bool fromString(RangeSet< T > &rs, std::string const &s)
Convert the given styled string to a RangeSet.
Definition RangeSet.h:104
boost::icl::interval_set< T, std::less, ClosedInterval< T > > RangeSet
A set of closed intervals over the domain T.
Definition RangeSet.h:50