Skip to content

Commit 2c5b36b

Browse files
committed
16.4
1 parent cb49ef6 commit 2c5b36b

File tree

6 files changed

+63
-6
lines changed

6 files changed

+63
-6
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ fn main() {
6565

6666
# Changelog
6767

68+
## 0.16.4
69+
70+
Support for boxed slices. I.e, Savefile can now serialize data of type ```Box<[T]>```.
71+
6872
## 0.16.3
6973

7074
Just some fixes to the test suite, needed to make github actions CI work.

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.3"
3+
version = "0.16.4"
44
authors = ["Anders Musikka <[email protected]>"]
55

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

savefile-test/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ nightly=["savefile/nightly"]
1212

1313
[dependencies]
1414
savefile = { path = "../savefile", features = ["size_sanity_checks", "encryption", "compression","bit-set","bit-vec","rustc-hash"]}
15-
savefile-derive = { path = "../savefile-derive", version = "=0.16.3" }
15+
savefile-derive = { path = "../savefile-derive", version = "=0.16.4" }
1616
bit-vec = "0.6"
1717
arrayvec="0.7"
1818
smallvec="*"

savefile-test/src/lib.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1178,13 +1178,21 @@ pub fn fuzz_regression2() {
11781178

11791179

11801180
#[test]
1181-
pub fn test_roundtrip_arc_array() {
1181+
pub fn test_roundtrip_arc_slice() {
11821182
let a1: Arc<[u32]> = vec![1,2,3,4].into();
11831183
assert_roundtrip(a1);
11841184
let a2: Arc<[String]> = vec!["Hello".to_string()].into();
11851185
assert_roundtrip(a2);
11861186
}
11871187

1188+
#[test]
1189+
pub fn test_roundtrip_boxed_slice() {
1190+
let a1: Box<[u32]> = vec![1,2,3,4].into_boxed_slice();
1191+
assert_roundtrip(a1);
1192+
let a2: Box<[String]> = vec!["Hello".to_string()].into_boxed_slice();
1193+
assert_roundtrip(a2);
1194+
}
1195+
11881196
#[test]
11891197
pub fn test_serialize_btreemap() {
11901198
let mut bm = BTreeMap::new();

savefile/Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "savefile"
3-
version = "0.16.3"
3+
version = "0.16.4"
44
authors = ["Anders Musikka <[email protected]>"]
55
documentation = "https://docs.rs/savefile/"
66
homepage = "https://github.com/avl/savefile/"
@@ -52,10 +52,10 @@ bit-set = {version = "0.5", optional = true}
5252
rustc-hash = {version = "1.1", optional = true}
5353
memoffset = "0.9"
5454
byteorder = "1.4"
55-
savefile-derive = {path="../savefile-derive", version = "=0.16.3", optional = true }
55+
savefile-derive = {path="../savefile-derive", version = "=0.16.4", optional = true }
5656

5757
[dev-dependencies]
58-
savefile-derive = { path="../savefile-derive", version = "=0.16.3" }
58+
savefile-derive = { path="../savefile-derive", version = "=0.16.4" }
5959

6060
[build-dependencies]
6161
rustc_version="0.2"

savefile/src/lib.rs

+45
Original file line numberDiff line numberDiff line change
@@ -4021,11 +4021,32 @@ fn regular_serialize_vec<T: Serialize>(items: &[T], serializer: &mut Serializer<
40214021
}
40224022
}
40234023

4024+
impl<T: WithSchema> WithSchema for Box<[T]> {
4025+
fn schema(version: u32) -> Schema {
4026+
Schema::Vector(Box::new(T::schema(version)))
4027+
}
4028+
}
40244029
impl<T: WithSchema> WithSchema for Arc<[T]> {
40254030
fn schema(version: u32) -> Schema {
40264031
Schema::Vector(Box::new(T::schema(version)))
40274032
}
40284033
}
4034+
impl<T: Introspect> Introspect for Box<[T]> {
4035+
fn introspect_value(&self) -> String {
4036+
return "Box[]".to_string();
4037+
}
4038+
4039+
fn introspect_child(&self, index: usize) -> Option<Box<dyn IntrospectItem + '_>> {
4040+
if index >= self.len() {
4041+
return None;
4042+
}
4043+
return Some(introspect_item(index.to_string(), &self[index]));
4044+
}
4045+
fn introspect_len(&self) -> usize {
4046+
self.len()
4047+
}
4048+
}
4049+
40294050
impl<T: Introspect> Introspect for Arc<[T]> {
40304051
fn introspect_value(&self) -> String {
40314052
return "Arc[]".to_string();
@@ -4082,6 +4103,25 @@ impl Deserialize for Arc<str> {
40824103
}
40834104
}
40844105

4106+
impl<T: Serialize + ReprC> Serialize for Box<[T]> {
4107+
fn serialize(&self, serializer: &mut Serializer<impl Write>) -> Result<(), SavefileError> {
4108+
unsafe {
4109+
if T::repr_c_optimization_safe(serializer.version).is_false() {
4110+
regular_serialize_vec(&*self, serializer)
4111+
} else {
4112+
let l = self.len();
4113+
serializer.write_usize(l)?;
4114+
serializer.write_buf(std::slice::from_raw_parts(
4115+
(*self).as_ptr() as *const u8,
4116+
std::mem::size_of::<T>() * l,
4117+
))
4118+
}
4119+
}
4120+
}
4121+
}
4122+
impl<T: ReprC> ReprC for Box<[T]> { }
4123+
4124+
40854125
impl<T: Serialize + ReprC> Serialize for Arc<[T]> {
40864126
fn serialize(&self, serializer: &mut Serializer<impl Write>) -> Result<(), SavefileError> {
40874127
unsafe {
@@ -4105,6 +4145,11 @@ impl<T: Deserialize+ReprC> Deserialize for Arc<[T]> {
41054145
Ok(Vec::<T>::deserialize(deserializer)?.into())
41064146
}
41074147
}
4148+
impl<T: Deserialize+ReprC> Deserialize for Box<[T]> {
4149+
fn deserialize(deserializer: &mut Deserializer<impl Read>) -> Result<Self, SavefileError> {
4150+
Ok(Vec::<T>::deserialize(deserializer)?.into_boxed_slice())
4151+
}
4152+
}
41084153

41094154
impl<T> ReprC for Vec<T> {}
41104155

0 commit comments

Comments
 (0)