Skip to content

Commit ec8e24e

Browse files
utkarshgupta137marmeladema
authored andcommitted
Implement get-size2 for LhsValue
1 parent f848c25 commit ec8e24e

7 files changed

Lines changed: 166 additions & 1 deletion

File tree

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ criterion = "0.8.2"
2424
dyn-clone = "1.0.20"
2525
erased-serde = "0.4.9"
2626
fnv = "1.0.7"
27+
get-size2 = "0.10.3"
2728
getrandom = "0.3.4"
2829
indoc = "2.0.7"
2930
js-sys = "0.3.85"

engine/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ cidr.workspace = true
2626
dyn-clone.workspace = true
2727
erased-serde.workspace = true
2828
fnv.workspace = true
29+
get-size2 = { workspace = true, optional = true }
2930
memchr.workspace = true
3031
rand.workspace = true
3132
regex-automata = { workspace = true, optional = true }
@@ -46,5 +47,6 @@ serde_json.workspace = true
4647
getrandom.workspace = true
4748

4849
[features]
49-
default = ["regex"]
50+
default = ["get-size2", "regex"]
51+
get-size2 = ["dep:get-size2"]
5052
regex = ["dep:regex-automata"]

engine/src/lhs_types/array.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use crate::lhs_types::AsRefIterator;
44
use crate::types::{
55
CompoundType, GetType, IntoValue, LhsValue, LhsValueSeed, Type, TypeMismatchError,
66
};
7+
#[cfg(feature = "get-size2")]
8+
use get_size2::{GetSize, GetSizeTracker};
79
use serde::de::{self, DeserializeSeed, Deserializer, SeqAccess, Visitor};
810
use serde::ser::SerializeSeq;
911
use serde::{Serialize, Serializer};
@@ -20,6 +22,16 @@ pub(crate) enum InnerArray<'a> {
2022
Borrowed(&'a [LhsValue<'a>]),
2123
}
2224

25+
#[cfg(feature = "get-size2")]
26+
impl GetSize for InnerArray<'_> {
27+
fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
28+
match self {
29+
Self::Owned(values) => values.get_heap_size_with_tracker(tracker),
30+
Self::Borrowed(_) => (0, tracker),
31+
}
32+
}
33+
}
34+
2335
impl<'a> InnerArray<'a> {
2436
#[inline]
2537
const fn new() -> Self {
@@ -81,6 +93,13 @@ pub struct Array<'a> {
8193
pub(crate) data: InnerArray<'a>,
8294
}
8395

96+
#[cfg(feature = "get-size2")]
97+
impl GetSize for Array<'_> {
98+
fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
99+
self.data.get_heap_size_with_tracker(tracker)
100+
}
101+
}
102+
84103
impl<'a> Array<'a> {
85104
/// Creates a new array
86105
pub fn new(val_type: impl Into<CompoundType>) -> Self {

engine/src/lhs_types/bytes.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#[cfg(feature = "get-size2")]
2+
use get_size2::{GetSize, GetSizeTracker};
13
use serde::de::Visitor;
24
use serde::{Deserialize, Deserializer, Serialize, Serializer};
35
use std::borrow::{Borrow, Cow};
@@ -13,6 +15,16 @@ pub enum Bytes<'a> {
1315
Owned(Box<[u8]>),
1416
}
1517

18+
#[cfg(feature = "get-size2")]
19+
impl GetSize for Bytes<'_> {
20+
fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
21+
match self {
22+
Self::Owned(bytes) => bytes.get_heap_size_with_tracker(tracker),
23+
Self::Borrowed(_) => (0, tracker),
24+
}
25+
}
26+
}
27+
1628
impl<'a> Bytes<'a> {
1729
/// Clones self into a fully owned byte string.
1830
#[inline]

engine/src/lhs_types/map.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use super::array::InnerArray;
33
use crate::TypeMismatchError;
44
use crate::lhs_types::{AsRefIterator, Bytes};
55
use crate::types::{CompoundType, GetType, IntoValue, LhsValue, LhsValueSeed, Type};
6+
#[cfg(feature = "get-size2")]
7+
use get_size2::{GetSize, GetSizeTracker};
68
use serde::de::{self, DeserializeSeed, Deserializer, MapAccess, SeqAccess, Visitor};
79
use serde::ser::{SerializeMap, SerializeSeq};
810
use serde::{Serialize, Serializer};
@@ -17,6 +19,16 @@ pub(crate) enum InnerMap<'a> {
1719
Borrowed(&'a BTreeMap<Box<[u8]>, LhsValue<'a>>),
1820
}
1921

