Commit Graph

217 Commits

Author SHA1 Message Date
Sean Chen aab420b2ec Add semicolon to return statement for consistency 2019-06-20 14:36:13 -07:00
Jan-Erik Rediger 841ca1492b Fix word duplication in docs 2019-04-22 14:29:08 +02:00
Aleksei Voronov 9207e7442f Implement FromStr for ArrayString
This is very useful for generic code that may want to parse arbitrary
input string into arbitrary other types.

Limitations of the FromStr trait don't allow us to keep the original string slice
inside the CapacityError, unfortunately.
2018-12-23 12:50:29 +01:00
bluss cffdb4602a Merge branch '0.4' of https://github.com/bluss/arrayvec
* '0.4' of https://github.com/bluss/arrayvec:
  0.4.10
  FIX: Remove unused Copy/Clone for MaybeUninit
  FIX: Use repr(C) MaybeUninit after discussion with RalfJung
2018-12-22 20:05:42 +01:00
bluss 06930d27ce FIX: Remove unused Copy/Clone for MaybeUninit 2018-12-22 19:59:32 +01:00
bluss 9fc6737e1b FIX: Use repr(C) MaybeUninitCopy after discussion with RalfJung
We have a recommendation from the unsafe-wg (no rule yet), that
repr(C) for unions should work this way, so that we can cast from the
union type to one of its fields.
2018-12-22 14:28:20 +01:00
bluss 85d9a06a62 FIX: Use repr(C) MaybeUninit after discussion with RalfJung
We have a recommendation from the unsafe-wg (no rule yet), that
repr(C) for unions should work this way, so that we can cast from the
union type to one of its fields.
2018-12-22 14:25:16 +01:00
bluss 74745a9756 DOC: Update minimum rust requirement to Rust 1.24
Rust 1.24 is on debian stable. It is compatible with crossbeam (Rust 1.26),
the rdep with most downloads.
2018-12-18 21:40:39 +01:00
bluss c4cd63209f FEAT: Use a separate union MaybeUninitCopy for ArrayString
This is the "real" union solution, and ArrayString can use it since its
backing array is Copy. Unfortunately, we'll have to use the Copy bound
on the type, making it "viral" and visible in the user API.
2018-12-16 18:32:14 +01:00
bluss 784ccc97ca DOC: Remove warning on ArrayVec's into_inner method 2018-12-16 18:32:14 +01:00
bluss f5290c1eea FIX: Remove unused .as_mut_ptr() on the Array trait
Raw pointer taking should go through the MaybeUninit wrappers around the
arrays anyway, when it is partially uninitialized, which it often is.

The remaining .as_ptr() and .as_slice() methods on Array is only used
on a fully initialized array in ArrayString::from_byte_string
2018-12-16 18:32:14 +01:00
bluss 6c099e148f FIX: Add associated constant for Array's capacity
This isn't of much use at the moment, but future Rust features could
mean we can use it.
2018-12-16 18:32:14 +01:00
bluss 94ab27a649 Merge branch '0.4' of https://github.com/bluss/arrayvec into merge-0.4
* '0.4' of https://github.com/bluss/arrayvec:
  0.4.9
  TEST: Add test that ensures the MaybeUninit impl is used on nightly
  FIX: Remove use of uninitialized in ArrayString
  FEAT: Implement a "MaybeUninit" and use it conditionally
  TEST: Add test that Some(ArrayVec<[&_;_]>).is_some()
  MAINT: Test the 0.4 branch in travis
