Skip to content

Commit 8c69430

Browse files
committed
v0.16.2
1 parent 8ba270b commit 8c69430

File tree

9 files changed

+97
-65
lines changed

9 files changed

+97
-65
lines changed

README.md

+21
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,27 @@ fn main() {
6363

6464
# Changelog
6565

66+
## 0.16.2
67+
68+
Fixes multiple problems. The most impactful being that 0.16.1 could only be built
69+
using a nightly rust compiler.
70+
71+
It also provides an optional feature to integrate 'savefile-derive' into 'savefile'.
72+
73+
Just activate the feature 'derive', and you can then use savefile without an explicit
74+
dependency on 'savefile-derive'. Just do
75+
76+
```rust
77+
use savefile::prelude::*;
78+
79+
#[derive(Savefile)]
80+
struct MyStruct {
81+
//...
82+
}
83+
```
84+
And you're good to go!
85+
86+
6687
## 0.16.1
6788

6889
Fix a minor issue where the ```#[savefile_introspect_ignore]``` was not accepted

savefile-derive/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "savefile-derive"
3-
version = "0.16.1"
3+
version = "0.16.2"
44
authors = ["Anders Musikka <[email protected]>"]
55

66
description = "Custom derive macros for savefile crate - simple, convenient, fast, versioned, binary serialization/deserialization library."

savefile-derive/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,7 @@ fn get_enum_size(attrs: &Vec<syn::Attribute>) -> Option<u32> {
13141314
)]
13151315
pub fn reprc(_input: proc_macro::TokenStream) -> proc_macro::TokenStream {
13161316

1317-
panic!("The #[derive(ReprC)] style of unsafe performance opt-in has been changed. Add a #[savefile_unsafe_and_fast] attribute on a new line, after the #[derive(Savefile)] attribute instead.")
1317+
panic!("The #[derive(ReprC)] style of unsafe performance opt-in has been removed. The performance gains are now available automatically for any packed struct.")
13181318
}
13191319
fn derive_reprc_new(input: DeriveInput) -> TokenStream {
13201320

savefile-min-build/Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ edition = "2021"
66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
77

88
[dependencies]
9-
savefile = { path = "../savefile", features = [], default-features = false }
10-
savefile-derive = { path = "../savefile-derive" }
9+
savefile = { path = "../savefile", features = ["derive"], default-features = false }
1110

1211

savefile-min-build/src/lib.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
use savefile::prelude::*;
12
use std::fmt::Debug;
23
use std::io::{BufWriter, Cursor, Write};
34
use savefile::{Deserialize, Deserializer, Serialize, Serializer};
45

6+
57
pub fn assert_roundtrip<E: Serialize + Deserialize + Debug + PartialEq>(sample: E) {
68
assert_roundtrip_version(sample, 0)
79
}
@@ -24,8 +26,14 @@ pub fn assert_roundtrip_version<E: Serialize + Deserialize + Debug + PartialEq>(
2426
assert_eq!(f.position() as usize,f_internal_size);
2527
}
2628

29+
#[derive(Savefile,PartialEq,Eq,Debug)]
30+
struct SimpleStruct {
31+
x: u32
32+
}
33+
2734
#[test]
2835
fn it_works() {
2936
assert_roundtrip("Test-string".to_string());
3037
assert_roundtrip(42i32);
38+
assert_roundtrip(SimpleStruct{x:42});
3139
}

savefile-test/src/lib.rs

+28-2
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,32 @@ pub fn test_array_string() {
426426
assert_roundtrip(arraystr);
427427
}
428428

429+
#[test]
430+
pub fn test_array_vec() {
431+
use arrayvec::ArrayVec;
432+
let mut data:ArrayVec<u32, 30> = ArrayVec::new();
433+
assert_roundtrip(data.clone());
434+
data.push(47);
435+
assert_roundtrip(data.clone());
436+
data.push(1);
437+
data.push(32);
438+
data.push(49);
439+
assert_roundtrip(data.clone());
440+
}
441+
442+
#[test]
443+
pub fn test_array_vec_with_string() {
444+
use arrayvec::ArrayVec;
445+
let mut data:ArrayVec<String, 30> = ArrayVec::new();
446+
assert_roundtrip(data.clone());
447+
data.push("hello".to_string());
448+
assert_roundtrip(data.clone());
449+
data.push("wonderful".to_string());
450+
data.push("world".to_string());
451+
data.push("how ya doing?".to_string());
452+
assert_roundtrip(data.clone());
453+
}
454+
429455
#[test]
430456
pub fn test_smallvec0() {
431457
let mut v = smallvec::SmallVec::<[u8;2]>::new();
@@ -1142,13 +1168,13 @@ struct MySimpleFuzz1 {
11421168
#[test]
11431169
pub fn fuzz_regression1() {
11441170
let mut data:&[u8] = &[0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 3, 0, 64, 0, 0, 0];
1145-
let _ = load_noschema::<MySimpleFuzz1>(&mut data,0);
1171+
let _t:Result<MySimpleFuzz1,_> = load_noschema(&mut data,0);
11461172
}
11471173

11481174
#[test]
11491175
pub fn fuzz_regression2() {
11501176
let mut data:&[u8] = &[0, 0, 0, 0, 3, 11, 0, 254, 2, 1, 252, 255, 254];
1151-
let _ = load_noschema::<MySimpleFuzz1>(&mut data,0);
1177+
let _t:Result<MySimpleFuzz1,_> = load_noschema(&mut data,0);
11521178
}
11531179

11541180

savefile/Cargo.toml

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "savefile"
3-
version = "0.16.1"
3+
version = "0.16.2"
44
authors = ["Anders Musikka <[email protected]>"]
55
documentation = "https://docs.rs/savefile/"
66
homepage = "https://github.com/avl/savefile/"
@@ -37,6 +37,8 @@ compression = ["bzip2"]
3737

3838
encryption = ["ring", "rand"]
3939

40+
derive = ["dep:savefile-derive"]
41+
4042
[dependencies]
4143
bit-vec = { version = "0.6", optional = true}
4244
arrayvec = { version = "0.7", optional = true}
@@ -49,9 +51,8 @@ bzip2 = {version = "0.4.4", optional = true}
4951
bit-set = {version = "0.5", optional = true}
5052
rustc-hash = {version = "1.1", optional = true}
5153
memoffset = "0.9"
52-
5354
byteorder = "1.4"
54-
55+
savefile-derive = {path="../savefile-derive",version = "=0.16.2", optional = true }
5556

5657
[dev-dependencies]
5758
savefile-derive = { path="../savefile-derive" }

savefile/src/lib.rs

+24-56
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,8 @@ extern crate core;
785785

786786
extern crate memoffset;
787787

788+
#[cfg(feature="derive")]
789+
extern crate savefile_derive;
788790

789791
/// This object represents an error in deserializing or serializing
790792
/// an item.
@@ -1526,17 +1528,17 @@ impl<'a, W:Write+'a> Serializer<'a, W> {
15261528
pub unsafe fn raw_write_region<T, T1:ReprC,T2:ReprC>(&mut self, full: &T, t1: &T1, t2: &T2, version: u32) -> Result<(), SavefileError> {
15271529
assert!(T1::repr_c_optimization_safe(version).is_yes());
15281530
assert!(T2::repr_c_optimization_safe(version).is_yes());
1529-
unsafe {
15301531

1531-
let base = full as *const T as *const u8;
1532-
let totlen = std::mem::size_of::<T>();
1533-
let p1 = (t1 as *const T1 as *const u8) as usize;
1534-
let p2 = (t2 as *const T2 as *const u8) as usize;
1535-
let start = p1 - (base as usize);
1536-
let end = (p2 - (base as usize)) + std::mem::size_of::<T2>();
1537-
let full_slice = std::slice::from_raw_parts(base, totlen);
1538-
Ok(self.writer.write_all(&full_slice[start..end])?)
1539-
}
1532+
1533+
let base = full as *const T as *const u8;
1534+
let totlen = std::mem::size_of::<T>();
1535+
let p1 = (t1 as *const T1 as *const u8) as usize;
1536+
let p2 = (t2 as *const T2 as *const u8) as usize;
1537+
let start = p1 - (base as usize);
1538+
let end = (p2 - (base as usize)) + std::mem::size_of::<T2>();
1539+
let full_slice = std::slice::from_raw_parts(base, totlen);
1540+
Ok(self.writer.write_all(&full_slice[start..end])?)
1541+
15401542
}
15411543
/// Creata a new serializer.
15421544
/// Don't use this function directly, use the [crate::save] function instead.
@@ -3774,7 +3776,7 @@ impl Serialize for bit_vec::BitVec<u32> {
37743776
serializer.write_usize(l)?;
37753777
let storage = self.storage();
37763778
let rawbytes_ptr = storage.as_ptr() as *const u8;
3777-
let rawbytes :&[u8] = unsafe{slice::from_raw_parts(rawbytes_ptr,4*storage.len())};
3779+
let rawbytes :&[u8] = unsafe{std::slice::from_raw_parts(rawbytes_ptr,4*storage.len())};
37783780
serializer.write_usize(rawbytes.len()|(1<<63))?;
37793781
serializer.write_bytes(&rawbytes)?;
37803782
Ok(())
@@ -3799,7 +3801,7 @@ impl Deserialize for bit_vec::BitVec<u32> {
37993801
let storage = ret.storage_mut();
38003802
storage.resize(num_words, 0);
38013803
let storage_ptr = storage.as_ptr() as *mut u8;
3802-
let storage_bytes:&mut [u8] = slice::from_raw_parts_mut(storage_ptr,4*num_words);
3804+
let storage_bytes:&mut [u8] = std::slice::from_raw_parts_mut(storage_ptr,4*num_words);
38033805
deserializer.read_bytes_to_buf(storage_bytes)?;
38043806
ret.set_len(numbits);
38053807
}
@@ -4160,7 +4162,7 @@ fn regular_deserialize_vec<T: Deserialize>(deserializer: &mut Deserializer<impl
41604162
impl<T: Deserialize + ReprC> Deserialize for Vec<T> {
41614163
fn deserialize(deserializer: &mut Deserializer<impl Read>) -> Result<Self, SavefileError> {
41624164
if unsafe{T::repr_c_optimization_safe(deserializer.file_version)}.is_false() {
4163-
Ok(regular_deserialize_vec::<T>(deserializer)?)
4165+
Ok(regular_deserialize_vec(deserializer)?)
41644166
} else {
41654167
use std::mem;
41664168

@@ -4228,13 +4230,13 @@ impl<T: WithSchema> WithSchema for VecDeque<T> {
42284230
impl<T> ReprC for VecDeque<T> {}
42294231
impl<T: Serialize> Serialize for VecDeque<T> {
42304232
fn serialize(&self, serializer: &mut Serializer<impl Write>) -> Result<(), SavefileError> {
4231-
regular_serialize_vecdeque::<T>(self, serializer)
4233+
regular_serialize_vecdeque(self, serializer)
42324234
}
42334235
}
42344236

42354237
impl<T: Deserialize> Deserialize for VecDeque<T> {
42364238
fn deserialize(deserializer: &mut Deserializer<impl Read>) -> Result<Self, SavefileError> {
4237-
Ok(regular_deserialize_vecdeque::<T>(deserializer)?)
4239+
Ok(regular_deserialize_vecdeque(deserializer)?)
42384240
}
42394241
}
42404242

@@ -4628,26 +4630,16 @@ impl<V: Introspect + 'static, const C: usize> Introspect for arrayvec::ArrayVec<
46284630
}
46294631
}
46304632

4631-
#[cfg(all(feature = "nightly", feature="arrayvec"))]
4632-
impl<V, const C: usize> ReprC for arrayvec::ArrayVec<V,C> {}
4633-
4634-
4635-
#[cfg(all(feature = "nightly", feature="arrayvec"))]
4636-
impl<V: Serialize, const C: usize> Serialize for arrayvec::ArrayVec<V,C> {
4637-
default fn serialize(&self, serializer: &mut Serializer<impl Write>) -> Result<(), SavefileError> {
4638-
regular_serialize_vec(self, serializer)
4633+
#[cfg(feature="arrayvec")]
4634+
impl<V:ReprC, const C: usize> ReprC for arrayvec::ArrayVec<V,C> {
4635+
unsafe fn repr_c_optimization_safe(version: u32) -> IsReprC {
4636+
V::repr_c_optimization_safe(version)
46394637
}
46404638
}
46414639

4642-
#[cfg(all(not(feature = "nightly"), feature="arrayvec"))]
4643-
impl<V: Serialize, const C: usize> Serialize for arrayvec::ArrayVec<V,C> {
4644-
fn serialize(&self, serializer: &mut Serializer<impl Write>) -> Result<(), SavefileError> {
4645-
regular_serialize_vec(self, serializer)
4646-
}
4647-
}
46484640

4649-
#[cfg(all(feature = "nightly", feature="arrayvec"))]
4650-
impl<V: Serialize + ReprC + Copy, const C:usize> Serialize for arrayvec::ArrayVec<V,C> {
4641+
#[cfg(feature="arrayvec")]
4642+
impl<V: Serialize + ReprC, const C:usize> Serialize for arrayvec::ArrayVec<V,C> {
46514643
fn serialize(&self, serializer: &mut Serializer<impl Write>) -> Result<(), SavefileError> {
46524644
unsafe {
46534645
if V::repr_c_optimization_safe(serializer.version).is_false() {
@@ -4663,31 +4655,8 @@ impl<V: Serialize + ReprC + Copy, const C:usize> Serialize for arrayvec::ArrayVe
46634655
}
46644656
}
46654657
}
4666-
#[cfg(all(feature = "nightly", feature="arrayvec"))]
4667-
impl<V: Deserialize, const C:usize> Deserialize for arrayvec::ArrayVec<V,C> {
4668-
default fn deserialize(deserializer: &mut Deserializer<impl Read>) -> Result<arrayvec::ArrayVec<V,C>, SavefileError> {
4669-
let mut ret = arrayvec::ArrayVec::new();
4670-
let l = deserializer.read_usize()?;
4671-
for _ in 0..l {
4672-
ret.push(V::deserialize(deserializer)?);
4673-
}
4674-
Ok(ret)
4675-
}
4676-
}
46774658

4678-
#[cfg(all(not(feature = "nightly"), feature="arrayvec"))]
4679-
impl<V: Deserialize, const C: usize> Deserialize for arrayvec::ArrayVec<V,C> {
4680-
fn deserialize(deserializer: &mut Deserializer<impl Read>) -> Result<arrayvec::ArrayVec<V,C>, SavefileError> {
4681-
let mut ret = arrayvec::ArrayVec::new();
4682-
let l = deserializer.read_usize()?;
4683-
for _ in 0..l {
4684-
ret.push(V::deserialize(deserializer)?);
4685-
}
4686-
Ok(ret)
4687-
}
4688-
}
4689-
4690-
#[cfg(all(feature = "nightly", feature="arrayvec"))]
4659+
#[cfg(feature="arrayvec")]
46914660
impl<V: Deserialize + ReprC, const C: usize > Deserialize for arrayvec::ArrayVec<V,C> {
46924661
fn deserialize(deserializer: &mut Deserializer<impl Read>) -> Result<arrayvec::ArrayVec<V,C>, SavefileError> {
46934662
let mut ret = arrayvec::ArrayVec::new();
@@ -4775,7 +4744,6 @@ use std::fmt::{Debug, Display, Formatter};
47754744
use std::marker::PhantomData;
47764745
use std::path::{PathBuf, Path};
47774746
use std::ptr::NonNull;
4778-
use std::slice;
47794747
use std::sync::Arc;
47804748

47814749

savefile/src/prelude.rs

+9
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,12 @@ pub use memoffset::span_of;
99

1010
#[cfg(feature="ring")]
1111
pub use super::{CryptoReader, CryptoWriter, save_encrypted_file, load_encrypted_file};
12+
13+
#[cfg(feature="derive")]
14+
pub use savefile_derive::Savefile;
15+
#[cfg(feature="derive")]
16+
pub use savefile_derive::SavefileNoIntrospect;
17+
#[cfg(feature="derive")]
18+
pub use savefile_derive::SavefileIntrospectOnly;
19+
#[cfg(feature="derive")]
20+
pub use savefile_derive::ReprC;

0 commit comments

Comments
 (0)