{{ doc }}
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
pub struct {{ name }}(pub f64);
impl std::ops::Deref for {{ name }} {
    type Target = f64;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
impl Element for {{ name }} {
    const ID: VInt64 = VInt64::from_encoded({{ id }});
    fn decode_body<B: Buf>(buf: &mut B) -> crate::Result<Self> {
        match buf.remaining() {
{% if has_default %}
            0 => Ok(Self(hexf::hexf64!("{{ default_value }}"))),
{% else %}
            0 => Ok(Self(0.0)),
{% endif %}
            4 => {
                let mut value = [0u8; 4];
                value.copy_from_slice(&buf.chunk()[..4]);
                buf.advance(4);
                Ok(Self(f32::from_be_bytes(value) as f64))
            }
            8 => {
                let mut value = [0u8; 8];
                value.copy_from_slice(&buf.chunk()[..8]);
                buf.advance(8);
                Ok(Self(f64::from_be_bytes(value)))
            }
            _ => Err(crate::Error::UnderDecode(Self::ID)),
        }
    }
    fn encode_body<B: BufMut>(&self, buf: &mut B) -> crate::Result<()> {
        fn can_represent_as_f32(value: f64) -> bool {
            if value.is_infinite() || value.is_nan() {
                return false;
            }
            if value.abs() > f32::MAX as f64 || (value != 0.0 && value.abs() < f32::MIN_POSITIVE as f64) {
                return false;
            }
            let f32_value = value as f32;
            f32_value as f64 == value
        }
        if can_represent_as_f32(self.0) {
            buf.put_slice(&(self.0 as f32).to_be_bytes());
            Ok(())
        } else {
            buf.put_slice(&self.0.to_be_bytes());
            Ok(())
        }
    }
{% if has_default %}
    const HAS_DEFAULT_VALUE: bool = true;
{% endif %}
}
impl Default for {{ name }} {
    fn default() -> Self {
{% if has_default %}
        Self(hexf::hexf64!("{{ default_value }}"))
{% else %}
        Self(0.0)
{% endif %}
    }
}
