#![feature(bigint_helper_methods)]
#![feature(unchecked_shifts)]
#![feature(seek_stream_len)]
#![feature(io_error_more)]

mod debug;
mod devices;
mod emulators;
mod metadata;

pub use debug::DebugState;
pub use devices::*;
pub use emulators::*;
pub use metadata::*;

use std::num::NonZeroU32;
use std::time::Duration;
pub const BATCH_SIZE: usize = 1000;
pub const MIN_TICK_DURATION: Duration = Duration::from_millis( 4 );
pub const MIN_FRAME_DURATION: Duration = Duration::from_millis( 14 );
pub const MAX_FRAME_DURATION: Duration = Duration::from_millis( 500 );
pub const DEFAULT_SCREEN_SIZE: ScreenDimensions = ScreenDimensions::new(800,600);
pub const DEFAULT_SCREEN_SCALE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) };

pub type ScreenPosition = geometry::Point<u16>;
pub type ScreenDimensions = geometry::Dimensions<u16>;

#[macro_export]
macro_rules! error {
    ($source:expr, $($tokens:tt)*) => {{
        eprint!("[ERROR] [{}]: ", $source);
        eprintln!($($tokens)*);
    }};
}