// 
// Decompiled by Procyon v0.6.0
// 

package io.netty.util.internal;

public final class SWARUtil
{
    public static long compilePattern(final byte byteToFind) {
        return ((long)byteToFind & 0xFFL) * 72340172838076673L;
    }
    
    public static long applyPattern(final long word, final long pattern) {
        final long input = word ^ pattern;
        final long tmp = (input & 0x7F7F7F7F7F7F7F7FL) + 9187201950435737471L;
        return ~(tmp | input | 0x7F7F7F7F7F7F7F7FL);
    }
    
    public static int getIndex(final long word, final boolean isBigEndian) {
        final int zeros = isBigEndian ? Long.numberOfLeadingZeros(word) : Long.numberOfTrailingZeros(word);
        return zeros >>> 3;
    }
    
    private static long applyUpperCasePattern(final long word) {
        long rotated = word & 0x7F7F7F7F7F7F7F7FL;
        rotated += 2676586395008836901L;
        rotated &= 0x7F7F7F7F7F7F7F7FL;
        rotated += 1880844493789993498L;
        rotated &= ~word;
        rotated &= 0x8080808080808080L;
        return rotated;
    }
    
    private static int applyUpperCasePattern(final int word) {
        int rotated = word & 0x7F7F7F7F;
        rotated += 623191333;
        rotated &= 0x7F7F7F7F;
        rotated += 437918234;
        rotated &= ~word;
        rotated &= 0x80808080;
        return rotated;
    }
    
    private static long applyLowerCasePattern(final long word) {
        long rotated = word & 0x7F7F7F7F7F7F7F7FL;
        rotated += 361700864190383365L;
        rotated &= 0x7F7F7F7F7F7F7F7FL;
        rotated += 1880844493789993498L;
        rotated &= ~word;
        rotated &= 0x8080808080808080L;
        return rotated;
    }
    
    private static int applyLowerCasePattern(final int word) {
        int rotated = word & 0x7F7F7F7F;
        rotated += 84215045;
        rotated &= 0x7F7F7F7F;
        rotated += 437918234;
        rotated &= ~word;
        rotated &= 0x80808080;
        return rotated;
    }
    
    public static boolean containsUpperCase(final long word) {
        return applyUpperCasePattern(word) != 0L;
    }
    
    public static boolean containsUpperCase(final int word) {
        return applyUpperCasePattern(word) != 0;
    }
    
    public static boolean containsLowerCase(final long word) {
        return applyLowerCasePattern(word) != 0L;
    }
    
    public static boolean containsLowerCase(final int word) {
        return applyLowerCasePattern(word) != 0;
    }
    
    public static long toLowerCase(final long word) {
        final long mask = applyUpperCasePattern(word) >>> 2;
        return word | mask;
    }
    
    public static int toLowerCase(final int word) {
        final int mask = applyUpperCasePattern(word) >>> 2;
        return word | mask;
    }
    
    public static long toUpperCase(final long word) {
        final long mask = applyLowerCasePattern(word) >>> 2;
        return word & ~mask;
    }
    
    public static int toUpperCase(final int word) {
        final int mask = applyLowerCasePattern(word) >>> 2;
        return word & ~mask;
    }
    
    private SWARUtil() {
    }
}
