Skip to content

Commit 6061ee0

Browse files
christollidaymeta-codesync[bot]
authored andcommitted
Simplify PagableDeserialize for unsized types
Summary: In particular adding: `impl<'de, T: ?Sized + PagableBoxDeserialize<'de>> PagableDeserialize<'de> for Box<T>` Which allows a single impl of PagableBoxDeserialize on unsized types to support Box<T> and Arc<T>, which simplifies Pagable impls for str wrapper types in the next diff. Keeping custom impls for `triomphe::Arc` since I believe creating a box first and passing it to `triomphe::Arc` requires an extra allocation. Reviewed By: cjhopman Differential Revision: D92449957 fbshipit-source-id: c751db7a9dc24c70f587dd46abb7684fc781bdc0
1 parent 2d9d129 commit 6061ee0

File tree

4 files changed

+58
-100
lines changed

4 files changed

+58
-100
lines changed

pagable/src/arc_erase.rs

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,16 @@ pub trait ArcErase: std::any::Any + Sized + Send + Sync + 'static {
222222
) -> crate::Result<Self>;
223223
}
224224

225+
impl WeakErase for () {
226+
fn is_expired(&self) -> bool {
227+
true
228+
}
229+
230+
fn upgrade_weak(&self) -> Option<Box<dyn ArcEraseDyn>> {
231+
None
232+
}
233+
}
234+
225235
impl<T: ?Sized + PagableSerialize + for<'de> PagableBoxDeserialize<'de> + Send + Sync + 'static>
226236
WeakErase for std::sync::Weak<T>
227237
{
@@ -265,63 +275,38 @@ impl<T: ?Sized + PagableSerialize + for<'de> PagableBoxDeserialize<'de> + Send +
265275
}
266276
}
267277

268-
impl<T: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'static> WeakErase
269-
for std::sync::Weak<[T]>
270-
{
271-
fn is_expired(&self) -> bool {
272-
self.strong_count() == 0
273-
}
274-
275-
fn upgrade_weak(&self) -> Option<Box<dyn ArcEraseDyn>> {
276-
self.upgrade().map(|t| Box::new(t) as _)
277-
}
278-
}
279-
280278
impl<T: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'static> ArcErase
281-
for std::sync::Arc<[T]>
279+
for triomphe::Arc<T>
282280
{
283-
type Weak = std::sync::Weak<[T]>;
284-
281+
type Weak = ();
285282
fn dupe_strong(&self) -> Self {
286-
self.dupe()
283+
(*self).clone()
287284
}
288285

289286
fn erase_type() -> impl ArcEraseType {
290287
StdArcEraseType::<Self>::new()
291288
}
292289

293290
fn identity(&self) -> usize {
294-
Arc::as_ptr(self) as *const T as usize
291+
self.as_ptr() as usize
295292
}
296293

297-
fn downgrade(&self) -> Option<std::sync::Weak<[T]>> {
298-
Some(Arc::downgrade(self))
294+
fn downgrade(&self) -> Option<Self::Weak> {
295+
None
299296
}
300297

301298
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
302-
<[T] as PagableSerialize>::pagable_serialize(self, ser)
299+
T::pagable_serialize(&self, ser)
303300
}
304301

305302
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
306303
deser: &mut D,
307304
) -> crate::Result<Self> {
308-
Ok(<Box<[T]>>::pagable_deserialize(deser)?.into())
309-
}
310-
}
311-
312-
impl WeakErase for () {
313-
fn is_expired(&self) -> bool {
314-
true
315-
}
316-
317-
fn upgrade_weak(&self) -> Option<Box<dyn ArcEraseDyn>> {
318-
None
305+
Ok(Self::new(T::pagable_deserialize(deser)?))
319306
}
320307
}
321308

