style: Add an owned slice type which cbindgen can understand.

Passing these by value won't be ok of course, but that's fine.

I plan to combine this with https://github.com/eqrion/cbindgen/pull/333 to
actually be able to share representation for ~all the things, this is just the
first bit.

Box<T>, Atom and Arc<T> will be much easier since cbindgen can understand them
without issues.

It's boxed slices the only ones I should need something like this. I could avoid
it if I rely on Rust's internal representation, which we can per [1], but then I
need to teach cbindgen all about slices, which is generally hard, I think.

[1]: https://github.com/rust-lang/unsafe-code-guidelines/blob/master/reference/src/layout/pointers.md

Differential Revision: https://phabricator.services.mozilla.com/D29768
This commit is contained in:
Emilio Cobos Álvarez 2019-05-09 10:49:22 +00:00
parent 4b761848a0
commit 330bccd659
6 changed files with 252 additions and 1 deletions

View file

@ -288,6 +288,50 @@ where
}
}
impl<T> ToAnimatedValue for Box<[T]>
where
T: ToAnimatedValue,
{
type AnimatedValue = Box<[<T as ToAnimatedValue>::AnimatedValue]>;
#[inline]
fn to_animated_value(self) -> Self::AnimatedValue {
self
.into_vec()
.into_iter()
.map(T::to_animated_value)
.collect::<Vec<_>>()
.into_boxed_slice()
}
#[inline]
fn from_animated_value(animated: Self::AnimatedValue) -> Self {
animated
.into_vec()
.into_iter()
.map(T::from_animated_value)
.collect::<Vec<_>>()
.into_boxed_slice()
}
}
impl<T> ToAnimatedValue for crate::OwnedSlice<T>
where
T: ToAnimatedValue,
{
type AnimatedValue = crate::OwnedSlice<<T as ToAnimatedValue>::AnimatedValue>;
#[inline]
fn to_animated_value(self) -> Self::AnimatedValue {
self.into_box().to_animated_value().into()
}
#[inline]
fn from_animated_value(animated: Self::AnimatedValue) -> Self {
Box::from_animated_value(animated.into_box()).into()
}
}
impl<T> ToAnimatedValue for SmallVec<[T; 1]>
where
T: ToAnimatedValue,

View file

@ -444,6 +444,30 @@ where
}
}
impl<T> ToComputedValue for crate::OwnedSlice<T>
where
T: ToComputedValue,
{
type ComputedValue = crate::OwnedSlice<<T as ToComputedValue>::ComputedValue>;
#[inline]
fn to_computed_value(&self, context: &Context) -> Self::ComputedValue {
self.iter()
.map(|item| item.to_computed_value(context))
.collect::<Vec<_>>()
.into()
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
computed
.iter()
.map(T::from_computed_value)
.collect::<Vec<_>>()
.into()
}
}
trivial_to_computed_value!(());
trivial_to_computed_value!(bool);
trivial_to_computed_value!(f32);

View file

@ -193,3 +193,20 @@ where
Vec::from_resolved_value(Vec::from(resolved)).into_boxed_slice()
}
}
impl<T> ToResolvedValue for crate::OwnedSlice<T>
where
T: ToResolvedValue,
{
type ResolvedValue = crate::OwnedSlice<<T as ToResolvedValue>::ResolvedValue>;
#[inline]
fn to_resolved_value(self, context: &Context) -> Self::ResolvedValue {
self.into_box().to_resolved_value(context).into()
}
#[inline]
fn from_resolved_value(resolved: Self::ResolvedValue) -> Self {
Self::from(Box::from_resolved_value(resolved.into_box()))
}
}