19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.util;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link CharSequence} utility methods.
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class CharSequences {
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adapts {@link CharSequence} to an array of ASCII (7-bits per character)
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bytes.
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bytes ASCII bytes
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static CharSequence forAsciiBytes(final byte[] bytes) {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new CharSequence() {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public char charAt(int index) {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (char) bytes[index];
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int length() {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return bytes.length;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public CharSequence subSequence(int start, int end) {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return forAsciiBytes(bytes, start, end);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public String toString() {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new String(bytes);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adapts {@link CharSequence} to an array of ASCII (7-bits per character)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bytes.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bytes ASCII bytes
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param start index, inclusive
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param end index, exclusive
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IndexOutOfBoundsException if start or end are negative, if end
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  is greater than length(), or if start is greater than end
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static CharSequence forAsciiBytes(final byte[] bytes,
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int start, final int end) {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validate(start, end, bytes.length);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new CharSequence() {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public char charAt(int index) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (char) bytes[index + start];
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int length() {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return end - start;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public CharSequence subSequence(int newStart, int newEnd) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newStart -= start;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newEnd -= start;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                validate(newStart, newEnd, length());
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return forAsciiBytes(bytes, newStart, newEnd);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public String toString() {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new String(bytes, start, length());
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void validate(int start, int end, int length) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (start < 0) throw new IndexOutOfBoundsException();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (end < 0) throw new IndexOutOfBoundsException();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (end > length) throw new IndexOutOfBoundsException();
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (start > end) throw new IndexOutOfBoundsException();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Compares two character sequences for equality.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean equals(CharSequence a, CharSequence b) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.length() != b.length()) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int length = a.length();
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < length; i++) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a.charAt(i) != b.charAt(i)) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Compares two character sequences with API like {@link Comparable#compareTo}.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param me The CharSequence that receives the compareTo call.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param another The other CharSequence.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return See {@link Comparable#compareTo}.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int compareToIgnoreCase(CharSequence me, CharSequence another) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Code adapted from String#compareTo
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int myLen = me.length(), anotherLen = another.length();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int myPos = 0, anotherPos = 0, result;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int end = (myLen < anotherLen) ? myLen : anotherLen;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (myPos < end) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((result = Character.toLowerCase(me.charAt(myPos++))
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    - Character.toLowerCase(another.charAt(anotherPos++))) != 0) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return myLen - anotherLen;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
132