@@ -16,7 +16,7 @@ mod ops;
1616pub use cpu:: * ;
1717pub use memory:: * ;
1818
19- #[ derive( Debug , Snafu ) ]
19+ #[ derive( Debug , PartialEq , Snafu ) ]
2020pub enum ParseQuantityError {
2121 #[ snafu( display( "input is either empty or contains non-ascii characters" ) ) ]
2222 InvalidFormat ,
@@ -28,7 +28,7 @@ pub enum ParseQuantityError {
2828 InvalidSuffix { source : ParseSuffixError } ,
2929}
3030
31- #[ derive( Clone , Debug , PartialEq ) ]
31+ #[ derive( Clone , Copy , Debug , PartialEq , PartialOrd ) ]
3232pub struct Quantity {
3333 // FIXME (@Techassi): Support arbitrary-precision numbers
3434 /// The numeric value of the quantity.
@@ -138,22 +138,26 @@ impl Quantity {
138138 let factor = ( s. base ( ) as f64 ) . powf ( s. exponent ( ) )
139139 / ( suffix. base ( ) as f64 ) . powf ( suffix. exponent ( ) ) ;
140140
141- * v = * v * factor;
141+ * v *= factor;
142142 * s = suffix;
143143
144144 false
145145 }
146146 }
147147 }
148+
149+ pub fn ceil ( & mut self ) {
150+ self . value = self . value . ceil ( ) ;
151+ }
148152}
149153
150- #[ derive( Debug , Snafu ) ]
154+ #[ derive( Debug , PartialEq , Snafu ) ]
151155#[ snafu( display( "failed to parse {input:?} as quantity suffix" ) ) ]
152156pub struct ParseSuffixError {
153157 input : String ,
154158}
155159
156- #[ derive( Clone , Debug , PartialEq ) ]
160+ #[ derive( Clone , Copy , Debug , PartialEq , PartialOrd ) ]
157161pub enum Suffix {
158162 DecimalByteMultiple ( DecimalByteMultiple ) ,
159163 BinaryByteMultiple ( BinaryByteMultiple ) ,
@@ -244,7 +248,7 @@ pub trait SuffixMultiple {
244248/// - <https://physics.nist.gov/cuu/Units/binary.html>
245249///
246250/// [k8s-serialization-format]: https://github.com/kubernetes/apimachinery/blob/8c60292e48e46c4faa1e92acb232ce6adb37512c/pkg/api/resource/quantity.go#L37-L59
247- #[ derive( Clone , Debug , PartialEq , strum:: Display , strum:: EnumString ) ]
251+ #[ derive( Clone , Copy , Debug , PartialEq , PartialOrd , strum:: Display , strum:: EnumString ) ]
248252pub enum BinaryByteMultiple {
249253 #[ strum( serialize = "Ki" ) ]
250254 Kibi ,
@@ -310,7 +314,7 @@ impl SuffixMultiple for BinaryByteMultiple {
310314/// - <https://physics.nist.gov/cuu/Units/binary.html>
311315///
312316/// [k8s-serialization-format]: https://github.com/kubernetes/apimachinery/blob/8c60292e48e46c4faa1e92acb232ce6adb37512c/pkg/api/resource/quantity.go#L37-L59
313- #[ derive( Clone , Debug , PartialEq , strum:: Display , strum:: EnumString ) ]
317+ #[ derive( Clone , Copy , Debug , PartialEq , PartialOrd , strum:: Display , strum:: EnumString ) ]
314318pub enum DecimalByteMultiple {
315319 #[ strum( serialize = "m" ) ]
316320 Milli ,
@@ -355,7 +359,7 @@ impl SuffixMultiple for DecimalByteMultiple {
355359/// ### See
356360///
357361/// - <https://en.wikipedia.org/wiki/Scientific_notation#E_notation>
358- #[ derive( Clone , Debug , PartialEq ) ]
362+ #[ derive( Clone , Copy , Debug , PartialEq , PartialOrd ) ]
359363pub struct DecimalExponent ( f64 ) ;
360364
361365impl Deref for DecimalExponent {
@@ -471,10 +475,10 @@ mod test {
471475 #[ case] output : & str ,
472476 #[ case] scaled : bool ,
473477 ) {
474- let parsed = Quantity :: from_str ( input) . unwrap ( ) ;
475- let ( quantity , was_scaled) = parsed. scale_to ( Suffix :: BinaryByteMultiple ( scale_to) ) ;
478+ let mut parsed = Quantity :: from_str ( input) . unwrap ( ) ;
479+ let was_scaled = parsed. scale_to ( Suffix :: BinaryByteMultiple ( scale_to) ) ;
476480
477- assert_eq ! ( quantity . to_string( ) , output) ;
481+ assert_eq ! ( parsed . to_string( ) , output) ;
478482 assert_eq ! ( was_scaled, scaled) ;
479483 }
480484
@@ -487,10 +491,10 @@ mod test {
487491 #[ case] output : & str ,
488492 #[ case] scaled : bool ,
489493 ) {
490- let parsed = Quantity :: from_str ( input) . unwrap ( ) ;
491- let ( quantity , was_scaled) = parsed. scale_to ( Suffix :: DecimalByteMultiple ( scale_to) ) ;
494+ let mut parsed = Quantity :: from_str ( input) . unwrap ( ) ;
495+ let was_scaled = parsed. scale_to ( Suffix :: DecimalByteMultiple ( scale_to) ) ;
492496
493- assert_eq ! ( quantity . to_string( ) , output) ;
497+ assert_eq ! ( parsed . to_string( ) , output) ;
494498 assert_eq ! ( was_scaled, scaled) ;
495499 }
496500
@@ -504,10 +508,10 @@ mod test {
504508 #[ case] output : & str ,
505509 #[ case] scaled : bool ,
506510 ) {
507- let parsed = Quantity :: from_str ( input) . unwrap ( ) ;
508- let ( quantity , was_scaled) = parsed. scale_to ( Suffix :: DecimalByteMultiple ( scale_to) ) ;
511+ let mut parsed = Quantity :: from_str ( input) . unwrap ( ) ;
512+ let was_scaled = parsed. scale_to ( Suffix :: DecimalByteMultiple ( scale_to) ) ;
509513
510- assert_eq ! ( quantity . to_string( ) , output) ;
514+ assert_eq ! ( parsed . to_string( ) , output) ;
511515 assert_eq ! ( was_scaled, scaled) ;
512516 }
513517
@@ -521,10 +525,10 @@ mod test {
521525 #[ case] output : & str ,
522526 #[ case] scaled : bool ,
523527 ) {
524- let parsed = Quantity :: from_str ( input) . unwrap ( ) ;
525- let ( quantity , was_scaled) = parsed. scale_to ( Suffix :: DecimalExponent ( scale_to) ) ;
528+ let mut parsed = Quantity :: from_str ( input) . unwrap ( ) ;
529+ let was_scaled = parsed. scale_to ( Suffix :: DecimalExponent ( scale_to) ) ;
526530
527- assert_eq ! ( quantity . to_string( ) , output) ;
531+ assert_eq ! ( parsed . to_string( ) , output) ;
528532 assert_eq ! ( was_scaled, scaled) ;
529533 }
530534}
0 commit comments