You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
2.5 KiB
Rust
122 lines
2.5 KiB
Rust
use elevator_drivers::{ElevatorDriver, ElevatorDriver1, ElevatorDriver2, ElevatorDriver3};
|
|
use motor_controllers::{MotorController, newMotorController1, newMotorController2, newMotorController3};
|
|
|
|
pub trait Building
|
|
{
|
|
fn get_elevator_driver(&self) -> Box<ElevatorDriver>;
|
|
fn get_motor_controller(&self) -> Box<MotorController>;
|
|
fn get_floor_heights(&self) -> Vec<f64>;
|
|
fn get_carriage_weight(&self) -> f64;
|
|
fn clone(&self) -> Box<Building>;
|
|
fn serialize(&self) -> u64;
|
|
}
|
|
|
|
pub fn deserialize(n: u64) -> Box<Building>
|
|
{
|
|
if n==1 {
|
|
Box::new(Building1)
|
|
} else if n==2 {
|
|
Box::new(Building2)
|
|
} else {
|
|
Box::new(Building3)
|
|
}
|
|
}
|
|
|
|
pub fn getCarriageFloor(floorHeights: Vec<f64>, height: f64) -> u64
|
|
{
|
|
let mut c = 0.0;
|
|
for (fi, fht) in floorHeights.iter().enumerate() {
|
|
c += fht;
|
|
if height <= c {
|
|
return (fi as u64)
|
|
}
|
|
}
|
|
(floorHeights.len()-1) as u64
|
|
}
|
|
|
|
pub fn getCumulativeFloorHeight(heights: Vec<f64>, floor: u64) -> f64
|
|
{
|
|
heights.iter().take(floor as usize).sum()
|
|
}
|
|
|
|
pub struct Building1;
|
|
impl Building for Building1 {
|
|
fn get_elevator_driver(&self) -> Box<ElevatorDriver>
|
|
{
|
|
Box::new(ElevatorDriver1)
|
|
}
|
|
fn get_motor_controller(&self) -> Box<MotorController>
|
|
{
|
|
newMotorController1()
|
|
}
|
|
fn get_floor_heights(&self) -> Vec<f64>
|
|
{
|
|
vec![8.0, 4.0, 4.0, 4.0, 4.0]
|
|
}
|
|
fn get_carriage_weight(&self) -> f64
|
|
{
|
|
1200.0
|
|
}
|
|
fn clone(&self) -> Box<Building> {
|
|
Box::new(Building1)
|
|
}
|
|
fn serialize(&self) -> u64
|
|
{
|
|
1
|
|
}
|
|
}
|
|
|
|
pub struct Building2;
|
|
impl Building for Building2 {
|
|
fn get_elevator_driver(&self) -> Box<ElevatorDriver>
|
|
{
|
|
Box::new(ElevatorDriver2)
|
|
}
|
|
fn get_motor_controller(&self) -> Box<MotorController>
|
|
{
|
|
newMotorController2()
|
|
}
|
|
fn get_floor_heights(&self) -> Vec<f64>
|
|
{
|
|
vec![5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]
|
|
}
|
|
fn get_carriage_weight(&self) -> f64
|
|
{
|
|
1350.0
|
|
}
|
|
fn clone(&self) -> Box<Building> {
|
|
Box::new(Building2)
|
|
}
|
|
fn serialize(&self) -> u64
|
|
{
|
|
2
|
|
}
|
|
}
|
|
|
|
pub struct Building3;
|
|
impl Building for Building3 {
|
|
fn get_elevator_driver(&self) -> Box<ElevatorDriver>
|
|
{
|
|
Box::new(ElevatorDriver3)
|
|
}
|
|
fn get_motor_controller(&self) -> Box<MotorController>
|
|
{
|
|
newMotorController3()
|
|
}
|
|
fn get_floor_heights(&self) -> Vec<f64>
|
|
{
|
|
vec![6.0, 4.0, 4.0, 4.0]
|
|
}
|
|
fn get_carriage_weight(&self) -> f64
|
|
{
|
|
1400.0
|
|
}
|
|
fn clone(&self) -> Box<Building> {
|
|
Box::new(Building3)
|
|
}
|
|
fn serialize(&self) -> u64
|
|
{
|
|
3
|
|
}
|
|
}
|