/**
  * Copyright (c): Uwe Schmidt, FH Wedel
  *
  * You may study, modify and distribute this source code
  * FOR NON-COMMERCIAL PURPOSES ONLY.
  * This copyright message has to remain unchanged.
  *
  * Note that this document is provided 'as is',
  * WITHOUT WARRANTY of any kind either expressed or implied.
  */

package ds.util;

import static ds.util.Boolean.toInt;


public
    class Integer {
    // min and max become obsolete with Java 8

    public static int max(int i, int j) {
        return
            i <= j ? j : i;
    }
    public static int min(int i, int j) {
        return
            j <= i ? j : i;
    }

    // second try
    public static int compareUnsigned(int i1, int i2) {
	long l1 = (long)i1 & 0xFFFFFFFFl;
	long l2 = (long)i2 & 0xFFFFFFFFl;

	return
	    toInt(l1 >= l2) - toInt(l1 <= l2);
    }

    //----------------------------------------
    // bitstring operations
    // unsed in IntMap implementation

    // access the leading bits of a word
    public static int getPrefix(int bs, int mask) {
	return
	    bs & (~ (mask - 1) ^ mask);
    }

    // compute the mask identifying the common prefix of two words
    public static int commonPrefixMask(int bs1, int bs2) {
	return
	    zeroPrefix(bs1 ^ bs2);
    }

    // compare the leading part of a word with a prefix
    public static boolean matchPrefix(int bs, int px, int mask) {
	return
	    getPrefix(bs, mask) == px;
    }

    // remove all bits set except the most significant
    public static int zeroPrefix(int bs1) {
	bs1 |= bs1 >>>  1;
	bs1 |= bs1 >>>  2;
	bs1 |= bs1 >>>  4;
	bs1 |= bs1 >>>  8;
	bs1 |= bs1 >>> 16;
	// bs1 |= bs1 >>> 32; // needed for long

	return
	    bs1 ^ (bs1 >>> 1);
    }

    public static boolean shorterMask(int mask1, int mask2) {
	return
	    compareUnsigned(mask1, mask2) > 0;
    }

    //----------------------------------------
    // a mask is a int which has set a single bit
    // the mask is used for indexing a single bit within a word
    // or to access all leading bit downto the bit index

    public static boolean invMask(int m) {
	return
	    ( m != 0
	      &&
	      (m ^ (m & (~m + 1))) == 0 );
    }

    //----------------------------------------
    // test output for bitstrings

    static final int LEN_BITSTRING = 32; // int

    public static String toStringBS(int bs) {
	StringBuffer res   = new StringBuffer();
	int          i     = LEN_BITSTRING;
	boolean      blank = false;

	while ( i > 0 ) {
	    if ( blank )
		res.append(' ');
	    --i;
	    res.append((char)(((bs >>> i) & 0x1) + (int)'0'));
	    blank = i % 8 == 0;
	}
	return
	    new String(res);
    }

    public static String toStringPX(int px, int mask) {
	StringBuffer res   = new StringBuffer();
	int          i     = LEN_BITSTRING;
	boolean      blank = false;

	while ( (((int)1 << (i - 1)) & mask) == 0 ) {
	    if ( blank )
		res.append(' ');
	    --i;
	    res.append((char)(((px >>> i) & 0x1) + (int)'0'));
	    blank = i % 8 == 0;
	}
	return
	    new String(res);
    }

}