#include <iostream>
#include <vector>
#include <memory>
enum class VehicleSize { SMALL, MEDIUM, LARGE };
class Vehicle {
protected:
std::string plate;
VehicleSize size;
public:
Vehicle(std::string p, VehicleSize s) : plate(p), size(s) {}
virtual ~Vehicle() = default;
VehicleSize getSize() const { return size; }
std::string getPlate() const { return plate; }
};
class Car : public Vehicle {
public:
Car(std::string p) : Vehicle(p, VehicleSize::MEDIUM) {}
};
class Bike : public Vehicle {
public:
Bike(std::string p) : Vehicle(p, VehicleSize::SMALL) {}
};
class Truck : public Vehicle {
public:
Truck(std::string p) : Vehicle(p, VehicleSize::LARGE) {}
};
class ParkingSpot {
VehicleSize size;
Vehicle* vehicle = nullptr;
public:
ParkingSpot(VehicleSize s) : size(s) {}
bool canFit(const Vehicle& v) const {
return !vehicle && static_cast<int>(v.getSize()) <= static_cast<int>(size);
}
bool park(Vehicle& v) {
if (canFit(v)) { vehicle = &v; return true; }
return false;
}
void removeVehicle() { vehicle = nullptr; }
};
class ParkingLot {
std::vector<ParkingSpot> spots;
public:
ParkingLot(int n) {
for (int i = 0; i < n; ++i)
spots.emplace_back(VehicleSize::MEDIUM);
}
bool parkVehicle(Vehicle& v) {
for (auto& spot : spots)
if (spot.park(v)) return true;
return false;
}
};