22+
#[cfg(feature = "get-size2")]
23+
impl GetSize for InnerMap<'_> {
24+
fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
25+
match self {
26+
Self::Owned(values) => values.get_heap_size_with_tracker(tracker),
27+
Self::Borrowed(_) => (0, tracker),
28+
}
29+
}
30+
}
31+
2032
impl<'a> InnerMap<'a> {
2133
#[inline]
2234
const fn new() -> Self {
@@ -79,6 +91,13 @@ pub struct Map<'a> {
7991
pub(crate) data: InnerMap<'a>,
8092
}
8193

94+
#[cfg(feature = "get-size2")]
95+
impl GetSize for Map<'_> {
96+
fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
97+
self.data.get_heap_size_with_tracker(tracker)
98+
}
99+
}
100+
82101
impl<'a> Map<'a> {
83102
/// Creates a new map
84103
pub fn new(val_type: impl Into<CompoundType>) -> Self {

engine/src/types.rs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use crate::rhs_types::{
55
};
66
use crate::scheme::{FieldIndex, IndexAccessError};
77
use crate::strict_partial_ord::StrictPartialOrd;
8+
#[cfg(feature = "get-size2")]
9+
use get_size2::{GetSize, GetSizeTracker};
810
use serde::de::{DeserializeSeed, Deserializer};
911
use serde::{Deserialize, Serialize, Serializer};
1012
use std::cmp::Ordering;
@@ -1062,6 +1064,18 @@ declare_types!(
10621064
Map[CompoundType](#[serde(skip_deserializing)] Map<'a> | UninhabitedMap | UninhabitedMap),
10631065
);
10641066

1067+
#[cfg(feature = "get-size2")]
1068+
impl GetSize for LhsValue<'_> {
1069+
fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
1070+
match self {
1071+
Self::Bool(_) | Self::Int(_) | Self::Ip(_) => (0, tracker),
1072+
Self::Bytes(value) => value.get_heap_size_with_tracker(tracker),
1073+
Self::Array(value) => value.get_heap_size_with_tracker(tracker),
1074+
Self::Map(value) => value.get_heap_size_with_tracker(tracker),
1075+
}
1076+
}
1077+
}
1078+
10651079
#[test]
10661080
fn test_lhs_value_deserialize() {
10671081
use std::str::FromStr;
@@ -1176,3 +1190,94 @@ fn test_type_deserialize() {
11761190
fn test_size_of_lhs_value() {
11771191
assert_eq!(std::mem::size_of::<LhsValue<'_>>(), 48);
11781192
}
1193+
1194+
#[cfg(feature = "get-size2")]
1195+
#[test]
1196+
fn test_lhs_value_get_size() {
1197+
let stack_size = std::mem::size_of::<LhsValue<'static>>();
1198+
1199+
assert_eq!(LhsValue::Bool(false).get_size(), stack_size);
1200+
assert_eq!(LhsValue::Int(42).get_size(), stack_size);
1201+
assert_eq!(
1202+
LhsValue::Ip(IpAddr::V4(Ipv4Addr::LOCALHOST)).get_size(),
1203+
stack_size
1204+
);
1205+
1206+
let borrowed_bytes = LhsValue::Bytes(Bytes::Borrowed(b"borrowed"));
1207+
assert_eq!(borrowed_bytes.get_size(), stack_size);
1208+
1209+
let owned_bytes = LhsValue::Bytes(Bytes::Owned(Box::from(&b"owned"[..])));
1210+
assert_eq!(owned_bytes.get_size(), stack_size + b"owned".len());
1211+
}
1212+
1213+
#[cfg(feature = "get-size2")]
1214+
#[test]
1215+
fn test_array_lhs_value_get_size() {
1216+
let stack_size = std::mem::size_of::<LhsValue<'static>>();
1217+
1218+
let mut borrowed_values = Vec::with_capacity(4);
1219+
borrowed_values.push(LhsValue::Bytes(Bytes::Borrowed(b"borrowed")));
1220+
let borrowed_values_capacity = borrowed_values.capacity();
1221+
let owned_array_of_borrowed = Array::try_from_vec(Type::Bytes, borrowed_values).unwrap();
1222+
assert_eq!(
1223+
LhsValue::Array(owned_array_of_borrowed.as_ref()).get_size(),
1224+
stack_size
1225+
);
1226+
assert_eq!(
1227+
LhsValue::Array(owned_array_of_borrowed).get_size(),
1228+
stack_size + borrowed_values_capacity * stack_size
1229+
);
1230+
1231+
let mut owned_values = Vec::with_capacity(4);
1232+
owned_values.push(LhsValue::Bytes(Bytes::Owned(Box::from(&b"owned"[..]))));
1233+
let owned_values_capacity = owned_values.capacity();
1234+
let owned_array_of_owned = Array::try_from_vec(Type::Bytes, owned_values).unwrap();
1235+
assert_eq!(
1236+
LhsValue::Array(owned_array_of_owned.as_ref()).get_size(),
1237+
stack_size
1238+
);
1239+
assert_eq!(
1240+
LhsValue::Array(owned_array_of_owned).get_size(),
1241+
stack_size + owned_values_capacity * stack_size + b"owned".len()
1242+
);
1243+
}
1244+
1245+
#[cfg(feature = "get-size2")]
1246+
#[test]
1247+
fn test_map_lhs_value_get_size() {
1248+
let stack_size = std::mem::size_of::<LhsValue<'static>>();
1249+
1250+
let owned_map_of_borrowed = Map::try_from_iter(
1251+
Type::Bytes,
1252+
[Ok::<_, TypeMismatchError>((
1253+
Box::from(b"key".as_slice()),
1254+
Bytes::Borrowed(b"borrowed"),
1255+
))],
1256+
)
1257+
.unwrap();
1258+
assert_eq!(
1259+
LhsValue::Map(owned_map_of_borrowed.as_ref()).get_size(),
1260+
stack_size
1261+
);
1262+
assert_eq!(
1263+
LhsValue::Map(owned_map_of_borrowed).get_size(),
1264+
stack_size + std::mem::size_of::<Box<[u8]>>() + b"key".len() + stack_size
1265+
);
1266+
1267+
let owned_map_of_owned = Map::try_from_iter(
1268+
Type::Bytes,
1269+
[Ok::<_, TypeMismatchError>((
1270+
Box::from(b"key".as_slice()),
1271+
Bytes::Owned(Box::from(&b"owned"[..])),
1272+
))],
1273+
)
1274+
.unwrap();
1275+
assert_eq!(
1276+
LhsValue::Map(owned_map_of_owned.as_ref()).get_size(),
1277+
stack_size
1278+
);
1279+
assert_eq!(
1280+
LhsValue::Map(owned_map_of_owned).get_size(),
1281+
stack_size + std::mem::size_of::<Box<[u8]>>() + b"key".len() + stack_size + b"owned".len()
1282+
);
1283+
}

0 commit comments

Comments
 (0)