]> git.hungrycats.org Git - bees/commitdiff
types: add shrink_begin and shrink_end methods for BeesFileRange and BeesRangePair
authorZygo Blaxell <bees@furryterror.org>
Tue, 19 Nov 2024 04:57:29 +0000 (23:57 -0500)
committerZygo Blaxell <bees@furryterror.org>
Sun, 1 Dec 2024 04:30:33 +0000 (23:30 -0500)
These allow trimming of overlapping dedupes.

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
src/bees-types.cc
src/bees.h

index 2baad0ec21971422eb01a83eff25478ef6267c5f..9be56cf812843c1c0f76e3a1dd9cff6bd9fe1df5 100644 (file)
@@ -183,6 +183,24 @@ BeesFileRange::grow_begin(off_t delta)
        return m_begin;
 }
 
+off_t
+BeesFileRange::shrink_begin(off_t delta)
+{
+       THROW_CHECK1(invalid_argument, delta, delta > 0);
+       THROW_CHECK3(invalid_argument, delta, m_begin, m_end, delta + m_begin < m_end);
+       m_begin += delta;
+       return m_begin;
+}
+
+off_t
+BeesFileRange::shrink_end(off_t delta)
+{
+       THROW_CHECK1(invalid_argument, delta, delta > 0);
+       THROW_CHECK2(invalid_argument, delta, m_end, m_end >= delta);
+       m_end -= delta;
+       return m_end;
+}
+
 BeesFileRange::BeesFileRange(const BeesBlockData &bbd) :
        m_fd(bbd.fd()),
        m_begin(bbd.begin()),
@@ -589,6 +607,22 @@ BeesRangePair::copy_closed() const
        return BeesRangePair(first.copy_closed(), second.copy_closed());
 }
 
+void
+BeesRangePair::shrink_begin(off_t const delta)
+{
+       first.shrink_begin(delta);
+       second.shrink_begin(delta);
+       THROW_CHECK2(runtime_error, first.size(), second.size(), first.size() == second.size());
+}
+
+void
+BeesRangePair::shrink_end(off_t const delta)
+{
+       first.shrink_end(delta);
+       second.shrink_end(delta);
+       THROW_CHECK2(runtime_error, first.size(), second.size(), first.size() == second.size());
+}
+
 ostream &
 operator<<(ostream &os, const BeesAddress &ba)
 {
index 769659b4c3fcdcc116d8aaef7d448756f00a0094..2db4341c0df047d0a5c08befcaaea35e48a5779f 100644 (file)
@@ -300,6 +300,11 @@ public:
        off_t grow_begin(off_t delta);
        /// @}
 
+       /// @{ Make range smaller
+       off_t shrink_end(off_t delta);
+       off_t shrink_begin(off_t delta);
+       /// @}
+
 friend ostream & operator<<(ostream &os, const BeesFileRange &bfr);
 };
 
@@ -665,6 +670,8 @@ class BeesRangePair : public pair<BeesFileRange, BeesFileRange> {
 public:
        BeesRangePair(const BeesFileRange &src, const BeesFileRange &dst);
        bool grow(shared_ptr<BeesContext> ctx, bool constrained);
+       void shrink_begin(const off_t delta);
+       void shrink_end(const off_t delta);
        BeesRangePair copy_closed() const;
        bool operator<(const BeesRangePair &that) const;
 friend ostream & operator<<(ostream &os, const BeesRangePair &brp);