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