322-
impl<T: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'static> ArcErase
323-
for triomphe::Arc<T>
324-
{
309+
impl ArcErase for triomphe::Arc<str> {
325310
type Weak = ();
326311
fn dupe_strong(&self) -> Self {
327312
(*self).clone()
@@ -332,21 +317,22 @@ impl<T: PagableSerialize + for<'de> PagableDeserialize<'de> + Send + Sync + 'sta
332317
}
333318

334319
fn identity(&self) -> usize {
335-
self.as_ptr() as usize
320+
self.as_ptr() as *const () as usize
336321
}
337322

338323
fn downgrade(&self) -> Option<Self::Weak> {
339324
None
340325
}
341326

342327
fn serialize_inner(&self, ser: &mut dyn PagableSerializer) -> crate::Result<()> {
343-
T::pagable_serialize(&self, ser)
328+
<str as PagableSerialize>::pagable_serialize(self, ser)
344329
}
345330

346331
fn deserialize_inner<'de, D: PagableDeserializer<'de> + ?Sized>(
347332
deser: &mut D,
348333
) -> crate::Result<Self> {
349-
Ok(Self::new(T::pagable_deserialize(deser)?))
334+
let s: String = String::pagable_deserialize(deser)?;
335+
Ok(s.into())
350336
}
351337
}
352338

pagable/src/impls/arc.rs

Lines changed: 14 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,18 @@ impl<
5757
}
5858
}
5959

60-
impl<
61-
T: PagableSerialize
62-
+ for<'a> PagableDeserialize<'a>
63-
+ PagableSerialize
64-
+ Send
65-
+ Sync
66-
+ std::any::Any,
67-
> PagableSerialize for std::sync::Arc<[T]>
60+
impl<T: for<'a> PagableDeserialize<'a> + PagableSerialize + Send + Sync + std::any::Any + 'static>
61+
PagableSerialize for triomphe::Arc<T>
6862
{
6963
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
7064
serializer.serialize_arc(self)
7165
}
7266
}
7367

74-
impl<'de, T: PagableSerialize + for<'a> PagableDeserialize<'a> + Send + Sync + std::any::Any>
75-
PagableDeserialize<'de> for std::sync::Arc<[T]>
68+
impl<
69+
'de,
70+
T: for<'a> PagableDeserialize<'a> + PagableSerialize + Send + Sync + std::any::Any + 'static,
71+
> PagableDeserialize<'de> for triomphe::Arc<T>
7672
{
7773
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
7874
deserializer: &mut D,
@@ -81,22 +77,18 @@ impl<'de, T: PagableSerialize + for<'a> PagableDeserialize<'a> + Send + Sync + s
8177
}
8278
}
8379

84-
impl<
85-
T: PagableSerialize
86-
+ for<'a> PagableDeserialize<'a>
87-
+ PagableSerialize
88-
+ Send
89-
+ Sync
90-
+ std::any::Any,
91-
> PagableSerialize for triomphe::Arc<T>
80+
impl<T: for<'a> PagableDeserialize<'a> + PagableSerialize + Send + Sync + std::any::Any + 'static>
81+
PagableSerialize for triomphe::Arc<[T]>
9282
{
9383
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
9484
serializer.serialize_arc(self)
9585
}
9686
}
9787

98-
impl<'de, T: PagableSerialize + for<'a> PagableDeserialize<'a> + Send + Sync + std::any::Any>
99-
PagableDeserialize<'de> for triomphe::Arc<T>
88+
impl<
89+
'de,
90+
T: for<'a> PagableDeserialize<'a> + PagableSerialize + Send + Sync + std::any::Any + 'static,
91+
> PagableDeserialize<'de> for triomphe::Arc<[T]>
10092
{
10193
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
10294
deserializer: &mut D,
@@ -105,23 +97,13 @@ impl<'de, T: PagableSerialize + for<'a> PagableDeserialize<'a> + Send + Sync + s
10597
}
10698
}
10799

108-
impl<
109-
T: PagableSerialize
110-
+ for<'a> PagableDeserialize<'a>
111-
+ PagableSerialize
112-
+ Send
113-
+ Sync
114-
+ std::any::Any,
115-
> PagableSerialize for triomphe::Arc<[T]>
116-
{
100+
impl PagableSerialize for triomphe::Arc<str> {
117101
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
118102
serializer.serialize_arc(self)
119103
}
120104
}
121105

