diff --git a/.travis.yml b/.travis.yml index b24cbe2c..a1214175 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,10 +13,6 @@ matrix: env: FEATURES="" - rust: nightly env: FEATURES="unstable" - - rust: nightly - env: FEATURES="plugins" - - rust: nightly - env: FEATURES="unstable plugins" script: - cargo build --verbose --features "$FEATURES" diff --git a/Cargo.toml b/Cargo.toml index 90f1dba5..4d809a96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,16 +8,14 @@ repository = "https://github.com/servo/euclid" license = "MIT / Apache-2.0" [features] -default = [] -plugins = [] unstable = [] [dependencies] -heapsize = ">=0.2, <0.4" +heapsize = "0.3" rustc-serialize = "0.3.2" num-traits = {version = "0.1.32", default-features = false} log = "0.3.1" -serde = ">=0.6, <0.8" +serde = "0.8" [dev-dependencies] rand = "0.3.7" diff --git a/src/macros.rs b/src/macros.rs index 05fa602a..53e6e730 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -7,95 +7,49 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -macro_rules! deserialize { - ( - { $field:ident, $($rest:tt)* } - $count:tt - { $($acc:tt)* } - $name:ident - $deserializer:ident - $T:ty - ) => ( - deserialize!( - { $($rest)* } - (1 + $count) - { $($acc)* { $field $count } } - $name - $deserializer - $T) - ); - ( - {} - $total:tt - { $({ $field:ident $index:expr })+ } - $name:ident - $deserializer:ident - $T:ty - ) => ({ - let values = try!(<[$T; $total]>::deserialize($deserializer)); - Ok($name { $($field: values[$index].clone(),)+ _unit: PhantomData }) - }) -} - macro_rules! define_matrix { - ($(#[$attr:meta])* pub struct $name:ident { $(pub $field:ident: T,)+ }) => ( - $(#[$attr])* - pub struct $name { - $(pub $field: T,)+ - _unit: PhantomData<(Src, Dst)> - } - - impl ::heapsize::HeapSizeOf for $name { - fn heap_size_of_children(&self) -> usize { - $(self.$field.heap_size_of_children() +)+ 0 - } - } - - impl ::serde::Deserialize for $name { - fn deserialize(deserializer: &mut D) -> Result - where D: ::serde::Deserializer - { - deserialize!({ $($field,)+ } 0 {} $name deserializer T) - } - } - - impl ::serde::Serialize for $name { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> - where S: ::serde::Serializer - { - [$(&self.$field,)+].serialize(serializer) - } + ( + $(#[$attr:meta])* + pub struct $name:ident { + $(pub $field:ident: T,)+ } - ) -} - -macro_rules! define_vector { - ($(#[$attr:meta])* pub struct $name:ident { $(pub $field:ident: T,)+ }) => ( + ) => ( $(#[$attr])* - pub struct $name { + pub struct $name { $(pub $field: T,)+ - _unit: PhantomData, + _unit: PhantomData<($($phantom),+)> } - impl ::heapsize::HeapSizeOf for $name { + impl ::heapsize::HeapSizeOf for $name + where T: ::heapsize::HeapSizeOf + { fn heap_size_of_children(&self) -> usize { $(self.$field.heap_size_of_children() +)+ 0 } } - impl ::serde::Deserialize for $name { + impl ::serde::Deserialize for $name + where T: ::serde::Deserialize + { fn deserialize(deserializer: &mut D) -> Result where D: ::serde::Deserializer { - deserialize!({ $($field,)+ } 0 {} $name deserializer T) + let ($($field,)+) = + try!(::serde::Deserialize::deserialize(deserializer)); + Ok($name { + $($field: $field,)+ + _unit: PhantomData, + }) } } - impl ::serde::Serialize for $name { + impl ::serde::Serialize for $name + where T: ::serde::Serialize + { fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> where S: ::serde::Serializer { - [$(&self.$field,)+].serialize(serializer) + ($(&self.$field,)+).serialize(serializer) } } ) diff --git a/src/point.rs b/src/point.rs index 7b80734b..69810f36 100644 --- a/src/point.rs +++ b/src/point.rs @@ -19,7 +19,7 @@ use std::marker::PhantomData; use std::cmp::{PartialEq, Eq}; use std::hash::{Hash, Hasher}; -define_vector! { +define_matrix! { #[derive(RustcDecodable, RustcEncodable)] pub struct TypedPoint2D { pub x: T, @@ -212,7 +212,7 @@ impl TypedPoint2D { } } -define_vector! { +define_matrix! { #[derive(RustcDecodable, RustcEncodable)] pub struct TypedPoint3D { pub x: T, @@ -355,7 +355,7 @@ impl TypedPoint3D { } } -define_vector! { +define_matrix! { #[derive(RustcDecodable, RustcEncodable)] pub struct TypedPoint4D { pub x: T, diff --git a/src/side_offsets.rs b/src/side_offsets.rs index 898e6898..0275620f 100644 --- a/src/side_offsets.rs +++ b/src/side_offsets.rs @@ -20,7 +20,7 @@ use heapsize::HeapSizeOf; /// A group of side offsets, which correspond to top/left/bottom/right for borders, padding, /// and margins in CSS. -define_vector! { +define_matrix! { #[derive(Debug)] pub struct TypedSideOffsets2D { pub top: T, diff --git a/src/size.rs b/src/size.rs index 0b6d717b..a47efe3e 100644 --- a/src/size.rs +++ b/src/size.rs @@ -16,7 +16,7 @@ use std::fmt; use std::ops::{Mul, Div}; use std::marker::PhantomData; -define_vector! { +define_matrix! { #[derive(RustcDecodable, RustcEncodable)] pub struct TypedSize2D { pub width: T,