@@ -5,6 +5,8 @@ use crate::rhs_types::{
55} ;
66use crate :: scheme:: { FieldIndex , IndexAccessError } ;
77use crate :: strict_partial_ord:: StrictPartialOrd ;
8+ #[ cfg( feature = "get-size2" ) ]
9+ use get_size2:: { GetSize , GetSizeTracker } ;
810use serde:: de:: { DeserializeSeed , Deserializer } ;
911use serde:: { Deserialize , Serialize , Serializer } ;
1012use 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]
10661080fn test_lhs_value_deserialize ( ) {
10671081 use std:: str:: FromStr ;
@@ -1176,3 +1190,94 @@ fn test_type_deserialize() {
11761190fn 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