rust/src
bors 5366cfecf3 auto merge of #17438 : alexcrichton/rust/string-stable, r=aturon
# Rationale

When dealing with strings, many functions deal with either a `char` (unicode
codepoint) or a byte (utf-8 encoding related). There is often an inconsistent
way in which methods are referred to as to whether they contain "byte", "char",
or nothing in their name.  There are also issues open to rename *all* methods to
reflect that they operate on utf8 encodings or bytes (e.g. utf8_len() or
byte_len()).

The current state of String seems to largely be what is desired, so this PR
proposes the following rationale for methods dealing with bytes or characters:

> When constructing a string, the input encoding *must* be mentioned (e.g.
> from_utf8). This makes it clear what exactly the input type is expected to be
> in terms of encoding.
>
> When a method operates on anything related to an *index* within the string
> such as length, capacity, position, etc, the method *implicitly* operates on
> bytes. It is an understood fact that String is a utf-8 encoded string, and
> burdening all methods with "bytes" would be redundant.
>
> When a method operates on the *contents* of a string, such as push() or pop(),
> then "char" is the default type. A String can loosely be thought of as being a
> collection of unicode codepoints, but not all collection-related operations
> make sense because some can be woefully inefficient.

# Method stabilization

The following methods have been marked #[stable]

* The String type itself
* String::new
* String::with_capacity
* String::from_utf16_lossy
* String::into_bytes
* String::as_bytes
* String::len
* String::clear
* String::as_slice

The following methods have been marked #[unstable]

* String::from_utf8 - The error type in the returned `Result` may change to
                      provide a nicer message when it's `unwrap()`'d
* String::from_utf8_lossy - The returned `MaybeOwned` type still needs
                            stabilization
* String::from_utf16 - The return type may change to become a `Result` which
                       includes more contextual information like where the error
                       occurred.
* String::from_chars - This is equivalent to iter().collect(), but currently not
                       as ergonomic.
* String::from_char - This method is the equivalent of Vec::from_elem, and has
                      been marked #[unstable] becuase it can be seen as a
                      duplicate of iterator-based functionality as well as
                      possibly being renamed.
* String::push_str - This *can* be emulated with .extend(foo.chars()), but is
                     less efficient because of decoding/encoding. Due to the
                     desire to minimize API surface this may be able to be
                     removed in the future for something possibly generic with
                     no loss in performance.
* String::grow - This is a duplicate of iterator-based functionality, which may
                 become more ergonomic in the future.
* String::capacity - This function was just added.
* String::push - This function was just added.
* String::pop - This function was just added.
* String::truncate - The failure conventions around String methods and byte
                     indices isn't totally clear at this time, so the failure
                     semantics and return value of this method are subject to
                     change.
* String::as_mut_vec - the naming of this method may change.
* string::raw::* - these functions are all waiting on [an RFC][2]

[2]: rust-lang/rfcs#240

The following method have been marked #[experimental]

* String::from_str - This function only exists as it's more efficient than
                     to_string(), but having a less ergonomic function for
                     performance reasons isn't the greatest reason to keep it
                     around. Like Vec::push_all, this has been marked
                     experimental for now.

The following methods have been #[deprecated]

* String::append - This method has been deprecated to remain consistent with the
                   deprecation of Vec::append. While convenient, it is one of
                   the only functional-style apis on String, and requires more
                   though as to whether it belongs as a first-class method or
                   now (and how it relates to other collections).
* String::from_byte - This is fairly rare functionality and can be emulated with
                      str::from_utf8 plus an assert plus a call to to_string().
                      Additionally, String::from_char could possibly be used.
* String::byte_capacity - Renamed to String::capacity due to the rationale
                          above.
* String::push_char - Renamed to String::push due to the rationale above.
* String::pop_char - Renamed to String::pop due to the rationale above.
* String::push_bytes - There are a number of `unsafe` functions on the `String`
                       type which allow bypassing utf-8 checks. These have all
                       been deprecated in favor of calling `.as_mut_vec()` and
                       then operating directly on the vector returned. These
                       methods were deprecated because naming them with relation
                       to other methods was difficult to rationalize and it's
                       arguably more composable to call .as_mut_vec().
* String::as_mut_bytes - See push_bytes
* String::push_byte - See push_bytes
* String::pop_byte - See push_bytes
* String::shift_byte - See push_bytes

