Блог*
#prog #rust #моё В конце этой заметки я сказал, что планирую расширить код до поддержки impl BorrowMut<VecDeque<T>>. Теперь я понимаю, что это несколько неосмотрительно: код в unsafe полагается на то, что адрес, по которому лежат данные, не меняется. В случае…
#prog #rust #моё
Сообщаю, что данную проблему я решил, воспользовавшись несколько модифицированной версией идеи №3. Ссылка на гист та же самая, но для удобства я её продублирую: https://gist.github.com/AnthonyMikh/bb41179b20938ba329c3d411ddc1c679 (чтобы посмотреть на то, как файл выглядел в изначальном посте, откройте вторую версию). В данный момент
1) Каким образом решена проблема злонамеренного
2) Почему для индексов не используется
3) Зачем вообще нужен параметр
Сообщаю, что данную проблему я решил, воспользовавшись несколько модифицированной версией идеи №3. Ссылка на гист та же самая, но для удобства я её продублирую: https://gist.github.com/AnthonyMikh/bb41179b20938ba329c3d411ddc1c679 (чтобы посмотреть на то, как файл выглядел в изначальном посте, откройте вторую версию). В данный момент
MutPair
имеет следующий вид: pub struct Original;
pub struct View;
pub struct MutPair<T, Deq = VecDeque<T>, Idx = usize, Kind = Original> {
inner: Deq,
first: Idx,
_type: PhantomData<(T, Kind)>,
}
Такое замысловатое определение позволяет расширить возможности, предоставляемые API.1) Каким образом решена проблема злонамеренного
BorrowMut
? Очень просто: публичные методы дают возможность создать только MutPair
с Deq
, являющимся VecDeque<T>
и &mut VecDeque<T>
, поэтому все сложности, связанные с нестабильностью адресов слайсов, отпадают.2) Почему для индексов не используется
usize
? Дело в том, что у владеющего MutPair
теперь есть два метода, которые создают MutPair
, держащие ссылку на дек. Один из них (создаваемый методом view
) работает, как ожидается, а второй, создаваемый методом linked_view
, при вызове методов step_right
/step_left
также меняет позицию изначального MutPair
. Для того, чтобы поддержать этот случай использования, имеется возможность использовать как usize
, так и &mut usize
.3) Зачем вообще нужен параметр
Kind
? Дело в том, что, как я уже подчёркивал, memory safety данного кода существенным образом опирается на невозможность поменять длину дека. Как для владеющего, так и для заимствующего MutPair
имеет смысл операция into_inner
, которая отдаёт дек, но безусловное разрешение подобного метода даёт возможность написать некорректный код с использованием безопасного API (я, к своему стыду, изначально допустил эту ошибку):let deque = ...;
let mut owning_pair = MutPair::try_from(deque).unwrap();
let mut pair = owning_pair.view();
let mut deque = view.into_inner();
deque.clear();
let _ = owning_pair.get(); // Hello UB!
Таким образом, into_inner
для заимствующего MutPair
безопасен только при условии, что объект построен из ссылки на дек непосредственно, а не получен из владеющего MutPair
. Именно это ограничение и обеспечивается четвёртым ти́повым параметром: методы view
/linked_view
возвращают MutPair
с Kind
= View
, в то время как метод into_inner
определён лишь для MutPair
с Kind
= Original
.Gist
Mutable view for VecDeque
Mutable view for VecDeque. GitHub Gist: instantly share code, notes, and snippets.
Блог*
#prog #rust #моё Сообщаю, что данную проблему я решил, воспользовавшись несколько модифицированной версией идеи №3. Ссылка на гист та же самая, но для удобства я её продублирую: https://gist.github.com/AnthonyMikh/bb41179b20938ba329c3d411ddc1c679 (чтобы посмотреть…
И да, я опять немного побрюзжу: этот код было бы проще написать, будь у
VecDeque
адаптер, гарантирующий стабильные адреса. Я думал о том, чтобы написать такой адаптер самому, но потом понял, что с нормальными гарантиями такой адаптер может написать только автор кода VecDeque
, который знает внутреннее устройство и может точно сказать, какие методы не перемещают данные — собственно, в этом смысле сейчас безопасность кода базируется на допущениях, который верны сейчас, но в силу отсутствия явных контрактов могут стать неверными в будущих релизах std#bio
В прямом смысле ор
https://bioinformatics.stackexchange.com/questions/11227/why-does-the-wuhan-coronavirus-genome-end-in-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
В прямом смысле ор
https://bioinformatics.stackexchange.com/questions/11227/why-does-the-wuhan-coronavirus-genome-end-in-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Bioinformatics Stack Exchange
Why does the SARS-Cov2 coronavirus genome end in aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (33 a's)?
The SARS-Cov2 coronavirus's genome was released, and is now available on Genbank. Looking at it...
1 attaaaggtt tataccttcc caggtaacaa accaaccaac tttcgatctc ttgtagatct
61 gttctctaaa cgaactt...
1 attaaaggtt tataccttcc caggtaacaa accaaccaac tttcgatctc ttgtagatct
61 gttctctaaa cgaactt...
Forwarded from addmeto
Люди часто недопонимают, зачем вся эта возня с ИИ-фильтрами для фото и видео. Вот вам конкретный пример: советские кукольные и пластилиновые мультфильмы старались делать очень натуралистично, но т.к. процесс передвигания и анимации кукол очень медленный, все равно получалось 3-7 кадров-положений в секунду. Ниже по ссылке результат работы «фильтра», достроившего промежуточные положения кукол, так чтобы получились честные 50 кадров в секунду. И местами это прямо чудовищно натурально выглядит. Да, на примере всеми любимого Чебурашки. Кто Чебу знал - тот его не позабудет!
Up! Если недостаточно плавно - смотрите чтобы было 720p, ютуб срезает FPS на более низких разрешениях https://youtu.be/-VELzks3a8U
Up! Если недостаточно плавно - смотрите чтобы было 720p, ютуб срезает FPS на более низких разрешениях https://youtu.be/-VELzks3a8U
Forwarded from Наука На Чердаке
Немножко географии вам в ленту:
Так, наверное, представляют себе Землю киты.
Так, наверное, представляют себе Землю киты.
Блог*
#science
Извините, я просто не думаю, что буду ещё что-то по географии постить
#rust #gamedev
С безукоризенной пунктуальностью выкладываю выпуск новостей раст-геймдева за декабрь. Между прочим, пока что самый интересный.
https://rust-gamedev.github.io/posts/newsletter-005/
С безукоризенной пунктуальностью выкладываю выпуск новостей раст-геймдева за декабрь. Между прочим, пока что самый интересный.
https://rust-gamedev.github.io/posts/newsletter-005/
Rust GameDev WG
This Month in Rust GameDev #5 - December 2019
Welcome to the fifth issue of the Rust GameDev Workgroup’s
monthly newsletter.
Rust is a systems lan…
monthly newsletter.
Rust is a systems lan…
❤🔥1
Forwarded from Backtracking (Дима Веснин)
This media is not supported in your browser
VIEW IN TELEGRAM
вышла новая игра Стивена Лавеля Schwerkraftprojektionsgerät (HTML). добро пожаловать в ад