Install upper_bound in ReadView:

*  And use it in doLedgerData.
This commit is contained in:
Howard Hinnant
2015-08-26 17:18:31 -04:00
committed by Edward Hennis
parent 849e1ce5f4
commit 83830ef9c0
13 changed files with 106 additions and 4 deletions

View File

@@ -549,6 +549,15 @@ Ledger::slesEnd() const ->
stateMap_->end(), *this);
}
auto
Ledger::slesUpperBound(uint256 const& key) const ->
std::unique_ptr<sles_type::iter_base>
{
return std::make_unique<
sles_iter_impl>(
stateMap_->upper_bound(key), *this);
}
auto
Ledger::txsBegin() const ->
std::unique_ptr<txs_type::iter_base>

View File

@@ -170,6 +170,9 @@ public:
std::unique_ptr<sles_type::iter_base>
slesEnd() const override;
std::unique_ptr<sles_type::iter_base>
slesUpperBound(uint256 const& key) const override;
std::unique_ptr<txs_type::iter_base>
txsBegin() const override;

View File

@@ -102,6 +102,12 @@ public:
return base_.slesEnd();
}
std::unique_ptr<sles_type::iter_base>
slesUpperBound(uint256 const& key) const override
{
return base_.slesUpperBound(key);
}
std::unique_ptr<txs_type::iter_base>
txsBegin() const override
{

View File

@@ -182,6 +182,9 @@ public:
std::unique_ptr<sles_type::iter_base>
slesEnd() const override;
std::unique_ptr<sles_type::iter_base>
slesUpperBound(uint256 const& key) const override;
std::unique_ptr<txs_type::iter_base>
txsBegin() const override;

View File

@@ -191,6 +191,7 @@ public:
explicit sles_type (ReadView const& view);
iterator begin() const;
iterator const& end() const;
iterator upper_bound(key_type const& key) const;
};
struct txs_type
@@ -332,6 +333,11 @@ public:
std::unique_ptr<sles_type::iter_base>
slesEnd() const = 0;
// used by the implementation
virtual
std::unique_ptr<sles_type::iter_base>
slesUpperBound(key_type const& key) const = 0;
// used by the implementation
virtual
std::unique_ptr<txs_type::iter_base>

View File

@@ -83,6 +83,9 @@ public:
std::unique_ptr<sles_type::iter_base>
slesEnd() const override;
std::unique_ptr<sles_type::iter_base>
slesUpperBound(uint256 const& key) const override;
std::unique_ptr<txs_type::iter_base>
txsBegin() const override;

View File

@@ -83,6 +83,9 @@ public:
std::unique_ptr<ReadView::sles_type::iter_base>
slesEnd (ReadView const& base) const;
std::unique_ptr<ReadView::sles_type::iter_base>
slesUpperBound (ReadView const& base, uint256 const& key) const;
private:
enum class Action
{

View File

@@ -85,6 +85,13 @@ ApplyViewBase::slesEnd() const ->
return base_->slesEnd();
}
auto
ApplyViewBase::slesUpperBound(uint256 const& key) const ->
std::unique_ptr<sles_type::iter_base>
{
return base_->slesUpperBound(key);
}
auto
ApplyViewBase::txsBegin() const ->
std::unique_ptr<txs_type::iter_base>

View File

@@ -178,6 +178,13 @@ OpenView::slesEnd() const ->
return items_.slesEnd(*base_);
}
auto
OpenView::slesUpperBound(uint256 const& key) const ->
std::unique_ptr<sles_type::iter_base>
{
return items_.slesUpperBound(*base_, key);
}
auto
OpenView::txsBegin() const ->
std::unique_ptr<txs_type::iter_base>

View File

@@ -41,9 +41,9 @@ public:
sles_iter_impl (items_t::const_iterator iter1,
items_t::const_iterator end1,
ReadView::sles_type::iterator iter0,
ReadView::sles_type::iterator base0)
ReadView::sles_type::iterator end0)
: iter0_ (iter0)
, end0_ (base0)
, end0_ (end0)
, iter1_ (iter1)
, end1_ (end1)
{
@@ -354,5 +354,13 @@ RawStateTable::slesEnd (ReadView const& base) const
base.sles.end(), base.sles.end());
}
std::unique_ptr<ReadView::sles_type::iter_base>
RawStateTable::slesUpperBound (ReadView const& base, uint256 const& key) const
{
return std::make_unique<sles_iter_impl>(
items_.upper_bound(key), items_.end(),
base.sles.upper_bound(key), base.sles.end());
}
} // detail
} // ripple

