range-split 0.4.0

Utilities for splitting sequences with range parameters
Documentation
use crate::mem;

use bytes::{Buf, Bytes, BytesMut};

use core::ops::{RangeFrom, RangeFull, RangeTo, RangeToInclusive};

impl_take_range! {
    <RangeFull> for Bytes {
        #[inline]
        fn take_range(&mut self, _range) {
            self.split_off(0)
        }
        #[inline]
        fn remove_range(&mut self, _range) {
            self.clear()
        }
    }
    <RangeFull> for BytesMut {
        #[inline]
        fn take_range(&mut self, _range) {
            self.split()
        }
        #[inline]
        fn remove_range(&mut self, _range) {
            self.clear()
        }
    }
    <RangeFrom<usize>> for Bytes {
        #[inline]
        fn take_range(&mut self, range) {
            self.split_off(range.start)
        }
        #[inline]
        fn remove_range(&mut self, range) {
            self.truncate(range.start)
        }
    }
    <RangeFrom<usize>> for BytesMut {
        #[inline]
        fn take_range(&mut self, range) {
            self.split_off(range.start)
        }
        #[inline]
        fn remove_range(&mut self, range) {
            self.truncate(range.start)
        }
    }
    <RangeTo<usize>> for Bytes {
        #[inline]
        fn take_range(&mut self, range) {
            self.split_to(range.end)
        }
        #[inline]
        fn remove_range(&mut self, range) {
            self.advance(range.end)
        }
    }
    <RangeTo<usize>> for BytesMut {
        #[inline]
        fn take_range(&mut self, range) {
            self.split_to(range.end)
        }
        #[inline]
        fn remove_range(&mut self, range) {
            self.advance(range.end)
        }
    }
    <RangeToInclusive<usize>> for Bytes {
        #[inline]
        fn take_range(&mut self, range) {
            self.take_range(mem::convert_inclusive_range(range))
        }
        #[inline]
        fn remove_range(&mut self, range) {
            self.remove_range(mem::convert_inclusive_range(range))
        }
    }
    <RangeToInclusive<usize>> for BytesMut {
        #[inline]
        fn take_range(&mut self, range) {
            self.take_range(mem::convert_inclusive_range(range))
        }
        #[inline]
        fn remove_range(&mut self, range) {
            self.remove_range(mem::convert_inclusive_range(range))
        }
    }
}