этой коллекции, для которого время от времени область итерирования можно будет пересоздавать на месте.
Для этих целей Итератор должен одновременно владеть как RangeMut объектом, так и мутабельной ссылкой на исходный BTreeMap, что невозможно. По этой причине я решил хранить raw pointer на RangeMut для целей пересоздания RangeMut объекта.
Вот прототип имплементации: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=afbf07c393477d66c7c94b345e1aa90b
Прокомментируйте, пожалуйста, моё решение на предмет безопасности.
ну смотри самое простое.. *mut может быть null, а может и нет, раст это проверяет при обращении по нему, и может это свернуть, а может и нет.. не даром придумали NonNull далее.. определять порядок дропа в целом по идее и не нужно, так как не особо думаю важно убивать первее bar или baz ведь он указатель, но как опционально в таких случаях ManuallyDrop (два, с нужным порядком в общем drop) далее... всеже проставь вручную лайфтаймы особенно на iter.. я не прослеживал что за лайфтайм там раст выведет но навсякий.. далее. ты используешь указатели, хотя могбы и ссылки(вариант очень вычурнее, но по итогу без массового unsafe) просто при условии что ты приведешь ее к лайфтайму на new и далеедалее... глянул бегло, могу что-то и забыть..
Спасибо за подробный комментарий. 1) Foo не владеет баром, он владеет мутабельной ссылок на внешний объект. Поэтому проблемы с дропом здесь не должно возникать, как я понимаю. 2) Лайфтаймы у меня вроде все проставлены. 3) Если это можно на обычных ссылках сделать, как именно?
а NonNull им и не владеет. внутри NonNull тотже *const а создается NonNull от *mut.
Я, честно говоря, вообще не понял, зачем мне NonNull?
затем что ты сделал из & который не является null то что может являтся null а это *const/*mut тоесть ты на типах потерял эту особенность и сделал так что любая разыменовка *const/*mut ведет к дополнительным проверкам + у тебя во втором поле option, а оно там надо? судя по iter оно там не надо)
ок, по поводу Null понял.
Не проверяет, просто Option<raw ptr> будет больше по размеру, чем Option<NonNull>
разве там нет оптимизации, когда ptr.is_null(), то Option<ptr> == None ?
Нет, в нём нет ниши, равной 0, Option<ptr> семантически как Option<Option<NonNull>>
Обсуждают сегодня