11cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta/*
21cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Copyright (C) 2013 The Android Open Source Project
31cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta *
41cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License");
51cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * you may not use this file except in compliance with the License.
61cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * You may obtain a copy of the License at
71cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta *
81cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta *      http://www.apache.org/licenses/LICENSE-2.0
91cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta *
101cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Unless required by applicable law or agreed to in writing, software
111cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS,
121cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * See the License for the specific language governing permissions and
141cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * limitations under the License.
151cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta */
161cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
171cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptapackage com.android.tools.layoutlib.java;
181cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
191cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptaimport java.nio.charset.Charset;
201cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
211cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta/**
221cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Defines the same class as the java.lang.UnsafeByteSequence which was added in
231cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Dalvik VM. This hack, provides a replacement for that class which can't be
241cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * loaded in the standard JVM since it's in the java package and standard JVM
251cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * doesn't have it.
261cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * <p/>
271cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Extracted from API level 18, file:
281cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * platform/libcore/luni/src/main/java/java/lang/UnsafeByteSequence.java
291cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta */
301cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptapublic class UnsafeByteSequence {
311cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    private byte[] bytes;
321cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    private int count;
331cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
341cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    public UnsafeByteSequence(int initialCapacity) {
351cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        this.bytes = new byte[initialCapacity];
361cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    }
371cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
381cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    public int size() {
391cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        return count;
401cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    }
411cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
421cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    /**
431cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta     * Moves the write pointer back to the beginning of the sequence,
441cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta     * but without resizing or reallocating the buffer.
451cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta     */
461cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    public void rewind() {
471cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        count = 0;
481cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    }
491cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
501cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    public void write(byte[] buffer, int offset, int length) {
511cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        if (count + length >= bytes.length) {
521cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta            byte[] newBytes = new byte[(count + length) * 2];
531cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta            System.arraycopy(bytes, 0, newBytes, 0, count);
541cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta            bytes = newBytes;
551cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        }
561cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        System.arraycopy(buffer, offset, bytes, count, length);
571cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        count += length;
581cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    }
591cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
601cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    public void write(int b) {
611cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        if (count == bytes.length) {
621cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta            byte[] newBytes = new byte[count * 2];
631cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta            System.arraycopy(bytes, 0, newBytes, 0, count);
641cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta            bytes = newBytes;
651cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        }
661cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        bytes[count++] = (byte) b;
671cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    }
681cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
691cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    public byte[] toByteArray() {
701cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        if (count == bytes.length) {
711cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta            return bytes;
721cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        }
731cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        byte[] result = new byte[count];
741cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        System.arraycopy(bytes, 0, result, 0, count);
751cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        return result;
761cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    }
771cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta
781cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    public String toString(Charset cs) {
791cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta        return new String(bytes, 0, count, cs);
801cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta    }
811cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta}
82