View File

@@ -144,6 +144,13 @@ ReadView::sles_type::end() const ->
return *end_;
}
auto
ReadView::sles_type::upper_bound(key_type const& key) const ->
iterator
{
return iterator(view_, view_->slesUpperBound(key));
}
ReadView::txs_type::txs_type(
ReadView const& view)
: ReadViewFwdRange(view)

View File

@@ -435,6 +435,12 @@ class View_test
view.rawInsert (sle (4));
view.rawInsert (sle (5));
expect (sles (view) == list (2, 3, 4, 5));
auto b = view.sles.begin();
expect (view.sles.upper_bound(uint256(1)) == b); ++b;
expect (view.sles.upper_bound(uint256(2)) == b); ++b;
expect (view.sles.upper_bound(uint256(3)) == b); ++b;
expect (view.sles.upper_bound(uint256(4)) == b); ++b;
expect (view.sles.upper_bound(uint256(5)) == b);
}
{
setup123 ();
@@ -444,6 +450,12 @@ class View_test
view.rawInsert (sle (4));
view.rawInsert (sle (5));
expect (sles (view) == list (3, 4, 5));
auto b = view.sles.begin();
expect (view.sles.upper_bound(uint256(1)) == b);
expect (view.sles.upper_bound(uint256(2)) == b); ++b;
expect (view.sles.upper_bound(uint256(3)) == b); ++b;
expect (view.sles.upper_bound(uint256(4)) == b); ++b;
expect (view.sles.upper_bound(uint256(5)) == b);
}
{
setup123 ();
@@ -454,6 +466,12 @@ class View_test
view.rawInsert (sle (4));
view.rawInsert (sle (5));
expect (sles (view) == list (4, 5));
auto b = view.sles.begin();
expect (view.sles.upper_bound(uint256(1)) == b);
expect (view.sles.upper_bound(uint256(2)) == b);
expect (view.sles.upper_bound(uint256(3)) == b); ++b;
expect (view.sles.upper_bound(uint256(4)) == b); ++b;
expect (view.sles.upper_bound(uint256(5)) == b);
}
{
setup123 ();
@@ -462,6 +480,13 @@ class View_test
view.rawInsert (sle (4));
view.rawInsert (sle (5));
expect (sles (view) == list (1, 2, 4, 5));
auto b = view.sles.begin();
++b;
expect (view.sles.upper_bound(uint256(1)) == b); ++b;
expect (view.sles.upper_bound(uint256(2)) == b);
expect (view.sles.upper_bound(uint256(3)) == b); ++b;
expect (view.sles.upper_bound(uint256(4)) == b); ++b;
expect (view.sles.upper_bound(uint256(5)) == b);
}
{
setup123 ();
@@ -475,11 +500,25 @@ class View_test
view.rawErase (sle (3));
expect (sles (view) == list (1, 2));
auto b = view.sles.begin();
++b;
expect (view.sles.upper_bound(uint256(1)) == b); ++b;
expect (view.sles.upper_bound(uint256(2)) == b);
expect (view.sles.upper_bound(uint256(3)) == b);
expect (view.sles.upper_bound(uint256(4)) == b);
expect (view.sles.upper_bound(uint256(5)) == b);
view.rawInsert (sle (5));
view.rawInsert (sle (4));
view.rawInsert (sle (3));
expect (sles (view) == list (1, 2, 3, 4, 5));
b = view.sles.begin();
++b;
expect (view.sles.upper_bound(uint256(1)) == b); ++b;
expect (view.sles.upper_bound(uint256(2)) == b); ++b;
expect (view.sles.upper_bound(uint256(3)) == b); ++b;
expect (view.sles.upper_bound(uint256(4)) == b); ++b;
expect (view.sles.upper_bound(uint256(5)) == b);
}
}

View File

@@ -77,9 +77,10 @@ Json::Value doLedgerData (RPC::Context& context)
Json::Value& nodes = jvResult[jss::state];
while ((key = lpLedger->succ(*key)))
auto e = lpLedger->sles.end();
for (auto i = lpLedger->sles.upper_bound(*key); i != e; ++i)
{
auto sle = lpLedger->read(keylet::unchecked(*key));
auto sle = lpLedger->read(keylet::unchecked((*i)->key()));
if (limit-- <= 0)
{
// Stop processing before the current key.