xref: /aosp_15_r20/external/replicaisland/src/com/replica/replicaisland/PhasedObjectManager.java (revision 5eae8ebb3c5756e41e77a1f7201fcf94b0eade1f)
1*5eae8ebbSCole Faust /*
2*5eae8ebbSCole Faust  * Copyright (C) 2010 The Android Open Source Project
3*5eae8ebbSCole Faust  *
4*5eae8ebbSCole Faust  * Licensed under the Apache License, Version 2.0 (the "License");
5*5eae8ebbSCole Faust  * you may not use this file except in compliance with the License.
6*5eae8ebbSCole Faust  * You may obtain a copy of the License at
7*5eae8ebbSCole Faust  *
8*5eae8ebbSCole Faust  *      http://www.apache.org/licenses/LICENSE-2.0
9*5eae8ebbSCole Faust  *
10*5eae8ebbSCole Faust  * Unless required by applicable law or agreed to in writing, software
11*5eae8ebbSCole Faust  * distributed under the License is distributed on an "AS IS" BASIS,
12*5eae8ebbSCole Faust  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5eae8ebbSCole Faust  * See the License for the specific language governing permissions and
14*5eae8ebbSCole Faust  * limitations under the License.
15*5eae8ebbSCole Faust  */
16*5eae8ebbSCole Faust 
17*5eae8ebbSCole Faust 
18*5eae8ebbSCole Faust package com.replica.replicaisland;
19*5eae8ebbSCole Faust 
20*5eae8ebbSCole Faust import java.util.Comparator;
21*5eae8ebbSCole Faust 
22*5eae8ebbSCole Faust /**
23*5eae8ebbSCole Faust  * A derivation of ObjectManager that sorts its children if they are of type PhasedObject.
24*5eae8ebbSCole Faust  * Sorting is performed on add.
25*5eae8ebbSCole Faust  */
26*5eae8ebbSCole Faust public class PhasedObjectManager extends ObjectManager {
27*5eae8ebbSCole Faust     private final static PhasedObjectComparator sPhasedObjectComparator
28*5eae8ebbSCole Faust         = new PhasedObjectComparator();
29*5eae8ebbSCole Faust     private boolean mDirty;
30*5eae8ebbSCole Faust     private PhasedObject mSearchDummy;  // A dummy object allocated up-front for searching by phase.
31*5eae8ebbSCole Faust 
PhasedObjectManager()32*5eae8ebbSCole Faust     public PhasedObjectManager() {
33*5eae8ebbSCole Faust         super();
34*5eae8ebbSCole Faust         mDirty = false;
35*5eae8ebbSCole Faust         getObjects().setComparator(sPhasedObjectComparator);
36*5eae8ebbSCole Faust         getPendingObjects().setComparator(sPhasedObjectComparator);
37*5eae8ebbSCole Faust         mSearchDummy = new PhasedObject();
38*5eae8ebbSCole Faust     }
39*5eae8ebbSCole Faust 
PhasedObjectManager(int arraySize)40*5eae8ebbSCole Faust     public PhasedObjectManager(int arraySize) {
41*5eae8ebbSCole Faust         super(arraySize);
42*5eae8ebbSCole Faust         mDirty = false;
43*5eae8ebbSCole Faust         getObjects().setComparator(sPhasedObjectComparator);
44*5eae8ebbSCole Faust         getPendingObjects().setComparator(sPhasedObjectComparator);
45*5eae8ebbSCole Faust         mSearchDummy = new PhasedObject();
46*5eae8ebbSCole Faust     }
47*5eae8ebbSCole Faust 
48*5eae8ebbSCole Faust     @Override
commitUpdates()49*5eae8ebbSCole Faust     public void commitUpdates() {
50*5eae8ebbSCole Faust         super.commitUpdates();
51*5eae8ebbSCole Faust         if (mDirty) {
52*5eae8ebbSCole Faust             getObjects().sort(true);
53*5eae8ebbSCole Faust             mDirty = false;
54*5eae8ebbSCole Faust         }
55*5eae8ebbSCole Faust     }
56*5eae8ebbSCole Faust 
57*5eae8ebbSCole Faust     @Override
add(BaseObject object)58*5eae8ebbSCole Faust     public void add(BaseObject object) {
59*5eae8ebbSCole Faust 
60*5eae8ebbSCole Faust         if (object instanceof PhasedObject) {
61*5eae8ebbSCole Faust             super.add(object);
62*5eae8ebbSCole Faust             mDirty = true;
63*5eae8ebbSCole Faust         } else {
64*5eae8ebbSCole Faust             // The only reason to restrict PhasedObjectManager to PhasedObjects is so that
65*5eae8ebbSCole Faust             // the PhasedObjectComparator can assume all of its contents are PhasedObjects and
66*5eae8ebbSCole Faust             // avoid calling instanceof every time.
67*5eae8ebbSCole Faust             assert false : "Can't add a non-PhasedObject to a PhasedObjectManager!";
68*5eae8ebbSCole Faust         }
69*5eae8ebbSCole Faust     }
70*5eae8ebbSCole Faust 
find(int phase)71*5eae8ebbSCole Faust     public BaseObject find(int phase) {
72*5eae8ebbSCole Faust         mSearchDummy.setPhase(phase);
73*5eae8ebbSCole Faust         int index = getObjects().find(mSearchDummy, false);
74*5eae8ebbSCole Faust         BaseObject result = null;
75*5eae8ebbSCole Faust         if (index != -1) {
76*5eae8ebbSCole Faust             result = getObjects().get(index);
77*5eae8ebbSCole Faust         } else {
78*5eae8ebbSCole Faust             index = getPendingObjects().find(mSearchDummy, false);
79*5eae8ebbSCole Faust             if (index != -1) {
80*5eae8ebbSCole Faust                 result = getPendingObjects().get(index);
81*5eae8ebbSCole Faust             }
82*5eae8ebbSCole Faust         }
83*5eae8ebbSCole Faust         return result;
84*5eae8ebbSCole Faust     }
85*5eae8ebbSCole Faust 
86*5eae8ebbSCole Faust     /** Comparator for phased objects. */
87*5eae8ebbSCole Faust     private static class PhasedObjectComparator implements Comparator<BaseObject>  {
compare(BaseObject object1, BaseObject object2)88*5eae8ebbSCole Faust         public int compare(BaseObject object1, BaseObject object2) {
89*5eae8ebbSCole Faust             int result = 0;
90*5eae8ebbSCole Faust             if (object1 != null && object2 != null) {
91*5eae8ebbSCole Faust                 result = ((PhasedObject) object1).phase - ((PhasedObject) object2).phase;
92*5eae8ebbSCole Faust             } else if (object1 == null && object2 != null) {
93*5eae8ebbSCole Faust                 result = 1;
94*5eae8ebbSCole Faust             } else if (object2 == null && object1 != null) {
95*5eae8ebbSCole Faust                 result = -1;
96*5eae8ebbSCole Faust             }
97*5eae8ebbSCole Faust             return result;
98*5eae8ebbSCole Faust         }
99*5eae8ebbSCole Faust     }
100*5eae8ebbSCole Faust 
101*5eae8ebbSCole Faust }
102