summaryrefslogtreecommitdiffstats
path: root/vendor/der/src/encode_ref.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:47:55 +0000
commit2aadc03ef15cb5ca5cc2af8a7c08e070742f0ac4 (patch)
tree033cc839730fda84ff08db877037977be94e5e3a /vendor/der/src/encode_ref.rs
parentInitial commit. (diff)
downloadcargo-upstream.tar.xz
cargo-upstream.zip
Adding upstream version 0.70.1+ds1.upstream/0.70.1+ds1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/der/src/encode_ref.rs')
-rw-r--r--vendor/der/src/encode_ref.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/vendor/der/src/encode_ref.rs b/vendor/der/src/encode_ref.rs
new file mode 100644
index 0000000..8a60a93
--- /dev/null
+++ b/vendor/der/src/encode_ref.rs
@@ -0,0 +1,71 @@
+//! Wrapper object for encoding reference types.
+// TODO(tarcieri): replace with blanket impls of `Encode(Value)` for reference types?
+
+use crate::{Encode, EncodeValue, Length, Result, Tag, Tagged, ValueOrd, Writer};
+use core::cmp::Ordering;
+
+/// Reference encoder: wrapper type which impls `Encode` for any reference to a
+/// type which impls the same.
+pub struct EncodeRef<'a, T>(pub &'a T);
+
+impl<'a, T> AsRef<T> for EncodeRef<'a, T> {
+ fn as_ref(&self) -> &T {
+ self.0
+ }
+}
+
+impl<'a, T> Encode for EncodeRef<'a, T>
+where
+ T: Encode,
+{
+ fn encoded_len(&self) -> Result<Length> {
+ self.0.encoded_len()
+ }
+
+ fn encode(&self, writer: &mut impl Writer) -> Result<()> {
+ self.0.encode(writer)
+ }
+}
+
+/// Reference value encoder: wrapper type which impls `EncodeValue` and `Tagged`
+/// for any reference type which impls the same.
+///
+/// By virtue of the blanket impl, this type also impls `Encode`.
+pub struct EncodeValueRef<'a, T>(pub &'a T);
+
+impl<'a, T> AsRef<T> for EncodeValueRef<'a, T> {
+ fn as_ref(&self) -> &T {
+ self.0
+ }
+}
+
+impl<'a, T> EncodeValue for EncodeValueRef<'a, T>
+where
+ T: EncodeValue,
+{
+ fn value_len(&self) -> Result<Length> {
+ self.0.value_len()
+ }
+
+ fn encode_value(&self, writer: &mut impl Writer) -> Result<()> {
+ self.0.encode_value(writer)
+ }
+}
+
+impl<'a, T> Tagged for EncodeValueRef<'a, T>
+where
+ T: Tagged,
+{
+ fn tag(&self) -> Tag {
+ self.0.tag()
+ }
+}
+
+impl<'a, T> ValueOrd for EncodeValueRef<'a, T>
+where
+ T: ValueOrd,
+{
+ fn value_cmp(&self, other: &Self) -> Result<Ordering> {
+ self.0.value_cmp(other.0)
+ }
+}