Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

implement Buf and BufMut for Either #225

Merged
merged 2 commits into from Sep 3, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions .travis.yml
Expand Up @@ -39,6 +39,9 @@ matrix:
# 128 bit numbers
- env: EXTRA_ARGS="--features i128"

# `Either` impls
- env: EXTRA_ARGS="--features either"

# WASM support
- rust: beta
script:
Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Expand Up @@ -26,6 +26,7 @@ features = ["i128"]
byteorder = "1.1.0"
iovec = "0.1"
serde = { version = "1.0", optional = true }
either = { version = "1.5", default-features = false, optional = true }

[dev-dependencies]
serde_test = "1.0"
Expand Down
89 changes: 89 additions & 0 deletions src/either.rs
@@ -0,0 +1,89 @@
extern crate either;

use {Buf, BufMut};

use self::either::Either;
use self::either::Either::*;
use iovec::IoVec;

impl<L, R> Buf for Either<L, R>
where
L: Buf,
R: Buf,
{
fn remaining(&self) -> usize {
match *self {
Left(ref b) => b.remaining(),
Right(ref b) => b.remaining(),
}
}

fn bytes(&self) -> &[u8] {
match *self {
Left(ref b) => b.bytes(),
Right(ref b) => b.bytes(),
}
}

fn bytes_vec<'a>(&'a self, dst: &mut [&'a IoVec]) -> usize {
match *self {
Left(ref b) => b.bytes_vec(dst),
Right(ref b) => b.bytes_vec(dst),
}
}

fn advance(&mut self, cnt: usize) {
match *self {
Left(ref mut b) => b.advance(cnt),
Right(ref mut b) => b.advance(cnt),
}
}

fn copy_to_slice(&mut self, dst: &mut [u8]) {
match *self {
Left(ref mut b) => b.copy_to_slice(dst),
Right(ref mut b) => b.copy_to_slice(dst),
}
}
}

impl<L, R> BufMut for Either<L, R>
where
L: BufMut,
R: BufMut,
{
fn remaining_mut(&self) -> usize {
match *self {
Left(ref b) => b.remaining_mut(),
Right(ref b) => b.remaining_mut(),
}
}

unsafe fn bytes_mut(&mut self) -> &mut [u8] {
match *self {
Left(ref mut b) => b.bytes_mut(),
Right(ref mut b) => b.bytes_mut(),
}
}

unsafe fn bytes_vec_mut<'a>(&'a mut self, dst: &mut [&'a mut IoVec]) -> usize {
match *self {
Left(ref mut b) => b.bytes_vec_mut(dst),
Right(ref mut b) => b.bytes_vec_mut(dst),
}
}

unsafe fn advance_mut(&mut self, cnt: usize) {
match *self {
Left(ref mut b) => b.advance_mut(cnt),
Right(ref mut b) => b.advance_mut(cnt),
}
}

fn put_slice(&mut self, src: &[u8]) {
match *self {
Left(ref mut b) => b.put_slice(src),
Right(ref mut b) => b.put_slice(src),
}
}
}
4 changes: 4 additions & 0 deletions src/lib.rs
Expand Up @@ -99,3 +99,7 @@ pub use byteorder::{ByteOrder, BigEndian, LittleEndian};
#[cfg(feature = "serde")]
#[doc(hidden)]
pub mod serde;

// Optional `Either` support
#[cfg(feature = "either")]
mod either;