# Reservation methods

This commit does not yet touch the methods for reserving bytes. The methods on
Vec have also not yet been modified. These methods are discussed in the upcoming
[Collections reform RFC][1]

[1]: https://github.com/aturon/rfcs/blob/collections-conventions/active/0000-collections-conventions.md#implicit-growth
2014-09-24 14:00:57 +00:00
..
compiler-rt@62a4ca6055 Update compiler-rt to work for non-v7 arm. 2014-06-18 17:02:08 -07:00
compiletest Deal with the fallout of string stabilization 2014-09-23 18:31:52 -07:00
doc auto merge of #17402 : steveklabnik/rust/update_manual, r=brson 2014-09-23 22:05:38 +00:00
driver Updated to new extern crate syntax. 2014-09-01 09:02:00 -07:00
etc Add cargo.vim compiler file. 2014-09-22 17:24:26 -05:00
grammar Fix fallout in tests from removing the use of Gc in ExpnInfo. 2014-09-18 14:36:18 +03:00
gyp@1e46da1000
jemalloc@2dba541881 jemalloc: Un-revert accidentally reverted jemalloc 2014-09-18 13:40:15 -07:00
liballoc Update calls of deprecated functions in macros. 2014-09-22 19:30:06 +02:00
libarena Fallout from renaming 2014-09-16 14:37:48 -07:00
libbacktrace
libcollections auto merge of #17438 : alexcrichton/rust/string-stable, r=aturon 2014-09-24 14:00:57 +00:00
libcore auto merge of #17446 : steveklabnik/rust/gh17445, r=alexcrichton 2014-09-23 09:00:40 +00:00
libcoretest Update calls of deprecated functions in macros. 2014-09-22 19:30:06 +02:00
libdebug librustc: Forbid private types in public APIs. 2014-09-22 20:05:45 -07:00
libflate Update doc URLs for version bump 2014-07-11 11:21:57 -07:00
libfmt_macros Add enum variants to the type namespace 2014-09-19 15:11:00 +12:00
libfourcc fourcc: fix fallout from using ptr::P. 2014-09-14 04:20:35 +03:00
libgetopts auto merge of #17438 : alexcrichton/rust/string-stable, r=aturon 2014-09-24 14:00:57 +00:00
libglob Fix deprecation warnings in check-docs. 2014-09-22 19:31:31 +02:00
libgraphviz Deal with the fallout of string stabilization 2014-09-23 18:31:52 -07:00
libgreen librustc: Forbid private types in public APIs. 2014-09-22 20:05:45 -07:00
libhexfloat hexfloat: fix fallout from using ptr::P. 2014-09-14 04:20:35 +03:00
liblibc readdir: return error instead of failing on invalid UTF-16 2014-09-06 12:51:42 -04:00
liblog Fix the inverted RUST_LOG filter 2014-09-17 13:26:26 -07:00
libnative librustc: Forbid private types in public APIs. 2014-09-22 20:05:45 -07:00
libnum Fix regression and overflow bug for rationals. 2014-09-23 20:28:23 -04:00
librand Fallout from renaming 2014-09-16 14:37:48 -07:00
librbml Fix fallout from Vec stabilization 2014-09-21 22:15:51 -07:00
libregex auto merge of #17438 : alexcrichton/rust/string-stable, r=aturon 2014-09-24 14:00:57 +00:00
libregex_macros Fix fallout from Vec stabilization 2014-09-21 22:15:51 -07:00
librlibc Take core as a dependency on librlibc. This is needed so that it can 2014-09-15 14:58:49 -04:00
librustc auto merge of #17471 : vadimcn/rust/link-libgcc, r=alexcrichton 2014-09-24 11:25:48 +00:00
librustc_back Implement slicing syntax. 2014-09-19 11:15:49 +12:00
librustc_llvm librustc: Forbid private types in public APIs. 2014-09-22 20:05:45 -07:00
librustdoc Deal with the fallout of string stabilization 2014-09-23 18:31:52 -07:00
librustrt auto merge of #17471 : vadimcn/rust/link-libgcc, r=alexcrichton 2014-09-24 11:25:48 +00:00
librustuv librustc: Forbid private types in public APIs. 2014-09-22 20:05:45 -07:00
libsemver Allow deprecation in deprecated libraries 2014-08-12 13:35:56 -07:00
libserialize Deal with the fallout of string stabilization 2014-09-23 18:31:52 -07:00
libstd Deal with the fallout of string stabilization 2014-09-23 18:31:52 -07:00
libsync Fallout from renaming 2014-09-16 14:37:48 -07:00
libsyntax auto merge of #17402 : steveklabnik/rust/update_manual, r=brson 2014-09-23 22:05:38 +00:00
libterm Fix fallout from Vec stabilization 2014-09-21 22:15:51 -07:00
libtest Update calls of deprecated functions in macros. 2014-09-22 19:30:06 +02:00
libtime Fallout from renaming 2014-09-16 14:37:48 -07:00
libunicode Fix spelling errors and capitalization. 2014-09-03 23:10:38 -04:00
liburl Rebasing changes 2014-08-26 16:07:32 +12:00
libuuid Remove some test warnings. 2014-09-09 11:32:58 +02:00
libuv@dec0561d19 native, rustuv: Fix spawning with empty args 2014-08-05 19:54:54 -07:00
llvm@e9d0374194 Update LLVM to fix a crash in the MergeFunc pass 2014-09-08 17:07:03 +02:00
rt readdir: return error instead of failing on invalid UTF-16 2014-09-06 12:51:42 -04:00
rustllvm Add -C remark for LLVM optimization remarks 2014-09-12 11:46:38 -07:00
test auto merge of #17413 : jakub-/rust/issue-17385, r=pcwalton 2014-09-23 17:05:39 +00:00
README.md
snapshots.txt Register new snapshots 2014-09-16 18:16:38 -07:00

