rust/library/std/src
bors 75716b4510 Auto merge of #118159 - EliasHolzmann:formatting_options, r=m-ou-se
Implementation of `fmt::FormattingOptions`

Tracking issue: #118117

Public API:
```rust
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct FormattingOptions { … }
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Sign {
    Plus,
    Minus
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum DebugAsHex {
    Lower,
    Upper
}

impl FormattingOptions {
    pub fn new() -> Self;
    pub fn sign(&mut self, sign: Option<Sign>) -> &mut Self;
    pub fn sign_aware_zero_pad(&mut self, sign_aware_zero_pad: bool) -> &mut Self;
    pub fn alternate(&mut self, alternate: bool) -> &mut Self;
    pub fn fill(&mut self, fill: char) -> &mut Self;
    pub fn align(&mut self, alignment: Option<Alignment>) -> &mut Self;
    pub fn width(&mut self, width: Option<usize>) -> &mut Self;
    pub fn precision(&mut self, precision: Option<usize>) -> &mut Self;
    pub fn debug_as_hex(&mut self, debug_as_hex: Option<DebugAsHex>) -> &mut Self;

    pub fn get_sign(&self) -> Option<Sign>;
    pub fn get_sign_aware_zero_pad(&self) -> bool;
    pub fn get_alternate(&self) -> bool;
    pub fn get_fill(&self) -> char;
    pub fn get_align(&self) -> Option<Alignment>;
    pub fn get_width(&self) -> Option<usize>;
    pub fn get_precision(&self) -> Option<usize>;
    pub fn get_debug_as_hex(&self) -> Option<DebugAsHex>;

    pub fn create_formatter<'a>(self, write: &'a mut (dyn Write + 'a)) -> Formatter<'a>;
    }

impl<'a> Formatter<'a> {
    pub fn new(write: &'a mut (dyn Write + 'a), options: FormattingOptions) -> Self;
    pub fn with_options<'b>(&'b mut self, options: FormattingOptions) -> Formatter<'b>;
    pub fn sign(&self) -> Option<Sign>;

    pub fn options(&self) -> FormattingOptions;
}
```

Relevant changes from the public API in the tracking issue (I'm leaving out some stuff I consider obvious mistakes, like missing `#[derive(..)]`s and `pub` specifiers):

- `enum DebugAsHex`/`FormattingOptions::debug_as_hex`/`FormattingOptions::get_debug_as_hex`: To support `{:x?}` as well as `{:X?}`. I had completely missed these options in the ACP. I'm open for any and all bikeshedding, not married to the name.
- `fill`/`get_fill` now takes/returns `char` instead of `Option<char>`. This simply mirrors what `Formatter::fill` returns (with default being `' '`).
- Changed `zero_pad`/`get_zero_pad` to `sign_aware_zero_pad`/`get_sign_aware_zero_pad`. This also mirrors `Formatter::sign_aware_zero_pad`. While I'm not a fan of this quite verbose name, I do believe that having the interface of `Formatter` and `FormattingOptions` be compatible is more important.
- For the same reason, renamed `alignment`/`get_alignment` to `aling`/`get_align`.
- Deviating from my initial idea, `Formatter::with_options` returns a `Formatter` which has the lifetime of the `self` reference as its generic lifetime parameter (in the original API spec, the generic lifetime of the returned `Formatter` was the generic lifetime used by `self` instead). Otherwise, one could construct two `Formatter`s that both mutably borrow the same underlying buffer, which would be unsound. This solution still has performance benefits over simply using `Formatter::new`, so I believe it is worthwhile to keep this method.
2024-12-06 22:28:42 +00:00
..
backtrace remove redundant imports 2023-12-10 10:56:22 +08:00
collections ./x miri: fix sysroot build 2024-12-03 07:52:01 +01:00
env Fix std tests for wasm32-wasip2 target 2024-09-29 04:48:13 +02:00
error Reformat use declarations. 2024-07-29 08:26:52 +10:00
f16 std float tests: special-case Miri in feature detection 2024-08-08 12:17:50 +02:00
f32 these tests seem to work fine on i586 these days 2024-09-10 15:57:40 -07:00
f64 these tests seem to work fine on i586 these days 2024-09-10 15:57:40 -07:00
f128 Separate f128 % operation to deal with missing fmodl symbol 2024-11-07 11:33:10 +01:00
ffi replace placeholder version 2024-11-27 12:10:21 +00:00
fs Fix compilation error on Solaris due to flock usage 2024-11-13 06:53:19 -08:00
hash remove const_hash feature leftovers 2024-11-02 11:27:14 +01:00
io add isatty alias for is_terminal 2024-12-01 13:54:04 -06:00
net std: update internal uses of io::const_error! 2024-11-26 18:38:24 +01:00
num removed nonfunctioning benchmark 2024-01-11 11:30:12 -05:00
os Rollup merge of #133515 - SteveLauC:fix/hurd, r=ChrisDenton 2024-12-01 08:15:22 +01:00
panic
path Make CloneToUninit dyn-compatible 2024-11-12 15:08:41 -06:00
pipe Cleanup sys module to match house style 2024-07-30 19:22:54 +00:00
prelude Add AsyncFn* to to the prelude in all editions 2024-11-04 17:50:29 +00:00
process [musl] use posix_spawn if a directory change was requested 2024-10-23 22:11:55 -07:00
sync Rollup merge of #133435 - RalfJung:test_downgrade_observe, r=tgross35 2024-11-26 12:03:45 -05:00
sys Rollup merge of #133882 - jyn514:doc-backtraces, r=saethlin 2024-12-05 05:50:53 -05:00
sys_common std: update internal uses of io::const_error! 2024-11-26 18:38:24 +01:00
thread Rollup merge of #132937 - xmh0511:master, r=m-ou-se 2024-12-03 21:55:26 +01:00
time Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
alloc.rs Reformat use declarations. 2024-07-29 08:26:52 +10:00
ascii.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
backtrace.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
env.rs Rollup merge of #132515 - kornelski:home_fix, r=jhpratt 2024-11-30 12:57:33 +08:00
error.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
f16.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
f32.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
f64.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
f128.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
fs.rs std: update internal uses of io::const_error! 2024-11-26 18:38:24 +01:00
keyword_docs.rs Document alternatives to static mut 2024-11-18 00:34:06 +00:00
lib.miri.rs add 'x.py miri', and make it work for 'library/{core,alloc,std}' 2024-04-03 20:27:20 +02:00
lib.rs Added struct fmt::FormattingOptions 2024-12-05 21:48:01 +01:00
macros.rs Add math functions for f16 and f128 2024-08-01 15:38:51 -04:00
num.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
panic.rs Auto merge of #128321 - BatmanAoD:catch-unwind-doc-update, r=Mark-Simulacrum 2024-09-29 05:54:47 +00:00
panicking.rs Added struct fmt::FormattingOptions 2024-12-05 21:48:01 +01:00
pat.rs Add pattern types to parser 2024-04-08 11:57:17 +00:00
path.rs Rollup merge of #133602 - SanchithHegde:fix-pathbuf-example-codeblocks, r=cuviper 2024-12-01 08:15:23 +01:00
pipe.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
process.rs library: consistently use American spelling for 'behavior' 2024-10-25 12:02:47 +02:00
random.rs AIX use /dev/urandom for impl 2024-10-22 20:18:11 -04:00
rt.rs Remove the Arc rt::init allocation for thread info 2024-10-19 14:39:20 +01:00
time.rs library: consistently use American spelling for 'behavior' 2024-10-25 12:02:47 +02:00