/* * This file is part of Applied Energistics 2. * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. * * Applied Energistics 2 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Applied Energistics 2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>. */ package appeng.parts.automation; import java.util.ArrayList; import java.util.List; import com.google.common.base.Strings; /** * Models in which directions - looking at the front face - a plane (annihilation, formation, etc.) is connected to other planes of the same type. */ public final class PlaneConnections { private final boolean up; private final boolean right; private final boolean down; private final boolean left; private static final int BITMASK_UP = 8; private static final int BITMASK_RIGHT = 4; private static final int BITMASK_DOWN = 2; private static final int BITMASK_LEFT = 1; public static final List<PlaneConnections> PERMUTATIONS = generatePermutations(); private static List<PlaneConnections> generatePermutations() { List<PlaneConnections> connections = new ArrayList<>( 16 ); for( int i = 0; i < 16; i++ ) { boolean up = ( i & BITMASK_UP ) != 0; boolean right = ( i & BITMASK_RIGHT ) != 0; boolean down = ( i & BITMASK_DOWN ) != 0; boolean left = ( i & BITMASK_LEFT ) != 0; connections.add( new PlaneConnections( up, right, down, left ) ); } return connections; } private PlaneConnections( boolean up, boolean right, boolean down, boolean left ) { this.up = up; this.right = right; this.down = down; this.left = left; } public static PlaneConnections of( boolean up, boolean right, boolean down, boolean left ) { return PERMUTATIONS.get( getIndex( up, right, down, left ) ); } public boolean isUp() { return up; } public boolean isRight() { return right; } public boolean isDown() { return down; } public boolean isLeft() { return left; } // The combination of connections expressed as a number ranging from [0,15] public int getIndex() { return getIndex( up, right, down, left ); } private static int getIndex( boolean up, boolean right, boolean down, boolean left ) { return ( up ? BITMASK_UP : 0 ) + ( right ? BITMASK_RIGHT : 0 ) + ( left ? BITMASK_LEFT : 0 ) + ( down ? BITMASK_DOWN : 0 ); } // Returns a suffix that expresses the connection states as a string public String getFilenameSuffix() { String suffix = Integer.toBinaryString( getIndex() ); return Strings.padStart(suffix, 4, '0'); } @Override public boolean equals( Object o ) { if( this == o ) { return true; } if( o == null || getClass() != o.getClass() ) { return false; } PlaneConnections that = (PlaneConnections) o; return up == that.up && right == that.right && down == that.down && left == that.left; } @Override public int hashCode() { int result = ( up ? 1 : 0 ); result = 31 * result + ( right ? 1 : 0 ); result = 31 * result + ( down ? 1 : 0 ); result = 31 * result + ( left ? 1 : 0 ); return result; } }