1 #[cfg(feature = "use_core")]
2 extern crate core;
3
4 #[macro_use]
5 extern crate derivative;
6
7 #[derive(Debug, Derivative, PartialEq)]
8 #[derivative(Default="new")]
9 struct Foo<T, U> {
10 foo: T,
11 #[derivative(Default(value="min()", bound="U: std::ops::Not<Output=U>, U: Default"))]
12 bar: U,
13 }
14
15 #[derive(Debug, Derivative, PartialEq)]
16 #[derivative(Default(bound="T: Default, U: std::ops::Not<Output=U>, U: Default", new="true"))]
17 struct Bar<T, U> {
18 foo: T,
19 #[derivative(Default(value="min()"))]
20 bar: U,
21 }
22
min<T: Default + std::ops::Not<Output=T>>() -> T23 fn min<T: Default + std::ops::Not<Output=T>>() -> T {
24 !T::default()
25 }
26
27 #[derive(Debug, Derivative, PartialEq)]
28 #[derivative(Default(bound=""))]
29 struct WithOption<T> {
30 foo: Option<T>,
31 }
32
33 struct NonDefault;
34
35 #[test]
main()36 fn main() {
37 assert_eq!(Foo::default(), Foo { foo: 0u8, bar: 0xffu8 });
38 assert_eq!(Bar::default(), Bar { foo: 0u8, bar: 0xffu8 });
39 assert_eq!(Foo::new(), Foo { foo: 0u8, bar: 0xffu8 });
40 assert_eq!(Bar::new(), Bar { foo: 0u8, bar: 0xffu8 });
41 WithOption::<NonDefault>::default();
42 }
43