use crate::core::texture::Image;
use crate::core::{RaylibHandle, RaylibThread};
use crate::ffi;
use std::ffi::CString;
use std::ops::{Deref, DerefMut, Range};
use std::usize;
pub struct RandomSequence<'a>(&'a mut [i32]);
impl<'a> Deref for RandomSequence<'a> {
type Target = [i32];
fn deref(&self) -> &Self::Target {
self.0
}
}
impl<'a> DerefMut for RandomSequence<'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<'a> Drop for RandomSequence<'a> {
fn drop(&mut self) {
unsafe { ffi::UnloadRandomSequence(self.0.as_mut_ptr()) }
}
}
impl<'a> IntoIterator for RandomSequence<'a> {
type Item = i32;
type IntoIter = RandSeqIterator<'a>;
fn into_iter(self) -> Self::IntoIter {
RandSeqIterator(self, 0)
}
}
pub struct RandSeqIterator<'a>(RandomSequence<'a>, usize);
impl<'a> Iterator for RandSeqIterator<'a> {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
let ret = self.0.get(self.1);
self.1 += 1;
match ret {
Some(a) => Some(*a),
None => None,
}
}
}
pub fn open_url(url: &str) {
let s = CString::new(url).expect("Not a string");
unsafe {
ffi::OpenURL(s.as_ptr());
}
}
impl RaylibHandle {
pub fn load_random_sequence<'a>(&self, num: Range<i32>, count: u32) -> RandomSequence<'a> {
unsafe {
let ptr = ffi::LoadRandomSequence(count, num.start, num.end.into());
RandomSequence(std::slice::from_raw_parts_mut(ptr, count as usize))
}
}
pub fn load_image_from_screen(&self, _: &RaylibThread) -> Image {
unsafe { Image(ffi::LoadImageFromScreen()) }
}
pub fn take_screenshot(&mut self, _: &RaylibThread, filename: &str) {
let c_filename = CString::new(filename).unwrap();
unsafe {
ffi::TakeScreenshot(c_filename.as_ptr());
}
}
pub fn get_random_value<T: From<i32>>(&self, num: Range<i32>) -> T {
unsafe { (ffi::GetRandomValue(num.start, num.end.into()) as i32).into() }
}
pub fn set_random_seed(&mut self, seed: u32) {
unsafe {
ffi::SetRandomSeed(seed);
}
}
}
pub trait AsF32: Copy {
fn as_f32(self) -> f32;
}
macro_rules! as_f32 {
($ty:ty) => {
impl AsF32 for $ty {
fn as_f32(self) -> f32 {
self as f32
}
}
};
}
as_f32!(u8);
as_f32!(u16);
as_f32!(u32);
as_f32!(i8);
as_f32!(i16);
as_f32!(i32);
as_f32!(f32);