Fix tests.
This commit is contained in:
parent
ea866cead5
commit
46b22ddd96
@ -188,11 +188,11 @@ pub enum Union {
|
|||||||
/// This data structure provides transparent interoperability between
|
/// This data structure provides transparent interoperability between
|
||||||
/// normal [`Dynamic`] and shared [`Dynamic`] values.
|
/// normal [`Dynamic`] and shared [`Dynamic`] values.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct DynamicReadLock<'d, T: Variant + Clone>(DynamicReadLockInner<'d, T>);
|
pub struct DynamicReadLock<'d, T: Clone>(DynamicReadLockInner<'d, T>);
|
||||||
|
|
||||||
/// Different types of read guards for [`DynamicReadLock`].
|
/// Different types of read guards for [`DynamicReadLock`].
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum DynamicReadLockInner<'d, T: Variant + Clone> {
|
enum DynamicReadLockInner<'d, T: Clone> {
|
||||||
/// A simple reference to a non-shared value.
|
/// A simple reference to a non-shared value.
|
||||||
Reference(&'d T),
|
Reference(&'d T),
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ enum DynamicReadLockInner<'d, T: Variant + Clone> {
|
|||||||
Guard(std::sync::RwLockReadGuard<'d, Dynamic>),
|
Guard(std::sync::RwLockReadGuard<'d, Dynamic>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Variant + Clone> Deref for DynamicReadLock<'d, T> {
|
impl<'d, T: Any + Clone> Deref for DynamicReadLock<'d, T> {
|
||||||
type Target = T;
|
type Target = T;
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
@ -225,11 +225,11 @@ impl<'d, T: Variant + Clone> Deref for DynamicReadLock<'d, T> {
|
|||||||
/// This data structure provides transparent interoperability between
|
/// This data structure provides transparent interoperability between
|
||||||
/// normal [`Dynamic`] and shared [`Dynamic`] values.
|
/// normal [`Dynamic`] and shared [`Dynamic`] values.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct DynamicWriteLock<'d, T: Variant + Clone>(DynamicWriteLockInner<'d, T>);
|
pub struct DynamicWriteLock<'d, T: Clone>(DynamicWriteLockInner<'d, T>);
|
||||||
|
|
||||||
/// Different types of write guards for [`DynamicReadLock`].
|
/// Different types of write guards for [`DynamicReadLock`].
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum DynamicWriteLockInner<'d, T: Variant + Clone> {
|
enum DynamicWriteLockInner<'d, T: Clone> {
|
||||||
/// A simple mutable reference to a non-shared value.
|
/// A simple mutable reference to a non-shared value.
|
||||||
Reference(&'d mut T),
|
Reference(&'d mut T),
|
||||||
|
|
||||||
@ -243,7 +243,7 @@ enum DynamicWriteLockInner<'d, T: Variant + Clone> {
|
|||||||
Guard(std::sync::RwLockWriteGuard<'d, Dynamic>),
|
Guard(std::sync::RwLockWriteGuard<'d, Dynamic>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Variant + Clone> Deref for DynamicWriteLock<'d, T> {
|
impl<'d, T: Any + Clone> Deref for DynamicWriteLock<'d, T> {
|
||||||
type Target = T;
|
type Target = T;
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
@ -257,7 +257,7 @@ impl<'d, T: Variant + Clone> Deref for DynamicWriteLock<'d, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Variant + Clone> DerefMut for DynamicWriteLock<'d, T> {
|
impl<'d, T: Any + Clone> DerefMut for DynamicWriteLock<'d, T> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
match &mut self.0 {
|
match &mut self.0 {
|
||||||
@ -298,7 +298,7 @@ impl Dynamic {
|
|||||||
/// If the [`Dynamic`] is a shared variant checking is performed on
|
/// If the [`Dynamic`] is a shared variant checking is performed on
|
||||||
/// top of its internal value.
|
/// top of its internal value.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn is<T: Variant + Clone>(&self) -> bool {
|
pub fn is<T: Any + Clone>(&self) -> bool {
|
||||||
let mut target_type_id = TypeId::of::<T>();
|
let mut target_type_id = TypeId::of::<T>();
|
||||||
|
|
||||||
if target_type_id == TypeId::of::<String>() {
|
if target_type_id == TypeId::of::<String>() {
|
||||||
@ -983,7 +983,7 @@ impl Dynamic {
|
|||||||
/// assert_eq!(x.try_cast::<u32>().unwrap(), 42);
|
/// assert_eq!(x.try_cast::<u32>().unwrap(), 42);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn try_cast<T: Variant>(self) -> Option<T> {
|
pub fn try_cast<T: Any>(self) -> Option<T> {
|
||||||
// Coded this way in order to maximally leverage potentials for dead-code removal.
|
// Coded this way in order to maximally leverage potentials for dead-code removal.
|
||||||
|
|
||||||
#[cfg(not(feature = "no_closure"))]
|
#[cfg(not(feature = "no_closure"))]
|
||||||
@ -1118,7 +1118,7 @@ impl Dynamic {
|
|||||||
/// assert_eq!(x.cast::<u32>(), 42);
|
/// assert_eq!(x.cast::<u32>(), 42);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn cast<T: Variant + Clone>(self) -> T {
|
pub fn cast<T: Any + Clone>(self) -> T {
|
||||||
#[cfg(not(feature = "no_closure"))]
|
#[cfg(not(feature = "no_closure"))]
|
||||||
let self_type_name = if self.is_shared() {
|
let self_type_name = if self.is_shared() {
|
||||||
// Avoid panics/deadlocks with shared values
|
// Avoid panics/deadlocks with shared values
|
||||||
@ -1165,7 +1165,7 @@ impl Dynamic {
|
|||||||
/// assert_eq!(y.clone_cast::<u32>(), 42);
|
/// assert_eq!(y.clone_cast::<u32>(), 42);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn clone_cast<T: Variant + Clone>(&self) -> T {
|
pub fn clone_cast<T: Any + Clone>(&self) -> T {
|
||||||
self.read_lock::<T>().unwrap().clone()
|
self.read_lock::<T>().unwrap().clone()
|
||||||
}
|
}
|
||||||
/// Flatten the [`Dynamic`] and clone it.
|
/// Flatten the [`Dynamic`] and clone it.
|
||||||
@ -1293,7 +1293,7 @@ impl Dynamic {
|
|||||||
/// Under the `sync` feature, this call may deadlock, or [panic](https://doc.rust-lang.org/std/sync/struct.RwLock.html#panics-1).
|
/// Under the `sync` feature, this call may deadlock, or [panic](https://doc.rust-lang.org/std/sync/struct.RwLock.html#panics-1).
|
||||||
/// Otherwise, this call panics if the data is currently borrowed for write.
|
/// Otherwise, this call panics if the data is currently borrowed for write.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn read_lock<T: Variant + Clone>(&self) -> Option<DynamicReadLock<T>> {
|
pub fn read_lock<T: Any + Clone>(&self) -> Option<DynamicReadLock<T>> {
|
||||||
match self.0 {
|
match self.0 {
|
||||||
#[cfg(not(feature = "no_closure"))]
|
#[cfg(not(feature = "no_closure"))]
|
||||||
Union::Shared(ref cell, _) => {
|
Union::Shared(ref cell, _) => {
|
||||||
@ -1326,7 +1326,7 @@ impl Dynamic {
|
|||||||
/// Under the `sync` feature, this call may deadlock, or [panic](https://doc.rust-lang.org/std/sync/struct.RwLock.html#panics-1).
|
/// Under the `sync` feature, this call may deadlock, or [panic](https://doc.rust-lang.org/std/sync/struct.RwLock.html#panics-1).
|
||||||
/// Otherwise, this call panics if the data is currently borrowed for write.
|
/// Otherwise, this call panics if the data is currently borrowed for write.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn write_lock<T: Variant + Clone>(&mut self) -> Option<DynamicWriteLock<T>> {
|
pub fn write_lock<T: Any + Clone>(&mut self) -> Option<DynamicWriteLock<T>> {
|
||||||
match self.0 {
|
match self.0 {
|
||||||
#[cfg(not(feature = "no_closure"))]
|
#[cfg(not(feature = "no_closure"))]
|
||||||
Union::Shared(ref cell, _) => {
|
Union::Shared(ref cell, _) => {
|
||||||
@ -1354,7 +1354,7 @@ impl Dynamic {
|
|||||||
///
|
///
|
||||||
/// Returns [`None`] if the cast fails, or if the value is shared.
|
/// Returns [`None`] if the cast fails, or if the value is shared.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub(crate) fn downcast_ref<T: Variant + Clone>(&self) -> Option<&T> {
|
pub(crate) fn downcast_ref<T: Any + Clone>(&self) -> Option<&T> {
|
||||||
// Coded this way in order to maximally leverage potentials for dead-code removal.
|
// Coded this way in order to maximally leverage potentials for dead-code removal.
|
||||||
|
|
||||||
if TypeId::of::<T>() == TypeId::of::<INT>() {
|
if TypeId::of::<T>() == TypeId::of::<INT>() {
|
||||||
@ -1450,7 +1450,7 @@ impl Dynamic {
|
|||||||
///
|
///
|
||||||
/// Returns [`None`] if the cast fails, or if the value is shared.
|
/// Returns [`None`] if the cast fails, or if the value is shared.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub(crate) fn downcast_mut<T: Variant + Clone>(&mut self) -> Option<&mut T> {
|
pub(crate) fn downcast_mut<T: Any + Clone>(&mut self) -> Option<&mut T> {
|
||||||
// Coded this way in order to maximally leverage potentials for dead-code removal.
|
// Coded this way in order to maximally leverage potentials for dead-code removal.
|
||||||
|
|
||||||
if TypeId::of::<T>() == TypeId::of::<INT>() {
|
if TypeId::of::<T>() == TypeId::of::<INT>() {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
//! A helper module containing unsafe utility functions.
|
//! A helper module containing unsafe utility functions.
|
||||||
|
|
||||||
use crate::dynamic::Variant;
|
|
||||||
#[cfg(feature = "no_std")]
|
#[cfg(feature = "no_std")]
|
||||||
use std::prelude::v1::*;
|
use std::prelude::v1::*;
|
||||||
use std::{
|
use std::{
|
||||||
@ -27,7 +26,7 @@ pub fn unsafe_try_cast<A: Any, B: Any>(a: A) -> Result<B, A> {
|
|||||||
|
|
||||||
/// Cast a Boxed type into another type.
|
/// Cast a Boxed type into another type.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn unsafe_cast_box<X: Variant, T: Variant>(item: Box<X>) -> Result<Box<T>, Box<X>> {
|
pub fn unsafe_cast_box<X: Any, T: Any>(item: Box<X>) -> Result<Box<T>, Box<X>> {
|
||||||
// Only allow casting to the exact same type
|
// Only allow casting to the exact same type
|
||||||
if TypeId::of::<X>() == TypeId::of::<T>() {
|
if TypeId::of::<X>() == TypeId::of::<T>() {
|
||||||
// SAFETY: just checked whether we are pointing to the correct type
|
// SAFETY: just checked whether we are pointing to the correct type
|
||||||
|
@ -157,47 +157,43 @@ fn test_arrays_map_reduce() -> Result<(), Box<EvalAltResult>> {
|
|||||||
let engine = Engine::new();
|
let engine = Engine::new();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
engine.eval::<INT>(
|
convert_to_vec::<INT>(engine.eval(
|
||||||
r"
|
r"
|
||||||
let x = [1, 2, 3];
|
let x = [1, 2, 3];
|
||||||
let y = x.filter(|v| v > 2);
|
x.filter(|v| v > 2)
|
||||||
y[0]
|
|
||||||
"
|
"
|
||||||
)?,
|
)?),
|
||||||
3
|
[3]
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
engine.eval::<INT>(
|
convert_to_vec::<INT>(engine.eval(
|
||||||
r"
|
r"
|
||||||
let x = [1, 2, 3];
|
let x = [1, 2, 3];
|
||||||
let y = x.filter(|v, i| v > i);
|
x.filter(|v, i| v > i)
|
||||||
y.len()
|
|
||||||
"
|
"
|
||||||
)?,
|
)?),
|
||||||
3
|
[1, 2, 3]
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
engine.eval::<INT>(
|
convert_to_vec::<INT>(engine.eval(
|
||||||
r"
|
r"
|
||||||
let x = [1, 2, 3];
|
let x = [1, 2, 3];
|
||||||
let y = x.map(|v| v * 2);
|
x.map(|v| v * 2)
|
||||||
y[2]
|
|
||||||
"
|
"
|
||||||
)?,
|
)?),
|
||||||
6
|
[2, 4, 6]
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
engine.eval::<INT>(
|
convert_to_vec::<INT>(engine.eval(
|
||||||
r"
|
r"
|
||||||
let x = [1, 2, 3];
|
let x = [1, 2, 3];
|
||||||
let y = x.map(|v, i| v * i);
|
x.map(|v, i| v * i)
|
||||||
y[2]
|
|
||||||
"
|
"
|
||||||
)?,
|
)?),
|
||||||
6
|
[0, 2, 6]
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
Loading…
Reference in New Issue
Block a user