using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
public abstract class ParkingLotBase
private static readonly ReaderWriterLockSlim slimLock = new ReaderWriterLockSlim();
private static Dictionary<int, ParkingSpot> parkingSpots = new Dictionary<int, ParkingSpot>();
public ParkingLotBase(Config assignmentMap)
if (assignmentMap == null)
throw new ArgumentNullException();
private void Init(Config parkingLotConfiguration)
var spots = parkingLotConfiguration.GetParkingAssignment();
slimLock.EnterWriteLock();
foreach (var spot in spots)
if (!parkingSpots.Keys.Contains(spot.ParkingSpotNumber))
parkingSpots.Add(spot.ParkingSpotNumber, spot);
slimLock.ExitWriteLock();
public ParkingSpot FindParkingSpot(VehicleBase vehicle)
throw new ArgumentNullException();
slimLock.EnterReadLock();
return parkingSpots.Values.Where(spot => spot.Size >= vehicle.Size && spot.isAvailable == true).FirstOrDefault();
public ParkingSpot FindParkingSpot(int parkingSpotNumber)
if (parkingSpotNumber == 0)
throw new ArgumentException();
slimLock.EnterReadLock();
return parkingSpots.Values.Where(spot => spot.ParkingSpotNumber == parkingSpotNumber).FirstOrDefault();
public ParkingSpot ParkVehicle(VehicleBase vehicle)
throw new ArgumentNullException();
slimLock.EnterWriteLock();
var parkingSpot = parkingSpots.Values.Where(spot => spot.Size >= vehicle.Size && spot.isAvailable == true).FirstOrDefault();
parkingSpot.isAvailable = false;
parkingSpot.ParkedVehicle = vehicle;
parkingSpots[parkingSpot.ParkingSpotNumber] = parkingSpot;
slimLock.ExitWriteLock();
public int CountAllParkingSpots()
return parkingSpots.Count;
public int CountAvailableParkingSpots()
slimLock.EnterReadLock();
return parkingSpots.Values.Where(spot => spot.isAvailable == true).Count();