Skip to content
Snippets Groups Projects
  1. Mar 12, 2018
    • Sean McArthur's avatar
      Make Buf and BufMut usable as trait objects (#186) · ce79f0a2
      Sean McArthur authored
      - All the `get_*` and `put_*` methods that take `T: ByteOrder` have
        a `where Self: Sized` bound added, so that they are only usable from
        sized types. It was impossible to make `Buf` or `BufMut` into trait
        objects before, so this change doesn't break anyone.
      - Add `get_n_be`/`get_n_le`/`put_n_be`/`put_n_le` methods that can be
        used on trait objects.
      - Deprecate the export of `ByteOrder` and methods generic on it.
      
      Fixes #163 
      ce79f0a2
  2. Jan 29, 2018
  3. Jan 08, 2018
  4. Jan 06, 2018
  5. Jan 03, 2018
    • Stepan Koltsov's avatar
      Optimize shallow_clone for Bytes::split_{off,to} (#92) · 6a3d20bb
      Stepan Koltsov authored
      If `shallow_clone` is called with `&mut self`, and `Bytes` contains
      `Vec`, then expensive CAS can be avoided, because no other thread
      have references to this `Bytes` object.
      
      Bench `split_off_and_drop` difference:
      
      Before the diff:
      
      ```
      test split_off_and_drop             ... bench:      91,858 ns/iter (+/- 17,401)
      ```
      
      With the diff:
      
      ```
      test split_off_and_drop             ... bench:      81,162 ns/iter (+/- 17,603)
      ```
      6a3d20bb
    • jq-rs's avatar
      Add support for unsplit() to BytesMut (#162) · 2ca61d88
      jq-rs authored
      Add support for unsplit() to BytesMut which combines splitted contiguous memory blocks efficiently.
      2ca61d88
  6. Dec 16, 2017
  7. Dec 13, 2017
    • Carl Lerche's avatar
      Add `advance` on `Bytes` and `BytesMut` (#166) · 02891144
      Carl Lerche authored
      * Compact Bytes original capacity representation
      
      In order to avoid unnecessary allocations, a `Bytes` structure remembers
      the capacity with which it was first created. When a reserve operation
      is issued, this original capacity value is used to as a baseline for
      reallocating new storage.
      
      Previously, this original capacity value was stored in its raw form. In
      other words, the original capacity `usize` was stored as is. In order to
      reclaim some `Bytes` internal storage space for additional features,
      this original capacity value is compressed from requiring 16 bits to 3.
      
      To do this, instead of storing the exact original capacity. The original
      capacity is rounded down to the nearest power of two. If the original
      capacity is less than 1024, then it is rounded down to zero. This
      roughly means that the original capacity is now stored as a table:
      
      0 => 0
      1 => 1k
      2 => 2k
      3 => 4k
      4 => 8k
      5 => 16k
      6 => 32k
      7 => 64k
      
      For the purposes that the original capacity feature was introduced, this
      is sufficient granularity.
      
      * Provide `advance` on Bytes and BytesMut
      
      This is the `advance` function that would be part of a `Buf`
      implementation. However, `Bytes` and `BytesMut` cannot impl `Buf` until
      the next breaking release.
      
      The implementation uses the additional storage made available by the
      previous commit to store the number of bytes that the view was advanced.
      The `ptr` pointer will point to the start of the window, avoiding any
      pointer arithmetic when dereferencing the `Bytes` handle.
      Unverified
      02891144
  8. Oct 21, 2017
  9. Aug 18, 2017
    • Dan Burkert's avatar
      small fixups in bytes.rs (#145) · 03d501b1
      Dan Burkert authored
      * Inner: make uninitialized construction explicit
      * Remove Inner2
      * Remove unnecessary transmutes
      * Use AtomicPtr::get_mut where possible
      * Some minor tweaks
      03d501b1
  10. Aug 17, 2017
  11. Aug 12, 2017
  12. Aug 06, 2017
  13. Jul 02, 2017
  14. Jul 01, 2017
  15. Jun 27, 2017
  16. Jun 26, 2017
  17. Jun 15, 2017
  18. May 26, 2017
  19. May 24, 2017
  20. May 22, 2017
  21. May 15, 2017
    • Stepan Koltsov's avatar
      BytesMut::reserve should not overallocate (#117) · 7110d57b
      Stepan Koltsov authored
      Round up to power of 2 is not necessary, because `reserve` already
      doubles previous capacity in
      
      ```
      	new_cap = cmp::max(
      		cmp::max(v.capacity() << 1, new_cap),
      		original_capacity);
      ```
      
      which makes `reserve` calls constant in average. Avoiding rounding
      up prevents `reserve` from wasting space when caller knows exactly
      what space they need.
      
      Patch adds three tests which would fail before this test. The most
      important is this:
      
      ```
      #[test]
      fn reserve_in_arc_unique_does_not_overallocate() {
          let mut bytes = BytesMut::with_capacity(1000);
          bytes.take();
      
          // now bytes is Arc and refcount == 1
      
          assert_eq!(1000, bytes.capacity());
          bytes.reserve(2001);
          assert_eq!(2001, bytes.capacity());
      }
      ```
      
      It asserts that when user requests more than double of current
      capacity, exactly the requested amount of memory is allocated and
      is not wasted to next power of two.
      7110d57b
    • Stepan Koltsov's avatar
      Bytes::extend_from_slice (#120) · 07db74b0
      Stepan Koltsov authored
      `extend_with_slice` is super-convenient operation on `Bytes`.
      
      While `put_u8` would be expensive on `Bytes`, `extend_from_slice`
      is OK, because it is batch, and it checks for kind only once.
      
      Patch also adds `impl Extend for Bytes`.
      
      cc #116
      07db74b0
  22. May 02, 2017
  23. May 01, 2017
  24. Apr 30, 2017
  25. Apr 26, 2017
  26. Apr 24, 2017
  27. Apr 14, 2017
Loading