1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.gallery3d.util;
18 
19 
20 public class LinkedNode {
21     /* package */ LinkedNode mPrev;
22     /* package */ LinkedNode mNext;
23 
LinkedNode()24     public LinkedNode() {
25         mPrev = mNext = this;
26     }
27 
insert(LinkedNode node)28     public void insert(LinkedNode node) {
29         node.mNext = mNext;
30         mNext.mPrev = node;
31         node.mPrev = this;
32         mNext = node;
33     }
34 
remove()35     public void remove() {
36         if (mNext == this) throw new IllegalStateException();
37         mPrev.mNext = mNext;
38         mNext.mPrev = mPrev;
39         mPrev = mNext = null;
40     }
41 
42     @SuppressWarnings("unchecked")
43     public static class List<T extends LinkedNode> {
44         private LinkedNode mHead = new LinkedNode();
45 
insertLast(T node)46         public void insertLast(T node) {
47             mHead.mPrev.insert(node);
48         }
49 
getFirst()50         public T getFirst() {
51             return (T) (mHead.mNext == mHead ? null : mHead.mNext);
52         }
53 
getLast()54         public T getLast() {
55             return (T) (mHead.mPrev == mHead ? null : mHead.mPrev);
56         }
57 
nextOf(T node)58         public T nextOf(T node) {
59             return (T) (node.mNext == mHead ? null : node.mNext);
60         }
61 
previousOf(T node)62         public T previousOf(T node) {
63             return (T) (node.mPrev == mHead ? null : node.mPrev);
64         }
65 
66     }
67 
newList()68     public static <T extends LinkedNode> List<T> newList() {
69         return new List<T>();
70     }
71 }
72