{{ doc }}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct {{ name }}(pub i64);
impl std::ops::Deref for {{ name }} {
    type Target = i64;
    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> {
        if !buf.has_remaining() {
            return Ok(Self({{ default_value }}));
        }
        if buf.remaining() > 8 {
            return Err(crate::Error::UnderDecode(Self::ID));
        }
        let len = buf.remaining().min(8);
        let is_neg = (buf.chunk()[0] & 0x80) != 0;
        let mut value = if is_neg { [0xFFu8; 8] } else { [0u8; 8] };
        value[8 - len..].copy_from_slice(&buf.chunk()[..len]);
        buf.advance(len);
        Ok(Self(i64::from_be_bytes(value)))
    }
    fn encode_body<B: BufMut>(&self, buf: &mut B) -> crate::Result<()> {
        let bytes = self.0.to_be_bytes();
        if self.0 >= 0 {
            let first_non_zero = bytes.iter().position(|&b| b != 0).unwrap_or(bytes.len() - 1);
            buf.put_slice(&bytes[first_non_zero..]);
            Ok(())
        } else {
            let first_non_ff = bytes.iter().position(|&b| b != 0xFF).unwrap_or(bytes.len() - 1);
            buf.put_slice(&bytes[first_non_ff..]);
            Ok(())
        }
    }
{% if has_default %}
    const HAS_DEFAULT_VALUE: bool = true;
{% endif %}
}
impl Default for {{ name }} {
    fn default() -> Self {
        Self({{ default_value }})
    }
}
