package com.someluigi.slperiph.ccportable.shared; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; import net.minecraft.util.Vec3; public class WirelessNetwork { protected Map<Integer, Set<PeripheralTerminal>> frequencies = new HashMap<Integer, Set<PeripheralTerminal>>(); protected static Set<PeripheralTerminal> newDeviceSet(){ return Collections.newSetFromMap( new WeakHashMap<PeripheralTerminal, Boolean>() ); } public synchronized void addDevice( PeripheralTerminal trans ){ Integer key = Integer.valueOf( trans.getFreq() ); Set<PeripheralTerminal> devices = frequencies.get(key); if ( devices == null ){ devices = newDeviceSet(); frequencies.put(key, devices); } devices.add(trans); } public synchronized void removeDevice( PeripheralTerminal trans ){ Integer key = Integer.valueOf( trans.getFreq() ); Set<PeripheralTerminal> devices = frequencies.get(key); if ( devices != null ){ devices.remove(trans); if ( devices.isEmpty() ) frequencies.remove(devices); } } public synchronized Set<PeripheralTerminal> queryDevices( Vec3 pos, int freq ){ Integer key = Integer.valueOf( freq ); Set<PeripheralTerminal> devices = frequencies.get(key); if ( devices == null ) return null; Set<PeripheralTerminal> result = new HashSet<PeripheralTerminal>(); for ( PeripheralTerminal tile : devices ){ if ( tile.canConnectTo(pos) ) result.add(tile); } return result; } public synchronized PeripheralTerminal querySingleDevice( Vec3 pos, int freq ){ Set<PeripheralTerminal> result = queryDevices(pos, freq); if ( result != null && result.size() == 1 ) return result.iterator().next(); return null; } }