Mercurial > hg
view rust/hg-cpython/src/dirstate/copymap.rs @ 43177:5cb8867c9e2b
rust-cpython: move $leaked struct out of macro
It wasn't easy to hack the $leaked struct since errors in macro would
generate lots of compile errors. Let's make it a plain struct so we can
easily extend it.
PyLeakedRef keeps a more generic PyObject instead of the $name struct
since it no longer has to call any specific methods implemented by
the $name class. $leaked parameter in py_shared_iterator!() is kept
for future change.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 08 Sep 2019 20:26:55 +0900 |
parents | 7a01778bc7b7 |
children | ce6dd1cee4c8 |
line wrap: on
line source
// copymap.rs // // Copyright 2019 Raphaël Gomès <rgomes@octobus.net> // // This software may be used and distributed according to the terms of the // GNU General Public License version 2 or any later version. //! Bindings for `hg::dirstate::dirstate_map::CopyMap` provided by the //! `hg-core` package. use cpython::{PyBytes, PyClone, PyDict, PyObject, PyResult, Python}; use std::cell::RefCell; use crate::dirstate::dirstate_map::DirstateMap; use crate::ref_sharing::PyLeakedRef; use hg::{utils::hg_path::HgPathBuf, CopyMapIter}; py_class!(pub class CopyMap |py| { data dirstate_map: DirstateMap; def __getitem__(&self, key: PyObject) -> PyResult<PyBytes> { (*self.dirstate_map(py)).copymapgetitem(py, key) } def __len__(&self) -> PyResult<usize> { self.dirstate_map(py).copymaplen(py) } def __contains__(&self, key: PyObject) -> PyResult<bool> { self.dirstate_map(py).copymapcontains(py, key) } def get( &self, key: PyObject, default: Option<PyObject> = None ) -> PyResult<Option<PyObject>> { self.dirstate_map(py).copymapget(py, key, default) } def pop( &self, key: PyObject, default: Option<PyObject> = None ) -> PyResult<Option<PyObject>> { self.dirstate_map(py).copymappop(py, key, default) } def __iter__(&self) -> PyResult<CopyMapKeysIterator> { self.dirstate_map(py).copymapiter(py) } // Python's `dict()` builtin works with either a subclass of dict // or an abstract mapping. Said mapping needs to implement `__getitem__` // and `keys`. def keys(&self) -> PyResult<CopyMapKeysIterator> { self.dirstate_map(py).copymapiter(py) } def items(&self) -> PyResult<CopyMapItemsIterator> { self.dirstate_map(py).copymapitemsiter(py) } def iteritems(&self) -> PyResult<CopyMapItemsIterator> { self.dirstate_map(py).copymapitemsiter(py) } def __setitem__( &self, key: PyObject, item: PyObject ) -> PyResult<()> { self.dirstate_map(py).copymapsetitem(py, key, item)?; Ok(()) } def copy(&self) -> PyResult<PyDict> { self.dirstate_map(py).copymapcopy(py) } }); impl CopyMap { pub fn from_inner(py: Python, dm: DirstateMap) -> PyResult<Self> { Self::create_instance(py, dm) } fn translate_key( py: Python, res: (&HgPathBuf, &HgPathBuf), ) -> PyResult<Option<PyBytes>> { Ok(Some(PyBytes::new(py, res.0.as_ref()))) } fn translate_key_value( py: Python, res: (&HgPathBuf, &HgPathBuf), ) -> PyResult<Option<(PyBytes, PyBytes)>> { let (k, v) = res; Ok(Some(( PyBytes::new(py, k.as_ref()), PyBytes::new(py, v.as_ref()), ))) } } py_shared_iterator!( CopyMapKeysIterator, PyLeakedRef, CopyMapIter<'static>, CopyMap::translate_key, Option<PyBytes> ); py_shared_iterator!( CopyMapItemsIterator, PyLeakedRef, CopyMapIter<'static>, CopyMap::translate_key_value, Option<(PyBytes, PyBytes)> );