This is a preliminary version of the Rust compiler, libraries and tools.

Source layout:

Path Description
librustc/ The self-hosted compiler
liballoc/ Rust's core allocation library
libcore/ The Rust core library
libdebug/ Debugging utilities
libstd/ The standard library (imported and linked by default)
libgreen/ The M:N runtime library
libnative/ The 1:1 runtime library
libsyntax/ The Rust parser and pretty-printer
libtest/ Rust's test-runner code
------------------- ---------------------------------------------------------
libarena/ The arena (a fast but limited) memory allocator
libbacktrace/ The libbacktrace library
libcollections/ A collection of useful data structures and containers
libflate/ Simple compression library
libfmt_macros/ Macro support for format strings
libfourcc/ Data format identifier library
libgetopts/ Get command-line-options library
libglob/ Unix glob patterns library
libgraphviz/ Generating files for Graphviz
libhexfloat/ Hexadecimal floating-point literals
liblibc/ Bindings for the C standard library
liblog/ Utilities for program-wide and customizable logging
libnum/ Extended number support library (complex, rational, etc)
librand/ Random numbers and distributions
libregex/ Regular expressions
libregex_macros/ The regex! syntax extension
libsemver/ Rust's semantic versioning library
libserialize/ Encode-Decode types library
libsync/ Concurrency mechanisms and primitives
libterm/ ANSI color library for terminals
libtime/ Time operations library
liburl/ URL handling lirary
libuuid/ UUID's handling code
------------------- ---------------------------------------------------------
rt/ The runtime system
rt/rust_*.c - Some of the runtime services
rt/vg - Valgrind headers
rt/msvc - MSVC support
rt/sundown - The Markdown library used by rustdoc
------------------- ---------------------------------------------------------
compiletest/ The test runner
test/ Testsuite
test/codegen - Tests for the LLVM IR infrastructure
test/compile-fail - Tests that should fail to compile
test/debug-info - Tests for the debuginfo tool
test/run-fail - Tests that should compile, run and fail
test/run-make - Tests that depend on a Makefile infrastructure
test/run-pass - Tests that should compile, run and succeed
test/bench - Benchmarks and miscellaneous
test/pretty - Pretty-printer tests
test/auxiliary - Dependencies of tests
------------------- ---------------------------------------------------------
librustdoc/ The Rust API documentation tool
libuv/ The libuv submodule
librustuv/ Rust libuv support code
------------------- ---------------------------------------------------------
llvm/ The LLVM submodule
rustllvm/ LLVM support code
------------------- ---------------------------------------------------------
etc/ Scripts, editors support, misc

NOTE: This list (especially the second part of the table which contains modules and libraries) is highly volatile and subject to change.