2018-12-16 18:09:20 +01:00
bluss d395a01e7c FIX: Remove use of uninitialized in ArrayString
We can't fix this properly (MaybeUninit with a union) until we change
the user visible API (we need to require that A: Copy.

As a temporary solution for arrayvec version 0.4.*, we use zeroed to
initialize an array of bytes, instead of using uninitialized. This may
have a negative performance impact, but the fix is to upgrade to future
arrayvec 0.5.
2018-12-15 15:12:03 +01:00
bluss 29012231a8 FEAT: Implement a "MaybeUninit" and use it conditionally
Use a build script to detect if we can use MaybeUninit or NoDrop.
Enabling unstable features automatically is not ideal, but since it's
a soundness issue we should do it.

Use a MaybeUninit-like union on nightly when we can. We use a feature
detection script in build.rs, so that we also go back to the fallback if
the unstable feature changes in an unexpected way.

We need to continue to use NoDrop for best working stable
implementation, but we eagerly use our union solution where we can,
currently only in nightlies.

Rustc feature probe code written by Josh Stone (cuviper),
taken from num-bigint.
2018-12-15 15:12:03 +01:00
bluss bf3b8c4f0f FIX: Unused code warning in array trait 2018-11-30 18:49:28 +01:00
bluss fd98c6647d FEAT: Improved extend performance 2018-11-28 16:04:05 +01:00
bluss 47827e4843 FIX: Remake extend_from_slice to try_extend_from_slice
Do nothing and return an error, if the slice doesn't fit in the
remaining capacity.
2018-11-28 15:59:11 +01:00
bluss 8e5ff2d0fb FIX: Rename ArrayVec .capacity_left() → .remaining_capacity() 2018-11-28 15:52:46 +01:00
Thomas de Zeeuw c4b6e86211 REFAC: use extend_from_slice in Write implementation for ArrayVec 2018-11-26 12:59:30 +01:00
Thomas de Zeeuw 2120e4bb75 FEAT: Add ArrayVec.extend_from_slice 2018-11-26 12:59:30 +01:00
Thomas de Zeeuw d11c853346 FEAT: Add ArrayVec.capacity_left 2018-11-26 12:59:30 +01:00
bluss f40e708f7c FIX: In truncate, don't access self while holding raw pointer derived from self
Again, stacked borrows model makes the `self.set_len()` call illegal
because we are holding (and are going to use) another raw pointer
derived from self, `tail`.
2018-11-25 16:37:29 +01:00
bluss 91e88a4976 FEAT: Simplify stack guard in extend
This simplification -- borrowing self.len instead of self, leads to
an improvement in the extend_from_slice benchmark.

It's also guided by the discussion of stacked borrows; the old code
would be invalid, because the whole self is borrowed while ptr is derived from
self.
2018-11-25 16:33:07 +01:00
bluss 233df73ab2 Merge pull request #98 from bluss/use-drop-in-place
Use drop_in_place for truncate and clear (and drop)
2018-11-25 10:40:17 +01:00
bluss e80446c646 Merge pull request #102 from gnzlbg/ub
Fix undefined behavior in DerefMut of ArrayString
2018-11-25 10:34:54 +01:00
bluss 74f86a710e Merge branch 'master' into master 2018-11-25 10:29:22 +01:00
bluss e355c9eb31 DOC: Hide Array methods on impls
These just clutter up the docs. Most important that the users can see
the list of implemented array sizes, not the methods for each of those.
2018-11-25 09:32:29 +01:00
bluss 50728e4cda DOC: Add doc for additional array features flags 2018-11-25 09:24:16 +01:00
bluss f1d73f4feb FEAT: Add array sizes 33 to 128 and 129 to 255 under feature flags
This way we cover all users up to 256 at least. The reason these are not
enabled by default is that they slow down the compilation of the crate
by a factor of 2-3x.
2018-11-25 09:22:51 +01:00
Clar Fon 46b64537cb Implement Clone, Debug for IntoIter 2018-10-28 18:45:11 -04:00
Clar Charr 55bedc922a Make zero-capacity ArrayVec a zero-sized type. 2018-10-14 17:25:45 -04:00
gnzlbg 9f57879028 fix undefined behavior in DerefMut of ArrayString 2018-08-31 22:43:05 +02:00
bluss 9db64d5948 FIX: Fix a typo in a comment 2018-03-25 23:26:20 +02:00
bluss 602e55dc67 FEAT: Use drop_in_place for truncate and clear (and drop)
This should perform better in both release and debug mode.

NOTE: This is significant because it changes the drop order of the
elements, and how we handle panicking destructors. If just one of the
destructors panic during ArrayVec drop, clear or truncate, the rest of
the elements should still drop. If we encounter another panic during
that process, however, Rust will abort as usual for panic during
unwinding.
2018-03-25 23:26:20 +02:00
bluss 16aabf7c2c DOC: Fix typo in insert doc 2018-02-10 21:57:36 +01:00
bluss c1b72500cd REFAC Use clone_from_slice, extend in ArrayVec::clone_from
This is just a cleanup of the code, with less repetition.
2018-02-06 19:29:15 +01:00
bluss 2eeed4bae5 Merge pull request #90 from jeehoonkang/rust-1.12.1
Support Rust 1.13.0
2018-01-17 20:35:36 +01:00
bluss a903e1a770 FIX: Fix future compat warning with pointer casts
```
warning: the type of this value must be known in this context
   --> src/lib.rs:312:32
    |
312 |                 ptr::copy(p, p.offset(1), len - index);
    |                                ^^^^^^
    |
    = note: #[warn(tyvar_behind_raw_pointer)] on by default
    = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
    = note: for more information, see issue #46906 <https://github.com/rust-lang/rust/issues/46906>
```
2018-01-17 20:25:47 +01:00
Jeehoon Kang 3df64ccd50 Support Rust 1.13.0 2018-01-16 15:04:45 +09:00
bluss ef133ef960 FIX: Use drop_in_place in IntoIter's drop. 2017-12-03 21:57:38 +01:00
bluss ce009233ae BUG: Fix 1 << 16 size array impl: only possible on bigger than 16-bit 2017-11-03 19:29:54 +01:00
bluss a2e3fcea3f DOC: Minor fixes in docs, for ' → ’ 2017-10-27 22:54:46 +02:00
bluss 456aeaf557 FEAT: Remove odds dependency in arrayvec
Copy the encode_utf8 function from odds. std encode_utf8 requires Rust
1.15 and has a different signature, this one seems to fit us better.
2017-10-27 22:31:49 +02:00
bluss 895d450366 DOC: Promise debug assertions for unsafe methods
Instead of being vague about it, we can promise it.

We continue to be a bit vague in ArrayString::set_len.  I don't see how
to add a char boundary check in ArrayString::set_len unfortunately.

It's a tricky issue, checking char boundaries requires reading the
memory of the string, and we don't even know if the user of set_len has
initialized that area of memory yet (but they hopefully did).
2017-10-26 19:27:47 +02:00
Richard McCormack 187dd627e0 Add pop, truncate, and remove functions to ArrayString. Addresses #66 2017-10-26 12:57:14 -04:00
Niklas Fiekas 5257cbd2b4 Add ArrayVec::truncate() 2017-10-18 18:14:07 +02:00
bluss ace20a9f43 DOC: Add docs for default values 2017-10-16 22:45:27 +02:00
bluss ac64b5b661 BUG: Fix "unused unsafe block" warning
This warning was only visible on stable, not nightly, which seems like
a bug.
2017-10-08 18:15:05 +02:00
bluss 793ad30be9 FEAT: Improve .extend() performance
We have to use the "SetLenOnDrop" pattern (see stdlib Vec) here.

Keep the length in a separate variable, write it back on scope exit. To
help the compiler with alias analysis and stuff.  We update the length
to handle panic in the iteration of the user's iterator, without
dropping any elements on the floor.

Note: This code was tested without the scope guard using the new option
-Zmutable-noalias, which had no effect here.

benchmark:

```
 name                  before.txt ns/iter  after.txt ns/iter  diff ns/iter   diff %
 extend_with_constant  280 (1828 MB/s)     74 (6918 MB/s)             -206  -73.57%
 extend_with_range     1,285 (398 MB/s)    979 (522 MB/s)             -306  -23.81%
 extend_with_slice     29 (17655 MB/s)     14 (36571 MB/s)             -15  -51.72%
```
2017-10-08 17:44:06 +02:00