1a1d56debSopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd. 2a1d56debSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 3a1d56debSopenharmony_ci// you may not use this file except in compliance with the License. 4a1d56debSopenharmony_ci// You may obtain a copy of the License at 5a1d56debSopenharmony_ci// 6a1d56debSopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 7a1d56debSopenharmony_ci// 8a1d56debSopenharmony_ci// Unless required by applicable law or agreed to in writing, software 9a1d56debSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 10a1d56debSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11a1d56debSopenharmony_ci// See the License for the specific language governing permissions and 12a1d56debSopenharmony_ci// limitations under the License. 13a1d56debSopenharmony_ci 14a1d56debSopenharmony_ciuse core::fmt::{Debug, Formatter}; 15a1d56debSopenharmony_ciuse core::marker::PhantomData; 16a1d56debSopenharmony_ciuse core::ptr::null; 17a1d56debSopenharmony_ci 18a1d56debSopenharmony_ci// todo: Considers deleting PhantomData. 19a1d56debSopenharmony_ci 20a1d56debSopenharmony_ci/// Linked list implementation, provides two sets of methods for getting nodes and members. 21a1d56debSopenharmony_ci/// Only tail insertion, reading, and eject are supported. 22a1d56debSopenharmony_cipub(crate) struct LinkedList<T> { 23a1d56debSopenharmony_ci head: *const Node<T>, 24a1d56debSopenharmony_ci tail: *const Node<T>, 25a1d56debSopenharmony_ci len: usize, 26a1d56debSopenharmony_ci marker: PhantomData<Box<Node<T>>>, 27a1d56debSopenharmony_ci} 28a1d56debSopenharmony_ci 29a1d56debSopenharmony_ciimpl<T> LinkedList<T> { 30a1d56debSopenharmony_ci /// Creates LinkedList. 31a1d56debSopenharmony_ci pub(crate) const fn new() -> Self { 32a1d56debSopenharmony_ci LinkedList { 33a1d56debSopenharmony_ci head: null(), 34a1d56debSopenharmony_ci tail: null(), 35a1d56debSopenharmony_ci len: 0, 36a1d56debSopenharmony_ci marker: PhantomData, 37a1d56debSopenharmony_ci } 38a1d56debSopenharmony_ci } 39a1d56debSopenharmony_ci 40a1d56debSopenharmony_ci /// Gets length of the list. 41a1d56debSopenharmony_ci #[inline] 42a1d56debSopenharmony_ci pub(crate) fn len(&self) -> usize { 43a1d56debSopenharmony_ci self.len 44a1d56debSopenharmony_ci } 45a1d56debSopenharmony_ci 46a1d56debSopenharmony_ci /// Determines whether the linked list is empty. 47a1d56debSopenharmony_ci #[inline] 48a1d56debSopenharmony_ci pub(crate) fn is_empty(&self) -> bool { 49a1d56debSopenharmony_ci self.len == 0 50a1d56debSopenharmony_ci } 51a1d56debSopenharmony_ci 52a1d56debSopenharmony_ci /// Inserts an element at the end of the list 53a1d56debSopenharmony_ci pub(crate) fn push_back(&mut self, value: T) { 54a1d56debSopenharmony_ci let mut node = Box::new(Node::new(value)); 55a1d56debSopenharmony_ci unsafe { 56a1d56debSopenharmony_ci // Sets prev to LinkedList.tail 57a1d56debSopenharmony_ci node.prev = self.tail; 58a1d56debSopenharmony_ci // Gets an internal element pointer. 59a1d56debSopenharmony_ci let node = Box::leak(node) as *const Node<T>; 60a1d56debSopenharmony_ci 61a1d56debSopenharmony_ci if self.tail.is_null() { 62a1d56debSopenharmony_ci self.head = node; 63a1d56debSopenharmony_ci } else { 64a1d56debSopenharmony_ci (*(self.tail as *mut Node<T>)).next = node; 65a1d56debSopenharmony_ci } 66a1d56debSopenharmony_ci 67a1d56debSopenharmony_ci self.tail = node; 68a1d56debSopenharmony_ci self.len += 1; 69a1d56debSopenharmony_ci } 70a1d56debSopenharmony_ci } 71a1d56debSopenharmony_ci 72a1d56debSopenharmony_ci /// Pops an element from the end of the list. 73a1d56debSopenharmony_ci pub(crate) fn pop_back(&mut self) -> Option<T> { 74a1d56debSopenharmony_ci if self.tail.is_null() { 75a1d56debSopenharmony_ci None 76a1d56debSopenharmony_ci } else { 77a1d56debSopenharmony_ci unsafe { 78a1d56debSopenharmony_ci let node = Box::from_raw(self.tail as *mut Node<T>); 79a1d56debSopenharmony_ci self.tail = node.prev; 80a1d56debSopenharmony_ci 81a1d56debSopenharmony_ci if self.tail.is_null() { 82a1d56debSopenharmony_ci self.head = null(); 83a1d56debSopenharmony_ci } else { 84a1d56debSopenharmony_ci (*(self.tail as *mut Node<T>)).next = null(); 85a1d56debSopenharmony_ci } 86a1d56debSopenharmony_ci 87a1d56debSopenharmony_ci self.len -= 1; 88a1d56debSopenharmony_ci Some(node.into_element()) 89a1d56debSopenharmony_ci } 90a1d56debSopenharmony_ci } 91a1d56debSopenharmony_ci } 92a1d56debSopenharmony_ci 93a1d56debSopenharmony_ci /// Gets an ordinary iterator for a linked list. 94a1d56debSopenharmony_ci #[inline] 95a1d56debSopenharmony_ci pub(crate) fn iter(&self) -> Iter<'_, T> { 96a1d56debSopenharmony_ci Iter { 97a1d56debSopenharmony_ci head: self.head, 98a1d56debSopenharmony_ci tail: self.tail, 99a1d56debSopenharmony_ci len: self.len, 100a1d56debSopenharmony_ci marker: PhantomData, 101a1d56debSopenharmony_ci } 102a1d56debSopenharmony_ci } 103a1d56debSopenharmony_ci 104a1d56debSopenharmony_ci /// Gets a mutable iterator for the linked list. 105a1d56debSopenharmony_ci #[inline] 106a1d56debSopenharmony_ci pub(crate) fn iter_mut(&mut self) -> IterMut<'_, T> { 107a1d56debSopenharmony_ci IterMut { 108a1d56debSopenharmony_ci head: self.head, 109a1d56debSopenharmony_ci tail: self.tail, 110a1d56debSopenharmony_ci len: self.len, 111a1d56debSopenharmony_ci marker: PhantomData, 112a1d56debSopenharmony_ci } 113a1d56debSopenharmony_ci } 114a1d56debSopenharmony_ci 115a1d56debSopenharmony_ci /// Gets the normal cursor of the list and sets the starting point to the list header. 116a1d56debSopenharmony_ci #[inline] 117a1d56debSopenharmony_ci pub(crate) fn cursor_front(&self) -> Cursor<'_, T> { 118a1d56debSopenharmony_ci Cursor { 119a1d56debSopenharmony_ci index: 0, 120a1d56debSopenharmony_ci current: self.head, 121a1d56debSopenharmony_ci list: self, 122a1d56debSopenharmony_ci } 123a1d56debSopenharmony_ci } 124a1d56debSopenharmony_ci 125a1d56debSopenharmony_ci /// Gets the variable cursor of the list and sets the starting point to the list header. 126a1d56debSopenharmony_ci #[inline] 127a1d56debSopenharmony_ci pub(crate) fn cursor_front_mut(&mut self) -> CursorMut<'_, T> { 128a1d56debSopenharmony_ci CursorMut { 129a1d56debSopenharmony_ci index: 0, 130a1d56debSopenharmony_ci current: self.head, 131a1d56debSopenharmony_ci list: self, 132a1d56debSopenharmony_ci } 133a1d56debSopenharmony_ci } 134a1d56debSopenharmony_ci 135a1d56debSopenharmony_ci /// Gets the normal cursor of the list and sets the starting point to the end of the list. 136a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 137a1d56debSopenharmony_ci #[inline] 138a1d56debSopenharmony_ci pub(crate) fn cursor_back(&self) -> Cursor<'_, T> { 139a1d56debSopenharmony_ci Cursor { 140a1d56debSopenharmony_ci index: self.len.saturating_sub(1), 141a1d56debSopenharmony_ci current: self.tail, 142a1d56debSopenharmony_ci list: self, 143a1d56debSopenharmony_ci } 144a1d56debSopenharmony_ci } 145a1d56debSopenharmony_ci 146a1d56debSopenharmony_ci /// Gets the variable cursor of the list and sets the start to the end of the list. 147a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 148a1d56debSopenharmony_ci #[inline] 149a1d56debSopenharmony_ci pub(crate) fn cursor_back_mut(&mut self) -> CursorMut<'_, T> { 150a1d56debSopenharmony_ci CursorMut { 151a1d56debSopenharmony_ci index: self.len.saturating_sub(1), 152a1d56debSopenharmony_ci current: self.tail, 153a1d56debSopenharmony_ci list: self, 154a1d56debSopenharmony_ci } 155a1d56debSopenharmony_ci } 156a1d56debSopenharmony_ci 157a1d56debSopenharmony_ci /// Gets a mutable reference to the tail element of the list. 158a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 159a1d56debSopenharmony_ci #[inline] 160a1d56debSopenharmony_ci pub(crate) fn back(&self) -> Option<&T> { 161a1d56debSopenharmony_ci if self.tail.is_null() { 162a1d56debSopenharmony_ci None 163a1d56debSopenharmony_ci } else { 164a1d56debSopenharmony_ci unsafe { Some(&(*self.tail).element) } 165a1d56debSopenharmony_ci } 166a1d56debSopenharmony_ci } 167a1d56debSopenharmony_ci 168a1d56debSopenharmony_ci /// Gets a mutable reference to the tail element of the list. 169a1d56debSopenharmony_ci #[inline] 170a1d56debSopenharmony_ci pub(crate) fn back_mut(&mut self) -> Option<&mut T> { 171a1d56debSopenharmony_ci if self.tail.is_null() { 172a1d56debSopenharmony_ci None 173a1d56debSopenharmony_ci } else { 174a1d56debSopenharmony_ci unsafe { Some(&mut (*(self.tail as *mut Node<T>)).element) } 175a1d56debSopenharmony_ci } 176a1d56debSopenharmony_ci } 177a1d56debSopenharmony_ci 178a1d56debSopenharmony_ci /// Gets a common reference to the node at the end of the linked list. 179a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 180a1d56debSopenharmony_ci #[inline] 181a1d56debSopenharmony_ci pub(crate) fn back_node(&self) -> Option<&Node<T>> { 182a1d56debSopenharmony_ci if self.tail.is_null() { 183a1d56debSopenharmony_ci None 184a1d56debSopenharmony_ci } else { 185a1d56debSopenharmony_ci unsafe { Some(&(*self.tail)) } 186a1d56debSopenharmony_ci } 187a1d56debSopenharmony_ci } 188a1d56debSopenharmony_ci 189a1d56debSopenharmony_ci /// Gets a mutable reference to the node at the end of the linked list. 190a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 191a1d56debSopenharmony_ci #[inline] 192a1d56debSopenharmony_ci pub(crate) fn back_node_mut(&mut self) -> Option<&mut Node<T>> { 193a1d56debSopenharmony_ci if self.tail.is_null() { 194a1d56debSopenharmony_ci None 195a1d56debSopenharmony_ci } else { 196a1d56debSopenharmony_ci unsafe { 197a1d56debSopenharmony_ci // Sets node.parent to the current linked_list in order to delete node. 198a1d56debSopenharmony_ci let node = &mut *(self.tail as *mut Node<T>); 199a1d56debSopenharmony_ci node.parent = self as *const LinkedList<T>; 200a1d56debSopenharmony_ci Some(node) 201a1d56debSopenharmony_ci } 202a1d56debSopenharmony_ci } 203a1d56debSopenharmony_ci } 204a1d56debSopenharmony_ci 205a1d56debSopenharmony_ci /// Removes a node from the linked list. 206a1d56debSopenharmony_ci pub(crate) unsafe fn unlink_node(&mut self, node: *const Node<T>) { 207a1d56debSopenharmony_ci let node = &mut (*(node as *mut Node<T>)); 208a1d56debSopenharmony_ci 209a1d56debSopenharmony_ci if node.prev.is_null() { 210a1d56debSopenharmony_ci self.head = node.next; 211a1d56debSopenharmony_ci } else { 212a1d56debSopenharmony_ci (*(node.prev as *mut Node<T>)).next = node.next; 213a1d56debSopenharmony_ci } 214a1d56debSopenharmony_ci 215a1d56debSopenharmony_ci if node.next.is_null() { 216a1d56debSopenharmony_ci self.tail = node.prev; 217a1d56debSopenharmony_ci } else { 218a1d56debSopenharmony_ci (*(node.next as *mut Node<T>)).prev = node.prev; 219a1d56debSopenharmony_ci } 220a1d56debSopenharmony_ci 221a1d56debSopenharmony_ci self.len -= 1; 222a1d56debSopenharmony_ci } 223a1d56debSopenharmony_ci} 224a1d56debSopenharmony_ci 225a1d56debSopenharmony_ciimpl<T> Default for LinkedList<T> { 226a1d56debSopenharmony_ci fn default() -> Self { 227a1d56debSopenharmony_ci Self::new() 228a1d56debSopenharmony_ci } 229a1d56debSopenharmony_ci} 230a1d56debSopenharmony_ci 231a1d56debSopenharmony_ciimpl<T: Debug> Debug for LinkedList<T> { 232a1d56debSopenharmony_ci fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { 233a1d56debSopenharmony_ci for (n, item) in self.iter().enumerate() { 234a1d56debSopenharmony_ci if n != 0 { 235a1d56debSopenharmony_ci write!(f, ",")?; 236a1d56debSopenharmony_ci } 237a1d56debSopenharmony_ci write!(f, "{item:?}")?; 238a1d56debSopenharmony_ci } 239a1d56debSopenharmony_ci Ok(()) 240a1d56debSopenharmony_ci } 241a1d56debSopenharmony_ci} 242a1d56debSopenharmony_ci 243a1d56debSopenharmony_ciimpl<T: PartialEq> PartialEq for LinkedList<T> { 244a1d56debSopenharmony_ci fn eq(&self, other: &Self) -> bool { 245a1d56debSopenharmony_ci if self.len != other.len { 246a1d56debSopenharmony_ci return false; 247a1d56debSopenharmony_ci } 248a1d56debSopenharmony_ci for (a, b) in self.iter().zip(other.iter()) { 249a1d56debSopenharmony_ci if a.ne(b) { 250a1d56debSopenharmony_ci return false; 251a1d56debSopenharmony_ci } 252a1d56debSopenharmony_ci } 253a1d56debSopenharmony_ci true 254a1d56debSopenharmony_ci } 255a1d56debSopenharmony_ci} 256a1d56debSopenharmony_ci 257a1d56debSopenharmony_ciimpl<T: Clone> Clone for LinkedList<T> { 258a1d56debSopenharmony_ci fn clone(&self) -> Self { 259a1d56debSopenharmony_ci let mut new_list = LinkedList::new(); 260a1d56debSopenharmony_ci for item in self.iter() { 261a1d56debSopenharmony_ci new_list.push_back(item.clone()); 262a1d56debSopenharmony_ci } 263a1d56debSopenharmony_ci new_list 264a1d56debSopenharmony_ci } 265a1d56debSopenharmony_ci} 266a1d56debSopenharmony_ci 267a1d56debSopenharmony_ciimpl<T> Drop for LinkedList<T> { 268a1d56debSopenharmony_ci fn drop(&mut self) { 269a1d56debSopenharmony_ci while self.len != 0 { 270a1d56debSopenharmony_ci let _ = self.pop_back(); 271a1d56debSopenharmony_ci } 272a1d56debSopenharmony_ci } 273a1d56debSopenharmony_ci} 274a1d56debSopenharmony_ci 275a1d56debSopenharmony_ci// We need to use static to store the JsonValue, so we need to make the LinkedList implement Send and Sync. 276a1d56debSopenharmony_ci// However, when using this list, locking is still required under concurrent conditions. 277a1d56debSopenharmony_ciunsafe impl<T: Send> Send for LinkedList<T> {} 278a1d56debSopenharmony_ciunsafe impl<T: Sync> Sync for LinkedList<T> {} 279a1d56debSopenharmony_ci 280a1d56debSopenharmony_ci/// Linked list node, only through a linked list cursor to get the node. 281a1d56debSopenharmony_cipub struct Node<T> { 282a1d56debSopenharmony_ci next: *const Node<T>, 283a1d56debSopenharmony_ci prev: *const Node<T>, 284a1d56debSopenharmony_ci parent: *const LinkedList<T>, 285a1d56debSopenharmony_ci element: T, 286a1d56debSopenharmony_ci} 287a1d56debSopenharmony_ci 288a1d56debSopenharmony_ciimpl<T> Node<T> { 289a1d56debSopenharmony_ci /// Creates a linked list node. 290a1d56debSopenharmony_ci pub(crate) fn new(element: T) -> Self { 291a1d56debSopenharmony_ci Node { 292a1d56debSopenharmony_ci next: null(), 293a1d56debSopenharmony_ci prev: null(), 294a1d56debSopenharmony_ci parent: null(), 295a1d56debSopenharmony_ci element, 296a1d56debSopenharmony_ci } 297a1d56debSopenharmony_ci } 298a1d56debSopenharmony_ci 299a1d56debSopenharmony_ci /// Retrieves the member inside the list node. 300a1d56debSopenharmony_ci pub(crate) fn into_element(self) -> T { 301a1d56debSopenharmony_ci self.element 302a1d56debSopenharmony_ci } 303a1d56debSopenharmony_ci 304a1d56debSopenharmony_ci /// Gets a common reference to an internal member of a linked list node. 305a1d56debSopenharmony_ci pub(crate) fn get_element_mut(&mut self) -> &mut T { 306a1d56debSopenharmony_ci &mut self.element 307a1d56debSopenharmony_ci } 308a1d56debSopenharmony_ci 309a1d56debSopenharmony_ci /// Removes the node itself from the linked list and returns the member below. 310a1d56debSopenharmony_ci #[cfg(feature = "c_adapter")] 311a1d56debSopenharmony_ci pub(crate) fn remove_self(&mut self) -> Option<T> { 312a1d56debSopenharmony_ci let list = unsafe { &mut *(self.parent as *mut LinkedList<T>) }; 313a1d56debSopenharmony_ci let mut cursor = CursorMut { 314a1d56debSopenharmony_ci index: 0, 315a1d56debSopenharmony_ci current: self as *const Node<T>, 316a1d56debSopenharmony_ci list, 317a1d56debSopenharmony_ci }; 318a1d56debSopenharmony_ci cursor.remove_current() 319a1d56debSopenharmony_ci } 320a1d56debSopenharmony_ci} 321a1d56debSopenharmony_ci 322a1d56debSopenharmony_ci/// A common iterator of a linked list. 323a1d56debSopenharmony_cipub struct Iter<'a, T: 'a> { 324a1d56debSopenharmony_ci head: *const Node<T>, 325a1d56debSopenharmony_ci tail: *const Node<T>, 326a1d56debSopenharmony_ci len: usize, 327a1d56debSopenharmony_ci marker: PhantomData<&'a Node<T>>, 328a1d56debSopenharmony_ci} 329a1d56debSopenharmony_ci 330a1d56debSopenharmony_ciimpl<'a, T> Iterator for Iter<'a, T> { 331a1d56debSopenharmony_ci type Item = &'a T; 332a1d56debSopenharmony_ci 333a1d56debSopenharmony_ci #[inline] 334a1d56debSopenharmony_ci fn next(&mut self) -> Option<&'a T> { 335a1d56debSopenharmony_ci if self.len == 0 || self.head.is_null() { 336a1d56debSopenharmony_ci None 337a1d56debSopenharmony_ci } else { 338a1d56debSopenharmony_ci let node = unsafe { &*(self.head as *mut Node<T>) }; 339a1d56debSopenharmony_ci self.len -= 1; 340a1d56debSopenharmony_ci self.head = node.next; 341a1d56debSopenharmony_ci Some(&node.element) 342a1d56debSopenharmony_ci } 343a1d56debSopenharmony_ci } 344a1d56debSopenharmony_ci 345a1d56debSopenharmony_ci #[inline] 346a1d56debSopenharmony_ci fn size_hint(&self) -> (usize, Option<usize>) { 347a1d56debSopenharmony_ci // Returns a tuple representing the remaining range of iterators. 348a1d56debSopenharmony_ci (self.len, Some(self.len)) 349a1d56debSopenharmony_ci } 350a1d56debSopenharmony_ci 351a1d56debSopenharmony_ci #[inline] 352a1d56debSopenharmony_ci fn last(mut self) -> Option<&'a T> { 353a1d56debSopenharmony_ci // Uses the iterator traversal and returns the last element. 354a1d56debSopenharmony_ci self.next_back() 355a1d56debSopenharmony_ci } 356a1d56debSopenharmony_ci} 357a1d56debSopenharmony_ci 358a1d56debSopenharmony_ciimpl<'a, T> DoubleEndedIterator for Iter<'a, T> { 359a1d56debSopenharmony_ci fn next_back(&mut self) -> Option<&'a T> { 360a1d56debSopenharmony_ci if self.len == 0 || self.tail.is_null() { 361a1d56debSopenharmony_ci None 362a1d56debSopenharmony_ci } else { 363a1d56debSopenharmony_ci let node = unsafe { &*(self.tail as *mut Node<T>) }; 364a1d56debSopenharmony_ci self.len -= 1; 365a1d56debSopenharmony_ci self.tail = node.prev; 366a1d56debSopenharmony_ci Some(&node.element) 367a1d56debSopenharmony_ci } 368a1d56debSopenharmony_ci } 369a1d56debSopenharmony_ci} 370a1d56debSopenharmony_ci 371a1d56debSopenharmony_ci/// A variable iterator of a linked list. 372a1d56debSopenharmony_cipub struct IterMut<'a, T: 'a> { 373a1d56debSopenharmony_ci head: *const Node<T>, 374a1d56debSopenharmony_ci tail: *const Node<T>, 375a1d56debSopenharmony_ci len: usize, 376a1d56debSopenharmony_ci marker: PhantomData<&'a mut Node<T>>, 377a1d56debSopenharmony_ci} 378a1d56debSopenharmony_ci 379a1d56debSopenharmony_ciimpl<'a, T> Iterator for IterMut<'a, T> { 380a1d56debSopenharmony_ci type Item = &'a mut T; 381a1d56debSopenharmony_ci 382a1d56debSopenharmony_ci #[inline] 383a1d56debSopenharmony_ci fn next(&mut self) -> Option<&'a mut T> { 384a1d56debSopenharmony_ci if self.len == 0 || self.head.is_null() { 385a1d56debSopenharmony_ci None 386a1d56debSopenharmony_ci } else { 387a1d56debSopenharmony_ci let node = unsafe { &mut *(self.head as *mut Node<T>) }; 388a1d56debSopenharmony_ci self.len -= 1; 389a1d56debSopenharmony_ci self.head = node.next; 390a1d56debSopenharmony_ci Some(&mut node.element) 391a1d56debSopenharmony_ci } 392a1d56debSopenharmony_ci } 393a1d56debSopenharmony_ci 394a1d56debSopenharmony_ci #[inline] 395a1d56debSopenharmony_ci fn size_hint(&self) -> (usize, Option<usize>) { 396a1d56debSopenharmony_ci // Returns a tuple representing the remaining range of iterators. 397a1d56debSopenharmony_ci (self.len, Some(self.len)) 398a1d56debSopenharmony_ci } 399a1d56debSopenharmony_ci 400a1d56debSopenharmony_ci #[inline] 401a1d56debSopenharmony_ci fn last(mut self) -> Option<&'a mut T> { 402a1d56debSopenharmony_ci // Uses the iterator traversal and returns the last element. 403a1d56debSopenharmony_ci self.next_back() 404a1d56debSopenharmony_ci } 405a1d56debSopenharmony_ci} 406a1d56debSopenharmony_ci 407a1d56debSopenharmony_ciimpl<'a, T> DoubleEndedIterator for IterMut<'a, T> { 408a1d56debSopenharmony_ci #[inline] 409a1d56debSopenharmony_ci fn next_back(&mut self) -> Option<&'a mut T> { 410a1d56debSopenharmony_ci if self.len == 0 || self.tail.is_null() { 411a1d56debSopenharmony_ci None 412a1d56debSopenharmony_ci } else { 413a1d56debSopenharmony_ci let node = unsafe { &mut *(self.tail as *mut Node<T>) }; 414a1d56debSopenharmony_ci self.len -= 1; 415a1d56debSopenharmony_ci self.tail = node.prev; 416a1d56debSopenharmony_ci Some(&mut node.element) 417a1d56debSopenharmony_ci } 418a1d56debSopenharmony_ci } 419a1d56debSopenharmony_ci} 420a1d56debSopenharmony_ci 421a1d56debSopenharmony_ci/// A common cursor for a linked list. When the list is empty, 422a1d56debSopenharmony_ci/// it points to a virtual location (pointing to a node that does not actually exist). 423a1d56debSopenharmony_cipub(crate) struct Cursor<'a, T: 'a> { 424a1d56debSopenharmony_ci index: usize, 425a1d56debSopenharmony_ci current: *const Node<T>, 426a1d56debSopenharmony_ci list: &'a LinkedList<T>, 427a1d56debSopenharmony_ci} 428a1d56debSopenharmony_ci 429a1d56debSopenharmony_ciimpl<'a, T> Cursor<'a, T> { 430a1d56debSopenharmony_ci /// Gets the position the cursor is pointing to. 431a1d56debSopenharmony_ci /// If the cursor points to a virtual position, return None. 432a1d56debSopenharmony_ci #[inline] 433a1d56debSopenharmony_ci pub(crate) fn index(&self) -> Option<usize> { 434a1d56debSopenharmony_ci if self.current.is_null() { 435a1d56debSopenharmony_ci return None; 436a1d56debSopenharmony_ci } 437a1d56debSopenharmony_ci Some(self.index) 438a1d56debSopenharmony_ci } 439a1d56debSopenharmony_ci 440a1d56debSopenharmony_ci /// The cursor moves back. 441a1d56debSopenharmony_ci #[inline] 442a1d56debSopenharmony_ci pub(crate) fn move_next(&mut self) { 443a1d56debSopenharmony_ci if self.current.is_null() { 444a1d56debSopenharmony_ci self.current = self.list.head; 445a1d56debSopenharmony_ci self.index = 0; 446a1d56debSopenharmony_ci } else { 447a1d56debSopenharmony_ci self.current = unsafe { (*self.current).next }; 448a1d56debSopenharmony_ci self.index += 1; 449a1d56debSopenharmony_ci } 450a1d56debSopenharmony_ci } 451a1d56debSopenharmony_ci 452a1d56debSopenharmony_ci /// The cursor moves forward. 453a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 454a1d56debSopenharmony_ci #[inline] 455a1d56debSopenharmony_ci pub(crate) fn move_prev(&mut self) { 456a1d56debSopenharmony_ci if self.current.is_null() { 457a1d56debSopenharmony_ci self.current = self.list.tail; 458a1d56debSopenharmony_ci self.index = self.list.len().saturating_sub(1); 459a1d56debSopenharmony_ci } else { 460a1d56debSopenharmony_ci self.current = unsafe { (*self.current).prev }; 461a1d56debSopenharmony_ci self.index = self.index.checked_sub(1).unwrap_or_else(|| self.list.len()); 462a1d56debSopenharmony_ci } 463a1d56debSopenharmony_ci } 464a1d56debSopenharmony_ci 465a1d56debSopenharmony_ci /// Gets the cursor. 466a1d56debSopenharmony_ci #[inline] 467a1d56debSopenharmony_ci pub(crate) fn current(&self) -> Option<&'a T> { 468a1d56debSopenharmony_ci if self.current.is_null() { 469a1d56debSopenharmony_ci None 470a1d56debSopenharmony_ci } else { 471a1d56debSopenharmony_ci unsafe { Some(&(*self.current).element) } 472a1d56debSopenharmony_ci } 473a1d56debSopenharmony_ci } 474a1d56debSopenharmony_ci 475a1d56debSopenharmony_ci /// Gets a reference to the current node. 476a1d56debSopenharmony_ci #[inline] 477a1d56debSopenharmony_ci pub(crate) fn current_node(&self) -> Option<&'a Node<T>> { 478a1d56debSopenharmony_ci if self.current.is_null() { 479a1d56debSopenharmony_ci None 480a1d56debSopenharmony_ci } else { 481a1d56debSopenharmony_ci unsafe { Some(&*(self.current)) } 482a1d56debSopenharmony_ci } 483a1d56debSopenharmony_ci } 484a1d56debSopenharmony_ci 485a1d56debSopenharmony_ci #[cfg(feature = "list_object")] 486a1d56debSopenharmony_ci #[inline] 487a1d56debSopenharmony_ci pub(crate) fn current_node_ptr(&self) -> *const Node<T> { 488a1d56debSopenharmony_ci self.current 489a1d56debSopenharmony_ci } 490a1d56debSopenharmony_ci} 491a1d56debSopenharmony_ci 492a1d56debSopenharmony_cipub(crate) struct CursorMut<'a, T: 'a> { 493a1d56debSopenharmony_ci index: usize, 494a1d56debSopenharmony_ci current: *const Node<T>, 495a1d56debSopenharmony_ci list: &'a mut LinkedList<T>, 496a1d56debSopenharmony_ci} 497a1d56debSopenharmony_ci 498a1d56debSopenharmony_ciimpl<'a, T> CursorMut<'a, T> { 499a1d56debSopenharmony_ci /// Gets the index. 500a1d56debSopenharmony_ci #[inline] 501a1d56debSopenharmony_ci pub(crate) fn index(&self) -> Option<usize> { 502a1d56debSopenharmony_ci if self.current.is_null() { 503a1d56debSopenharmony_ci return None; 504a1d56debSopenharmony_ci } 505a1d56debSopenharmony_ci Some(self.index) 506a1d56debSopenharmony_ci } 507a1d56debSopenharmony_ci 508a1d56debSopenharmony_ci /// The cursor moves beck. 509a1d56debSopenharmony_ci #[inline] 510a1d56debSopenharmony_ci pub(crate) fn move_next(&mut self) { 511a1d56debSopenharmony_ci if self.current.is_null() { 512a1d56debSopenharmony_ci self.current = self.list.head; 513a1d56debSopenharmony_ci self.index = 0; 514a1d56debSopenharmony_ci } else { 515a1d56debSopenharmony_ci self.current = unsafe { (*self.current).next }; 516a1d56debSopenharmony_ci self.index += 1; 517a1d56debSopenharmony_ci } 518a1d56debSopenharmony_ci } 519a1d56debSopenharmony_ci 520a1d56debSopenharmony_ci /// The cursor moves forward. 521a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 522a1d56debSopenharmony_ci #[inline] 523a1d56debSopenharmony_ci pub(crate) fn move_prev(&mut self) { 524a1d56debSopenharmony_ci if self.current.is_null() { 525a1d56debSopenharmony_ci self.current = self.list.tail; 526a1d56debSopenharmony_ci self.index = self.list.len().saturating_sub(1); 527a1d56debSopenharmony_ci } else { 528a1d56debSopenharmony_ci self.current = unsafe { (*self.current).prev }; 529a1d56debSopenharmony_ci self.index = self.index.checked_sub(1).unwrap_or_else(|| self.list.len()); 530a1d56debSopenharmony_ci } 531a1d56debSopenharmony_ci } 532a1d56debSopenharmony_ci 533a1d56debSopenharmony_ci /// Gets a mutable reference to the current element. 534a1d56debSopenharmony_ci #[cfg(feature = "list_object")] 535a1d56debSopenharmony_ci #[inline] 536a1d56debSopenharmony_ci pub(crate) fn current(&mut self) -> Option<&mut T> { 537a1d56debSopenharmony_ci if self.current.is_null() { 538a1d56debSopenharmony_ci None 539a1d56debSopenharmony_ci } else { 540a1d56debSopenharmony_ci unsafe { Some(&mut (*(self.current as *mut Node<T>)).element) } 541a1d56debSopenharmony_ci } 542a1d56debSopenharmony_ci } 543a1d56debSopenharmony_ci 544a1d56debSopenharmony_ci /// Gets a mutable reference to the current node. 545a1d56debSopenharmony_ci #[inline] 546a1d56debSopenharmony_ci pub(crate) fn current_node(&mut self) -> Option<&'a mut Node<T>> { 547a1d56debSopenharmony_ci if self.current.is_null() { 548a1d56debSopenharmony_ci None 549a1d56debSopenharmony_ci } else { 550a1d56debSopenharmony_ci unsafe { 551a1d56debSopenharmony_ci let node = &mut *(self.current as *mut Node<T>); 552a1d56debSopenharmony_ci node.parent = self.list as *mut LinkedList<T>; 553a1d56debSopenharmony_ci Some(node) 554a1d56debSopenharmony_ci } 555a1d56debSopenharmony_ci } 556a1d56debSopenharmony_ci } 557a1d56debSopenharmony_ci 558a1d56debSopenharmony_ci /// Deletes the node to which the cursor is pointing. 559a1d56debSopenharmony_ci #[inline] 560a1d56debSopenharmony_ci pub(crate) fn remove_current(&mut self) -> Option<T> { 561a1d56debSopenharmony_ci if self.current.is_null() { 562a1d56debSopenharmony_ci return None; 563a1d56debSopenharmony_ci } 564a1d56debSopenharmony_ci 565a1d56debSopenharmony_ci let unlinked_node = self.current; 566a1d56debSopenharmony_ci unsafe { 567a1d56debSopenharmony_ci self.current = (*unlinked_node).next; 568a1d56debSopenharmony_ci self.list.unlink_node(unlinked_node); 569a1d56debSopenharmony_ci let unlinked_node = Box::from_raw(unlinked_node as *mut Node<T>); 570a1d56debSopenharmony_ci Some(unlinked_node.element) 571a1d56debSopenharmony_ci } 572a1d56debSopenharmony_ci } 573a1d56debSopenharmony_ci} 574a1d56debSopenharmony_ci 575a1d56debSopenharmony_ci#[cfg(test)] 576a1d56debSopenharmony_cimod ut_linked_list { 577a1d56debSopenharmony_ci use crate::LinkedList; 578a1d56debSopenharmony_ci 579a1d56debSopenharmony_ci /// UT test for `LinkedList::pop_back`. 580a1d56debSopenharmony_ci /// 581a1d56debSopenharmony_ci /// # Title 582a1d56debSopenharmony_ci /// ut_linked_list_pop_back 583a1d56debSopenharmony_ci /// 584a1d56debSopenharmony_ci /// # Brief 585a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 586a1d56debSopenharmony_ci /// 2. Calls `LinkedList::pop_back` on it. 587a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 588a1d56debSopenharmony_ci #[test] 589a1d56debSopenharmony_ci fn ut_linked_list_pop_back() { 590a1d56debSopenharmony_ci let mut list = LinkedList::new(); 591a1d56debSopenharmony_ci assert_eq!(list.pop_back(), None); 592a1d56debSopenharmony_ci 593a1d56debSopenharmony_ci list.push_back(1i32); 594a1d56debSopenharmony_ci assert_eq!(list.pop_back(), Some(1)); 595a1d56debSopenharmony_ci } 596a1d56debSopenharmony_ci 597a1d56debSopenharmony_ci /// UT test for `LinkedList::iter_mut`. 598a1d56debSopenharmony_ci /// 599a1d56debSopenharmony_ci /// # Title 600a1d56debSopenharmony_ci /// ut_linked_list_iter_mut 601a1d56debSopenharmony_ci /// 602a1d56debSopenharmony_ci /// # Brief 603a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 604a1d56debSopenharmony_ci /// 2. Calls `LinkedList::iter_mut` on it. 605a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 606a1d56debSopenharmony_ci #[test] 607a1d56debSopenharmony_ci fn ut_linked_list_iter_mut() { 608a1d56debSopenharmony_ci let mut list = LinkedList::new(); 609a1d56debSopenharmony_ci list.push_back(1i32); 610a1d56debSopenharmony_ci list.push_back(2i32); 611a1d56debSopenharmony_ci 612a1d56debSopenharmony_ci let mut iter = list.iter_mut(); 613a1d56debSopenharmony_ci assert_eq!(iter.next(), Some(&mut 1)); 614a1d56debSopenharmony_ci assert_eq!(iter.next(), Some(&mut 2)); 615a1d56debSopenharmony_ci assert_eq!(iter.next(), None); 616a1d56debSopenharmony_ci } 617a1d56debSopenharmony_ci 618a1d56debSopenharmony_ci /// UT test for `LinkedList::back`. 619a1d56debSopenharmony_ci /// 620a1d56debSopenharmony_ci /// # Title 621a1d56debSopenharmony_ci /// ut_linked_list_back 622a1d56debSopenharmony_ci /// 623a1d56debSopenharmony_ci /// # Brief 624a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 625a1d56debSopenharmony_ci /// 2. Calls `LinkedList::back` on it. 626a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 627a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 628a1d56debSopenharmony_ci #[test] 629a1d56debSopenharmony_ci fn ut_linked_list_back() { 630a1d56debSopenharmony_ci let mut list = LinkedList::new(); 631a1d56debSopenharmony_ci assert_eq!(list.back(), None); 632a1d56debSopenharmony_ci 633a1d56debSopenharmony_ci list.push_back(1i32); 634a1d56debSopenharmony_ci assert_eq!(list.back(), Some(&1)); 635a1d56debSopenharmony_ci } 636a1d56debSopenharmony_ci 637a1d56debSopenharmony_ci /// UT test for `LinkedList::back_mut`. 638a1d56debSopenharmony_ci /// 639a1d56debSopenharmony_ci /// # Title 640a1d56debSopenharmony_ci /// ut_linked_list_back_mut 641a1d56debSopenharmony_ci /// 642a1d56debSopenharmony_ci /// # Brief 643a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 644a1d56debSopenharmony_ci /// 2. Calls `LinkedList::back_mut` on it. 645a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 646a1d56debSopenharmony_ci #[test] 647a1d56debSopenharmony_ci fn ut_linked_list_back_mut() { 648a1d56debSopenharmony_ci let mut list = LinkedList::new(); 649a1d56debSopenharmony_ci assert_eq!(list.back_mut(), None); 650a1d56debSopenharmony_ci 651a1d56debSopenharmony_ci list.push_back(1i32); 652a1d56debSopenharmony_ci assert_eq!(list.back_mut(), Some(&mut 1)); 653a1d56debSopenharmony_ci } 654a1d56debSopenharmony_ci 655a1d56debSopenharmony_ci /// UT test for `LinkedList::back_node`. 656a1d56debSopenharmony_ci /// 657a1d56debSopenharmony_ci /// # Title 658a1d56debSopenharmony_ci /// ut_linked_list_back_node 659a1d56debSopenharmony_ci /// 660a1d56debSopenharmony_ci /// # Brief 661a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 662a1d56debSopenharmony_ci /// 2. Calls `LinkedList::back_node` on it. 663a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 664a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 665a1d56debSopenharmony_ci #[test] 666a1d56debSopenharmony_ci fn ut_linked_list_back_node() { 667a1d56debSopenharmony_ci let mut list = LinkedList::new(); 668a1d56debSopenharmony_ci assert!(list.back_node().is_none()); 669a1d56debSopenharmony_ci 670a1d56debSopenharmony_ci list.push_back(1i32); 671a1d56debSopenharmony_ci assert!(list.back_node().is_some()); 672a1d56debSopenharmony_ci } 673a1d56debSopenharmony_ci 674a1d56debSopenharmony_ci /// UT test for `LinkedList::back_node_mut`. 675a1d56debSopenharmony_ci /// 676a1d56debSopenharmony_ci /// # Title 677a1d56debSopenharmony_ci /// ut_linked_list_back_node_mut 678a1d56debSopenharmony_ci /// 679a1d56debSopenharmony_ci /// # Brief 680a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 681a1d56debSopenharmony_ci /// 2. Calls `LinkedList::back_node_mut` on it. 682a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 683a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 684a1d56debSopenharmony_ci #[test] 685a1d56debSopenharmony_ci fn ut_linked_list_back_node_mut() { 686a1d56debSopenharmony_ci let mut list = LinkedList::new(); 687a1d56debSopenharmony_ci assert!(list.back_node_mut().is_none()); 688a1d56debSopenharmony_ci 689a1d56debSopenharmony_ci list.push_back(1i32); 690a1d56debSopenharmony_ci assert!(list.back_node_mut().is_some()); 691a1d56debSopenharmony_ci } 692a1d56debSopenharmony_ci 693a1d56debSopenharmony_ci /// UT test for `LinkedList::default`. 694a1d56debSopenharmony_ci /// 695a1d56debSopenharmony_ci /// # Title 696a1d56debSopenharmony_ci /// ut_linked_list_default 697a1d56debSopenharmony_ci /// 698a1d56debSopenharmony_ci /// # Brief 699a1d56debSopenharmony_ci /// 1. Calls `LinkedList::default` to create a `LinkedList`. 700a1d56debSopenharmony_ci /// 2. Checks if the test results are correct. 701a1d56debSopenharmony_ci #[test] 702a1d56debSopenharmony_ci fn ut_linked_list_default() { 703a1d56debSopenharmony_ci assert_eq!(LinkedList::<i32>::default(), LinkedList::<i32>::new()); 704a1d56debSopenharmony_ci } 705a1d56debSopenharmony_ci 706a1d56debSopenharmony_ci /// UT test for `LinkedList::eq`. 707a1d56debSopenharmony_ci /// 708a1d56debSopenharmony_ci /// # Title 709a1d56debSopenharmony_ci /// ut_linked_list_eq 710a1d56debSopenharmony_ci /// 711a1d56debSopenharmony_ci /// # Brief 712a1d56debSopenharmony_ci /// 1. Creates some `LinkedList`s. 713a1d56debSopenharmony_ci /// 2. Calls `LinkedList::eq` on them. 714a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 715a1d56debSopenharmony_ci #[test] 716a1d56debSopenharmony_ci fn ut_linked_list_eq() { 717a1d56debSopenharmony_ci let mut list1 = LinkedList::new(); 718a1d56debSopenharmony_ci list1.push_back(1i32); 719a1d56debSopenharmony_ci 720a1d56debSopenharmony_ci let mut list2 = LinkedList::new(); 721a1d56debSopenharmony_ci list2.push_back(1i32); 722a1d56debSopenharmony_ci list2.push_back(2i32); 723a1d56debSopenharmony_ci 724a1d56debSopenharmony_ci let mut list3 = LinkedList::new(); 725a1d56debSopenharmony_ci list3.push_back(1i32); 726a1d56debSopenharmony_ci list3.push_back(3i32); 727a1d56debSopenharmony_ci 728a1d56debSopenharmony_ci assert_eq!(list1, list1); 729a1d56debSopenharmony_ci assert_ne!(list1, list2); 730a1d56debSopenharmony_ci assert_ne!(list2, list3); 731a1d56debSopenharmony_ci } 732a1d56debSopenharmony_ci 733a1d56debSopenharmony_ci /// UT test for `LinkedList::clone`. 734a1d56debSopenharmony_ci /// 735a1d56debSopenharmony_ci /// # Title 736a1d56debSopenharmony_ci /// ut_linked_list_clone 737a1d56debSopenharmony_ci /// 738a1d56debSopenharmony_ci /// # Brief 739a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 740a1d56debSopenharmony_ci /// 2. Calls `LinkedList::clone` to create a copy of it. 741a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 742a1d56debSopenharmony_ci #[test] 743a1d56debSopenharmony_ci fn ut_linked_list_clone() { 744a1d56debSopenharmony_ci let mut list1 = LinkedList::new(); 745a1d56debSopenharmony_ci list1.push_back(1i32); 746a1d56debSopenharmony_ci 747a1d56debSopenharmony_ci let list2 = list1.clone(); 748a1d56debSopenharmony_ci assert_eq!(list1, list2); 749a1d56debSopenharmony_ci } 750a1d56debSopenharmony_ci 751a1d56debSopenharmony_ci /// UT test for `LinkedList::fmt`. 752a1d56debSopenharmony_ci /// 753a1d56debSopenharmony_ci /// # Title 754a1d56debSopenharmony_ci /// ut_linked_list_fmt 755a1d56debSopenharmony_ci /// 756a1d56debSopenharmony_ci /// # Brief 757a1d56debSopenharmony_ci /// 1. Creates a `LinkedList`. 758a1d56debSopenharmony_ci /// 2. Calls `LinkedList::fmt` on it. 759a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 760a1d56debSopenharmony_ci #[test] 761a1d56debSopenharmony_ci fn ut_linked_list_fmt() { 762a1d56debSopenharmony_ci let mut list = LinkedList::new(); 763a1d56debSopenharmony_ci list.push_back(1i32); 764a1d56debSopenharmony_ci list.push_back(2i32); 765a1d56debSopenharmony_ci assert_eq!(format!("{list:?}"), "1,2"); 766a1d56debSopenharmony_ci } 767a1d56debSopenharmony_ci 768a1d56debSopenharmony_ci /// UT test for `Cursor::index`. 769a1d56debSopenharmony_ci /// 770a1d56debSopenharmony_ci /// # Title 771a1d56debSopenharmony_ci /// ut_cursor_index 772a1d56debSopenharmony_ci /// 773a1d56debSopenharmony_ci /// # Brief 774a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `Cursor`. 775a1d56debSopenharmony_ci /// 2. Calls `Cursor::index`. 776a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 777a1d56debSopenharmony_ci #[test] 778a1d56debSopenharmony_ci fn ut_cursor_index() { 779a1d56debSopenharmony_ci let mut list = LinkedList::new(); 780a1d56debSopenharmony_ci list.push_back(1i32); 781a1d56debSopenharmony_ci 782a1d56debSopenharmony_ci let mut cursor = list.cursor_front(); 783a1d56debSopenharmony_ci assert_eq!(cursor.index(), Some(0)); 784a1d56debSopenharmony_ci 785a1d56debSopenharmony_ci cursor.move_next(); 786a1d56debSopenharmony_ci assert_eq!(cursor.index(), None); 787a1d56debSopenharmony_ci } 788a1d56debSopenharmony_ci 789a1d56debSopenharmony_ci /// UT test for `Cursor::move_next`. 790a1d56debSopenharmony_ci /// 791a1d56debSopenharmony_ci /// # Title 792a1d56debSopenharmony_ci /// ut_cursor_move_next 793a1d56debSopenharmony_ci /// 794a1d56debSopenharmony_ci /// # Brief 795a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `Cursor`. 796a1d56debSopenharmony_ci /// 2. Calls `Cursor::move_next`. 797a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 798a1d56debSopenharmony_ci #[test] 799a1d56debSopenharmony_ci fn ut_cursor_move_next() { 800a1d56debSopenharmony_ci let mut list = LinkedList::new(); 801a1d56debSopenharmony_ci list.push_back(1i32); 802a1d56debSopenharmony_ci list.push_back(2i32); 803a1d56debSopenharmony_ci 804a1d56debSopenharmony_ci let mut cursor = list.cursor_front(); 805a1d56debSopenharmony_ci assert_eq!(cursor.current(), Some(&1)); 806a1d56debSopenharmony_ci 807a1d56debSopenharmony_ci cursor.move_next(); 808a1d56debSopenharmony_ci assert_eq!(cursor.current(), Some(&2)); 809a1d56debSopenharmony_ci 810a1d56debSopenharmony_ci cursor.move_next(); 811a1d56debSopenharmony_ci assert_eq!(cursor.current(), None); 812a1d56debSopenharmony_ci 813a1d56debSopenharmony_ci cursor.move_next(); 814a1d56debSopenharmony_ci assert_eq!(cursor.current(), Some(&1)); 815a1d56debSopenharmony_ci } 816a1d56debSopenharmony_ci 817a1d56debSopenharmony_ci /// UT test for `Cursor::move_prev`. 818a1d56debSopenharmony_ci /// 819a1d56debSopenharmony_ci /// # Title 820a1d56debSopenharmony_ci /// ut_cursor_move_prev 821a1d56debSopenharmony_ci /// 822a1d56debSopenharmony_ci /// # Brief 823a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `Cursor`. 824a1d56debSopenharmony_ci /// 2. Calls `Cursor::move_prev`. 825a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 826a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 827a1d56debSopenharmony_ci #[test] 828a1d56debSopenharmony_ci fn ut_cursor_move_prev() { 829a1d56debSopenharmony_ci let mut list = LinkedList::new(); 830a1d56debSopenharmony_ci list.push_back(1i32); 831a1d56debSopenharmony_ci list.push_back(2i32); 832a1d56debSopenharmony_ci 833a1d56debSopenharmony_ci let mut cursor = list.cursor_front(); 834a1d56debSopenharmony_ci assert_eq!(cursor.current(), Some(&1)); 835a1d56debSopenharmony_ci 836a1d56debSopenharmony_ci cursor.move_prev(); 837a1d56debSopenharmony_ci assert_eq!(cursor.current(), None); 838a1d56debSopenharmony_ci 839a1d56debSopenharmony_ci cursor.move_prev(); 840a1d56debSopenharmony_ci assert_eq!(cursor.current(), Some(&2)); 841a1d56debSopenharmony_ci 842a1d56debSopenharmony_ci cursor.move_prev(); 843a1d56debSopenharmony_ci assert_eq!(cursor.current(), Some(&1)); 844a1d56debSopenharmony_ci } 845a1d56debSopenharmony_ci 846a1d56debSopenharmony_ci /// UT test for `Cursor::current_node`. 847a1d56debSopenharmony_ci /// 848a1d56debSopenharmony_ci /// # Title 849a1d56debSopenharmony_ci /// ut_cursor_current_node 850a1d56debSopenharmony_ci /// 851a1d56debSopenharmony_ci /// # Brief 852a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `Cursor`. 853a1d56debSopenharmony_ci /// 2. Calls `Cursor::current_node`. 854a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 855a1d56debSopenharmony_ci #[test] 856a1d56debSopenharmony_ci fn ut_cursor_current_node() { 857a1d56debSopenharmony_ci let mut list = LinkedList::new(); 858a1d56debSopenharmony_ci list.push_back(1i32); 859a1d56debSopenharmony_ci 860a1d56debSopenharmony_ci let mut cursor = list.cursor_front(); 861a1d56debSopenharmony_ci assert!(cursor.current_node().is_some()); 862a1d56debSopenharmony_ci 863a1d56debSopenharmony_ci cursor.move_next(); 864a1d56debSopenharmony_ci assert!(cursor.current_node().is_none()); 865a1d56debSopenharmony_ci } 866a1d56debSopenharmony_ci 867a1d56debSopenharmony_ci /// UT test for `CursorMut::index`. 868a1d56debSopenharmony_ci /// 869a1d56debSopenharmony_ci /// # Title 870a1d56debSopenharmony_ci /// ut_cursor_mut_index 871a1d56debSopenharmony_ci /// 872a1d56debSopenharmony_ci /// # Brief 873a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `CursorMut`. 874a1d56debSopenharmony_ci /// 2. Calls `CursorMut::index`. 875a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 876a1d56debSopenharmony_ci #[test] 877a1d56debSopenharmony_ci fn ut_cursor_mut_index() { 878a1d56debSopenharmony_ci let mut list = LinkedList::new(); 879a1d56debSopenharmony_ci list.push_back(1i32); 880a1d56debSopenharmony_ci 881a1d56debSopenharmony_ci let mut cursor = list.cursor_front_mut(); 882a1d56debSopenharmony_ci assert_eq!(cursor.index(), Some(0)); 883a1d56debSopenharmony_ci 884a1d56debSopenharmony_ci cursor.move_next(); 885a1d56debSopenharmony_ci assert_eq!(cursor.index(), None); 886a1d56debSopenharmony_ci } 887a1d56debSopenharmony_ci 888a1d56debSopenharmony_ci /// UT test for `CursorMut::move_next`. 889a1d56debSopenharmony_ci /// 890a1d56debSopenharmony_ci /// # Title 891a1d56debSopenharmony_ci /// ut_cursor_mut_move_next 892a1d56debSopenharmony_ci /// 893a1d56debSopenharmony_ci /// # Brief 894a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `CursorMut`. 895a1d56debSopenharmony_ci /// 2. Calls `CursorMut::move_next`. 896a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 897a1d56debSopenharmony_ci #[test] 898a1d56debSopenharmony_ci fn ut_cursor_mut_move_next() { 899a1d56debSopenharmony_ci let mut list = LinkedList::new(); 900a1d56debSopenharmony_ci list.push_back(1i32); 901a1d56debSopenharmony_ci 902a1d56debSopenharmony_ci let mut cursor = list.cursor_front_mut(); 903a1d56debSopenharmony_ci assert!(cursor.current_node().is_some()); 904a1d56debSopenharmony_ci 905a1d56debSopenharmony_ci cursor.move_next(); 906a1d56debSopenharmony_ci assert!(cursor.current_node().is_none()); 907a1d56debSopenharmony_ci 908a1d56debSopenharmony_ci cursor.move_next(); 909a1d56debSopenharmony_ci assert!(cursor.current_node().is_some()); 910a1d56debSopenharmony_ci } 911a1d56debSopenharmony_ci 912a1d56debSopenharmony_ci /// UT test for `CursorMut::move_prev`. 913a1d56debSopenharmony_ci /// 914a1d56debSopenharmony_ci /// # Title 915a1d56debSopenharmony_ci /// ut_cursor_mut_move_prev 916a1d56debSopenharmony_ci /// 917a1d56debSopenharmony_ci /// # Brief 918a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `CursorMut`. 919a1d56debSopenharmony_ci /// 2. Calls `CursorMut::move_prev`. 920a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 921a1d56debSopenharmony_ci #[cfg(feature = "list_array")] 922a1d56debSopenharmony_ci #[test] 923a1d56debSopenharmony_ci fn ut_cursor_mut_move_prev() { 924a1d56debSopenharmony_ci let mut list = LinkedList::new(); 925a1d56debSopenharmony_ci list.push_back(1i32); 926a1d56debSopenharmony_ci 927a1d56debSopenharmony_ci let mut cursor = list.cursor_front_mut(); 928a1d56debSopenharmony_ci assert!(cursor.current_node().is_some()); 929a1d56debSopenharmony_ci 930a1d56debSopenharmony_ci cursor.move_prev(); 931a1d56debSopenharmony_ci assert!(cursor.current_node().is_none()); 932a1d56debSopenharmony_ci 933a1d56debSopenharmony_ci cursor.move_prev(); 934a1d56debSopenharmony_ci assert!(cursor.current_node().is_some()); 935a1d56debSopenharmony_ci } 936a1d56debSopenharmony_ci 937a1d56debSopenharmony_ci /// UT test for `CursorMut::current`. 938a1d56debSopenharmony_ci /// 939a1d56debSopenharmony_ci /// # Title 940a1d56debSopenharmony_ci /// ut_cursor_mut_current 941a1d56debSopenharmony_ci /// 942a1d56debSopenharmony_ci /// # Brief 943a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `CursorMut`. 944a1d56debSopenharmony_ci /// 2. Calls `CursorMut::current`. 945a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 946a1d56debSopenharmony_ci #[cfg(feature = "list_object")] 947a1d56debSopenharmony_ci #[test] 948a1d56debSopenharmony_ci fn ut_cursor_mut_current() { 949a1d56debSopenharmony_ci let mut list = LinkedList::new(); 950a1d56debSopenharmony_ci list.push_back(1i32); 951a1d56debSopenharmony_ci 952a1d56debSopenharmony_ci let mut cursor = list.cursor_front_mut(); 953a1d56debSopenharmony_ci assert_eq!(cursor.current(), Some(&mut 1)); 954a1d56debSopenharmony_ci 955a1d56debSopenharmony_ci cursor.move_next(); 956a1d56debSopenharmony_ci assert_eq!(cursor.current(), None); 957a1d56debSopenharmony_ci } 958a1d56debSopenharmony_ci 959a1d56debSopenharmony_ci /// UT test for `CursorMut::current`. 960a1d56debSopenharmony_ci /// 961a1d56debSopenharmony_ci /// # Title 962a1d56debSopenharmony_ci /// ut_cursor_mut_current 963a1d56debSopenharmony_ci /// 964a1d56debSopenharmony_ci /// # Brief 965a1d56debSopenharmony_ci /// 1. Creates a `LinkedList` and a `CursorMut`. 966a1d56debSopenharmony_ci /// 2. Calls `CursorMut::current`. 967a1d56debSopenharmony_ci /// 3. Checks if the test results are correct. 968a1d56debSopenharmony_ci #[test] 969a1d56debSopenharmony_ci fn ut_cursor_mut_remove_current() { 970a1d56debSopenharmony_ci let mut list = LinkedList::new(); 971a1d56debSopenharmony_ci list.push_back(1i32); 972a1d56debSopenharmony_ci 973a1d56debSopenharmony_ci let mut cursor = list.cursor_front_mut(); 974a1d56debSopenharmony_ci assert_eq!(cursor.remove_current(), Some(1)); 975a1d56debSopenharmony_ci assert_eq!(cursor.remove_current(), None); 976a1d56debSopenharmony_ci } 977a1d56debSopenharmony_ci} 978