Commit Graph

349 Commits

Author SHA1 Message Date
Sean McArthur 24b159c016 v0.5.4 2020-01-23 10:41:50 -08:00
Stepan Koltsov a4b63406c7 Do not panic on Bytes::slice_ref on empty slice (#355)
Use case:

```
let bytes: Bytes = ...
let subbytes = bytes.slice(a..b); // where a == b
let slice = &subbytes[..];
let slice_bytes = bytes.slice_ref(slice);
```

Last line should not panic, because `slice` object is derived from
the original `Bytes` object.

Before this commit it panics, because `Bytes::slice` returns a fresh
`Bytes` object when `begin == end`.
2020-01-23 10:29:42 -08:00
Sean McArthur 3861bf1217 Disable loom on Windows (#366) 2020-01-23 10:10:15 -08:00
南浦月 f812a9f70e merge hex & debug into fmt (#357) 2020-01-23 10:08:40 -08:00
Nikhil Benesch 5a5bb9ed2a Minor documentation fixes (#351)
* Remove incorrect comment about behavior of put_slice
* Improve grammar and clarity of BytesMut documentation
2020-01-23 10:06:49 -08:00
Andrew Tunnell-Jones 5369a989a4 Fix reversed arguments in PartialOrd impls (#358) 2020-01-23 10:06:00 -08:00
John-John Tedro 1efd9958a3 Assert that the alignment of Shared is appropriate (#362) 2020-01-23 10:05:20 -08:00
Stepan Koltsov ab3934634c rebuild_boxed_slice instead of rebuild_boxed_vec (#364)
"Promotable" `Bytes` object is constructed from disassembling a
boxed slice object, not a vec.

Thus we should reassemble data into a boxed slice, not into a vec.

Although, it does not create any problems in practice (`Box<[u8]>`
is allocated exactly the same way as `Vec<u8>`), technically it is
a violation of `Vec::from_raw_parts` spec which says that a pointer
"needs to have been previously allocated via `String`/`Vec<T>`".
2020-01-23 10:04:13 -08:00
Sean McArthur 952158eeb2 Fix Bytes::truncate losing the original Vec's capacity (#361) 2020-01-22 16:37:53 -08:00
Stepan Koltsov ec0825fe19 Make Bytes::new const fn (#356) 2020-01-09 14:27:28 -08:00
Sean McArthur 4efc6a7663 Improve assertion messages (#349) 2020-01-07 21:29:36 -08:00
Thayne McCombs 7974f2d645 Re-add impl From<BytesMut> for Bytes (#348) 2019-12-19 11:09:14 -08:00
Sean McArthur 419e36e67c Fix Bytes when Vec pointer's LSB is set (#346)
This separates the `SharedVtable` into 3:

- `PromotableEvenVtable`: The original `SharedVtable`, which will
  promote the `Vec` to `Shared` on the first clone, and is selected when
  the `Vec`'s pointer has the LSB unset.
- `PromotableOddVtable`: Similar to the `PromotableEvenVtable`, but
  selected when the `Vec`'s pointer has the LSB set. This vtable differs
  in the masking used when reconstructing the `Vec`.
- `SharedVtable`: This no longer checks if its current kind is `VEC` or
  `ARC`, and is only created by the "promotable" vtables.

This also adds a test using an "odd" global allocator that purposefully
bumps all pointers with alignment of 1.

Closes #343
2019-12-17 13:23:15 -08:00
Sean McArthur 0e01f51584 v0.5.3 2019-12-12 12:00:21 -08:00
Sean McArthur 0a99d22ed6 Assert the LSB is 0 when converting Vec into Bytes 2019-12-12 11:46:51 -08:00
Steven Fackler 14222d5a9a Fix conversion of empty vectors to Bytes
Closes #340
2019-12-12 08:33:07 -08:00
Sean McArthur f9a0419036 Make Deref impls of Buf and BufMut forward more methods 2019-12-10 13:35:26 -08:00
Sean McArthur 3a14876f84 Optimize BufMut for Vec and BytesMut (#338) 2019-12-10 13:30:49 -08:00
Sean McArthur bdd6975e08 Add must_use to split, split_off, and split_to 2019-12-04 12:39:48 -08:00
Mikhail Zabaluev bad4e1b3ab Fix regression in Bytes::truncate (#333)
When the length to truncate is greater than the buffer's current
length, do nothing instead of clearing the contents.
2019-12-01 14:00:42 -08:00
Sean McArthur 5012a86462 v0.5.2 2019-11-27 12:59:28 -08:00
Steven Fackler 5c1a59b5c0 Update README.md (#320) 2019-11-27 12:06:33 -08:00
Sean McArthur e8fed52f6a Add accessors to Limit combinator (#325) 2019-11-26 18:08:39 -08:00
Steven Fackler 9600a080b1 chore: prepare v0.5.1 release (#322) 2019-11-26 14:15:57 -08:00
Steven Fackler 56c06ddeb0 doc: fix BytesMut growth documentation. (#321) 2019-11-25 11:40:40 -08:00
Carl Lerche bbd86c9501 prepare v0.5.0 release (#319) 2019-11-25 11:19:30 -08:00
Sean McArthur 7af4e633dc Export public the combinator types (#318) 2019-11-25 10:47:37 -08:00
Sean McArthur eb6efb98d1 add BufMutExt::limit (#309)
This type is the counterpart to BufExt::take. It limits how many bytes
some `BufMut` can actually be filled with.
2019-11-20 15:10:30 -08:00
Carl Lerche 69ed8e2650 remove either feature (#315)
remove either feature
2019-11-20 12:59:44 -08:00
Carl Lerche 0c6b4179e3 implicitly grow BytesMut; add BufMutExt::chain_mut (#316)
This brings `BytesMut` in line with `Vec<u8>` behavior.

This also fixes an existing bug in BytesMut::bytes_mut that exposes
invalid slices. The bug was recently introduced and was only on master
and never released to `crates.io`.

In order to fix a test, `BufMutExt::chain_mut` is provided. Withou this,
it is not possible to chain two `&mut [u8]`.

Closes #170
2019-11-20 12:11:40 -08:00
Andrew Tunnell-Jones 777bcd5f31 Make Bytes::from_static a const fn (#311)
Rust versions bumped to the minimum needed for const slice len.
2019-11-20 11:10:03 -08:00
Sean McArthur f840d6d773 Change loom tests to use cfg(loom) internally (#314) 2019-11-13 14:55:25 -08:00
Sean McArthur 624d9d7613 Improve performance of BytesMut::reserve (#313)
Makes the short-circuit checks inline-able, and the moves the actual
reserving code to an inner function.
2019-11-12 14:52:02 -08:00
Sean McArthur f6ee348c3d implement Buf for std::io::Cursor (#308) 2019-11-04 17:23:40 -08:00
Sean McArthur 571175539d Move "extra" methods to extension traits (#306) 2019-10-31 09:39:58 -07:00
Sean McArthur 5a006d4c80 Change BufMut methods that expose maybe-uninitialized bytes (#305)
- The return type of `BufMut::bytes_mut` is now
  `&mut [MaybeUninit<u8>]`.
- The argument type of `BufMut::bytes_vectored_mut` is now
  `&mut [bytes::buf::IoSliceMut]`.
- `bytes::buf::IoSliceMut` is a `repr(transparent)` wrapper around an
  `std::io::IoSliceMut`, but does not expose the inner bytes with a safe
  API, since they might be uninitialized.
- `BufMut::bytesMut` and `BufMut::bytes_vectored_mut` are no longer
  `unsafe fn`, since the types encapsulate the unsafety instead.
2019-10-24 14:40:45 -07:00
Sean McArthur 0d8834affb Add benchmarks for BytesMut vs Vec (#303) 2019-10-23 13:40:04 -07:00
Sean McArthur ccc8de14a3 Remove Buf impl for &str (#301)
A `&str` cannot arbitrarily advance bytes, since it will panic if
advanced to the middle of a Unicode segment.
2019-10-16 11:28:50 -07:00
Sean McArthur c3f9cf1d72 Refactor Bytes to use an internal vtable (#298)
Bytes is a useful tool for managing multiple slices into the same region
of memory, and the other things it used to have been removed to reduce
complexity. The exact strategy for managing the multiple references is
no longer hard-coded, but instead backing by a customizable vtable.

- Removed ability to mutate the underlying memory from the `Bytes` type.
- Removed the "inline" (SBO) mechanism in `Bytes`. The reduces a large
  amount of complexity, and improves performance when accessing the
  slice of bytes, since a branch is no longer needed to check if the
  data is inline.
- Removed `Bytes` knowledge of `BytesMut` (`BytesMut` may grow that
  knowledge back at a future point.)
2019-10-16 09:53:36 -07:00
Taiki Endo 1af1de3e56 Fix build fail with serde feature (#293)
Verify no-std build and all features build
2019-09-08 22:10:46 +02:00
Taiki Endo 7ee37ca25c Remove a patch for cross 2019-09-08 17:58:32 +02:00
Chris Beck 79359b1526 Add no_std support, by adding an std feature (#281)
To make the library work as `no_std` we add an `std` feature which
is on by default. When it is off, we compile as `no_std` and make
parts of the API that require `std::io` conditional on the `std`
feature.
2019-09-05 14:00:23 -07:00
Taiki Endo cdb1ebff8c Fix one use of MaybeUninit (#291) 2019-09-01 01:33:10 +09:00
Ralf Jung 25214da03f use raw ptr for racy load and add comment (#289) 2019-08-28 14:41:04 -07:00
Douman def58d121a Fix clippy (#285) 2019-08-27 14:19:44 -07:00
Douman e7fe763e95 Make From only for static slices to Bytes 2019-08-27 22:17:26 +02:00
Douman d5a18356a0 Remove IntoBuf/FromBuf (#288)
As consequence Buf::collect is removed as well, which is replaced with `Buf::into_bytes`. The advantage of `Buf::into_bytes` is that it can be optimized in cases where converting a `T: Buf` into a `Bytes` instance is efficient.
2019-08-27 13:09:43 -07:00
nanpuyue d340e88f36 use mem::MaybeUninit instead of mem::uninitialized 2019-08-16 15:49:37 +02:00
nanpuyue bca82980e2 impl LowerHex/UpperHex for Bytes/BytesMut 2019-08-16 15:49:37 +02:00
Douman ede02c0e16 Remove byteorder dependency (#280) 2019-08-11 10:16:03 -07:00