package org.jgroups.util;

import java.util.Arrays;

/**
 * Simple string implemented as a byte[] array. Each character's higher 8 bits are truncated and
 * only the lower 8 bits are stored. AsciiString is mutable for efficiency reasons, but the chars array should never
 * be changed !
 * @author Bela Ban
 * @since  3.5
 */
public class AsciiString implements Comparable<AsciiString> {
    protected final byte[] val;

    public AsciiString() {
        val=new byte[]{};
    }

    public AsciiString(String str) {
        int length=str != null? str.length() : 0;
        this.val=new byte[length];
        for(int i=0; i < length; i++)
            val[i]=(byte)str.charAt(i);
    }

    public AsciiString(AsciiString str) {
        this.val=str.val;
    }

    public AsciiString(byte[] val) {
        this.val=val; // mutable, used only for creation
    }

    public AsciiString(int length) {
        this.val=new byte[length];
    }

    public byte[] chars() {return val;} // mutable

    public int length() {
        return val.length;
    }

    public int compareTo(AsciiString str) {
        if(str == null) return 1;
        if(chars().hashCode() == str.val.hashCode())
            return 0;

        int len1=val.length;
        int len2=str.val.length;
        int lim=Math.min(len1, len2);

        int k = 0;
        while (k < lim) {
            byte c1 =val[k];
            byte c2 =str.val[k];
            if (c1 != c2)
                return c1 > c2? 1 : -1;
            k++;
        }
        return len1 > len2? 1 : len1 < len2? -1 : 0;
    }



    public boolean equals(Object obj) {
        return obj instanceof AsciiString && equals(((AsciiString)obj).val);
    }

    public boolean equals(byte[] other) {
        return Arrays.equals(val, other);
    }


    public int hashCode() {
        int h=0;
        if(val != null)
            for(int i=0; i < val.length; i++)
                h=31 * h + val[i];
        return h;
    }

    public String toString() {
        return new String(val);
    }





}
