litesoft
@ 947
litesoft / trunk / DeviceDesktopTest / src / org / litesoft / commonfoundation / base / Compare.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
// This Source Code is in the Public Domain per: http://unlicense.org package org.litesoft.commonfoundation.base; @SuppressWarnings({"unchecked"}) public class Compare { private int mResult; protected Compare( int pResult ) { mResult = pResult; } /** * Compares pA object with the pB object for order. Nulls rise!<p> * * @return a negative integer, zero, or a positive integer as the pA object * is less than, equal to, or greater than the pB object. * * @throws ClassCastException if the specified object's type prevents it * from being compared to this Object. */ public static int nullsOK( Comparable pThis, Comparable pThem ) { return firstNullsOK( pThis, pThem ).result(); } /** * Compares pA object with the pB object for Ascending Order. Nulls rise!<p> * * @return a negative integer, zero, or a positive integer as the pA object * is less than, equal to, or greater than the pB object. * * @throws ClassCastException if the specified object's type prevents it * from being compared to this Object. */ public static int ascending( Comparable pThis, Comparable pThem ) { return firstNullsOK( pThis, pThem ).result(); } /** * Compares pA object with the pB object for Descending Order. Nulls sink!<p> * * @return a negative integer, zero, or a positive integer as the pA object * is greater than, equal to, or less than the pB object. * * @throws ClassCastException if the specified object's type prevents it * from being compared to this Object. */ public static int descending( Comparable pThis, Comparable pThem ) { return ascending( pThem, pThis ); // Note param flipped order! } public static boolean firstLessThanSecond( Comparable pFirst, Comparable pSecond ) { //noinspection unchecked return pFirst.compareTo( pSecond ) < 0; } public static boolean firstGreaterThanSecond( Comparable pFirst, Comparable pSecond ) { //noinspection unchecked return pFirst.compareTo( pSecond ) > 0; } public final int result() { return mResult; } private static final Compare NEGATIVE = new Compare( -1 ); private static final Compare POSITIVE = new Compare( 1 ); private static final Compare ZERO = new Compare( 0 ) { private Compare vector( int pCompareTo ) { return (pCompareTo == 0) ? this : (pCompareTo < 0) ? NEGATIVE : POSITIVE; } @Override public Compare then( Comparable pA, Comparable pB ) { if ( pA == pB ) // same or both null { return this; } // noinspection unchecked return vector( (pA != null) ? pA.compareTo( pB ) : -(pB.compareTo( pA )) ); } @Override public Compare thenNullsOK( Comparable pA, Comparable pB ) { if ( pA == pB ) // same or both null { return this; } return (pA == null) ? NEGATIVE : (pB == null) ? POSITIVE : vector( pA.compareTo( pB ) ); } @Override public Compare then( boolean pA, boolean pB ) { return (pA == pB) ? this : then( (pA ? 1 : 0), (pB ? 1 : 0) ); } @Override public Compare then( int pA, int pB ) { return vector( pA - pB ); } }; public static Compare first( Comparable pA, Comparable pB ) { return ZERO.then( pA, pB ); } public Compare then( Comparable pA, Comparable pB ) { return this; } /** * Nulls Rise */ public static Compare firstNullsOK( Comparable pA, Comparable pB ) { return ZERO.thenNullsOK( pA, pB ); } /** * Nulls Rise */ public Compare thenNullsOK( Comparable pA, Comparable pB ) { return this; } public static Compare first( boolean pA, boolean pB ) { return ZERO.then( pA, pB ); } public Compare then( boolean pA, boolean pB ) { return this; } public static Compare first( int pA, int pB ) { return ZERO.then( pA, pB ); } public Compare then( int pA, int pB ) { return this; } } |