122-
impl<'de, T: PagableSerialize + for<'a> PagableDeserialize<'a> + Send + Sync + std::any::Any>
123-
PagableDeserialize<'de> for triomphe::Arc<[T]>
124-
{
106+
impl<'de> PagableDeserialize<'de> for triomphe::Arc<str> {
125107
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
126108
deserializer: &mut D,
127109
) -> crate::Result<Self> {
@@ -152,23 +134,6 @@ impl<
152134
}
153135
}
154136

155-
impl PagableSerialize for std::sync::Arc<str> {
156-
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
157-
use serde::Serialize;
158-
Ok(self.serialize(serializer.serde())?)
159-
}
160-
}
161-
162-
impl<'de> PagableDeserialize<'de> for std::sync::Arc<str> {
163-
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
164-
deserializer: &mut D,
165-
) -> crate::Result<Self> {
166-
use serde::Deserialize;
167-
let v = String::deserialize(deserializer.serde())?;
168-
Ok(v.into())
169-
}
170-
}
171-
172137
#[cfg(test)]
173138
mod tests {
174139
use std::sync::Arc;

pagable/src/impls/serde.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ use_serde!(bool);
6262
use_serde!(String);
6363
use_serde!(Duration);
6464

65-
use_serde!(Box<str>);
66-
6765
impl PagableSerialize for serde_json::Value {
6866
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
6967
match self {

pagable/src/impls/std.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,17 +105,17 @@ impl<'de, T: PagableDeserialize<'de>, E: PagableDeserialize<'de>> PagableDeseria
105105
}
106106
}
107107

108-
impl<T: PagableSerialize> PagableSerialize for Box<T> {
108+
impl<T: ?Sized + PagableSerialize> PagableSerialize for Box<T> {
109109
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
110110
(**self).pagable_serialize(serializer)
111111
}
112112
}
113113

114-
impl<'de, T: PagableDeserialize<'de>> PagableDeserialize<'de> for Box<T> {
114+
impl<'de, T: ?Sized + PagableBoxDeserialize<'de>> PagableDeserialize<'de> for Box<T> {
115115
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
116116
deserializer: &mut D,
117117
) -> crate::Result<Self> {
118-
Ok(Box::new(T::pagable_deserialize(deserializer)?))
118+
T::deserialize_box(deserializer)
119119
}
120120
}
121121

@@ -138,16 +138,10 @@ impl<T: PagableSerialize> PagableSerialize for [T] {
138138
}
139139
}
140140

141-
impl<T: PagableSerialize> PagableSerialize for Box<[T]> {
142-
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
143-
<[T] as PagableSerialize>::pagable_serialize(&**self, serializer)
144-
}
145-
}
146-
147-
impl<'de, T: PagableDeserialize<'de>> PagableDeserialize<'de> for Box<[T]> {
148-
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
141+
impl<'de, T: PagableDeserialize<'de>> PagableBoxDeserialize<'de> for [T] {
142+
fn deserialize_box<D: PagableDeserializer<'de> + ?Sized>(
149143
deserializer: &mut D,
150-
) -> crate::Result<Self> {
144+
) -> crate::Result<Box<Self>> {
151145
let items = usize::deserialize(deserializer.serde())?;
152146
let mut v = Vec::with_capacity(items);
153147
for _ in 0..items {
@@ -175,6 +169,21 @@ impl<'de> PagableDeserialize<'de> for AtomicI64 {
175169
}
176170
}
177171

172+
impl PagableSerialize for str {
173+
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
174+
Ok(self.serialize(serializer.serde())?)
175+
}
176+
}
177+
178+
impl<'de> PagableBoxDeserialize<'de> for str {
179+
fn deserialize_box<D: PagableDeserializer<'de> + ?Sized>(
180+
deserializer: &mut D,
181+
) -> crate::Result<Box<Self>> {
182+
let s = String::deserialize(deserializer.serde())?;
183+
Ok(s.into_boxed_str())
184+
}
185+
}
186+
178187
#[cfg(test)]
179188
mod tests {
180189
use super::*;

0 commit comments

Comments
 (0)