rust/hg-pyo3/src/revlog/index.rs
changeset 52792 acae91fad6be
parent 52791 0ac956db7ea7
child 52835 bc095c0db77c
--- a/rust/hg-pyo3/src/revlog/index.rs	Sun Dec 22 21:37:29 2024 +0100
+++ b/rust/hg-pyo3/src/revlog/index.rs	Sun Dec 22 17:02:09 2024 +0100
@@ -10,7 +10,38 @@
 use pyo3::prelude::*;
 use pyo3::types::{PyBytes, PyTuple};
 
-use hg::revlog::index::RevisionDataParams;
+use hg::revlog::{
+    index::{Index, RevisionDataParams},
+    Node, Revision, RevlogIndex,
+};
+
+#[derive(derive_more::From)]
+pub struct PySharedIndex {
+    /// The underlying hg-core index
+    inner: &'static Index,
+}
+
+impl PySharedIndex {
+    /// Return a reference to the inner index, bound by `self`
+    pub fn inner(&self) -> &Index {
+        self.inner
+    }
+
+    /// Return an unsafe "faked" `'static` reference to the inner index, for
+    /// the purposes of Python <-> Rust memory sharing.
+    pub unsafe fn static_inner(&self) -> &'static Index {
+        self.inner
+    }
+}
+
+impl RevlogIndex for PySharedIndex {
+    fn len(&self) -> usize {
+        self.inner.len()
+    }
+    fn node(&self, rev: Revision) -> Option<&Node> {
+        self.inner.node(rev)
+    }
+}
 
 pub fn py_tuple_to_revision_data_params(
     tuple: &Bound<'_, PyTuple>,