Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

jwiesler
Copy link
Contributor

@jwiesler jwiesler commented Mar 5, 2025

This minimal change reduces the size of Style from 32 bytes to 10 and removes allocations needed to construct a style. This also means the remainder of the API could become const. If you want me to do that please ping me and I will do it in this mr.

The semantics of a bitset differ from the btreemap in so far as the btreemap is in insertion order, but I think this does not matter for attribute codes being printed, however, please verify this. Maybe this can be fixed by reordering the enum members.

The EnumSetType derive automatically derives Copy, Clone, PartialEq and Eq which is why I had to remove them.

For the library used see enumset.

@djc
Copy link
Member

djc commented Mar 6, 2025

This minimal change reduces the size of Style from 32 bytes to 10 and removes allocations needed to construct a style. This also means the remainder of the API could become const.

Which part of this matters to you (most), what is your use case/motivation for this PR?

IMO enumset is pretty large dependency for something low-level like console. In particular it pulls in all the proc-macro machinery which I would prefer to avoid.

Maybe a more minimal "manual" implementation of the same principles could make sense.

@jwiesler
Copy link
Contributor Author

jwiesler commented Mar 6, 2025

In short: Const API and no allocations/performance improvements.
Longer: I've been looking for a library that does this styling in an optimal way without first rendering the input to a string or something like this, which console does nicely by transparently implementing Debug and Display. However, e.g. a bold Style can't be stored in a constant, since it requires attr which is not const and this really doesn't have to be the case. Also storing this in a tree set on the heap seems overkill for this.

I could do a manual implementation with an u16 as storage (maybe 30-60 LOC), but that would make it harder for you to review :) Please tell me before I invest the time if you'd be willing to even merge this afterwards or under which constraints (e.g. no unsafe, ...).

@djc
Copy link
Member

djc commented Mar 6, 2025

Happy to review 30-60 LoC of manual implementation, if it doesn't contain unsafe and doesn't bring in new dependencies.

(Maybe also look at the anstyle family of crates, including anstyle-stream.)

@jwiesler
Copy link
Contributor Author

jwiesler commented Mar 6, 2025

I looked at anstyle-stream and implemented it in 60 LOC (barely). There are more changes, I added two tests and made all functions I found const.

Copy link
Member

@djc djc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great, just a few small nits!

}

#[inline]
fn ansi_nums(self) -> impl Iterator<Item = u16> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm inclined to leave this out here and inline it into the one (library) callsite. What do you think?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like it like this more, since bits would be a very opaque term on the calling site. But your call.

@jwiesler
Copy link
Contributor Author

jwiesler commented Mar 6, 2025

Phew: mutable references are not allowed in constant functions. That rust version 1.66 do be pretty old.

@djc
Copy link
Member

djc commented Mar 6, 2025

Phew: mutable references are not allowed in constant functions. That rust version 1.66 do be pretty old.

Can probably just take self like the other methods?

@jwiesler jwiesler force-pushed the main branch 2 times, most recently from 4a9758d to a0c6e46 Compare March 6, 2025 20:41
@jwiesler
Copy link
Contributor Author

jwiesler commented Mar 6, 2025

True, I thought those were the attr() functions.

@djc djc merged commit bc32acc into console-rs:main Mar 8, 2025
15 checks passed
@djc
Copy link
Member

djc commented Mar 8, 2025

This looks pretty good, I'll probably make some small tweaks.

@djc djc mentioned this pull request Mar 8, 2025
kodiakhq bot pushed a commit to pdylanross/fatigue that referenced this pull request Sep 9, 2025
Bumps console from 0.15.11 to 0.16.1.

Release notes
Sourced from console's releases.

0.16.1
What's Changed

Add WithoutAnsi struct that implements Display by @​ChocolateLoverRaj in console-rs/console#258
Tweak style for new WithAnsi code by @​djc in console-rs/console#266
Fix QNX 7.1 patch for libc::cfmakeraw by @​rafaeling in console-rs/console#267
Upgrade windows-sys to 0.61 by @​djc in console-rs/console#272

0.16.0
What's Changed
The 0.15.12 release was yanked after it turned out to be semver-incompatible with existing usage by several of the most popular dependent crates, because it introduced a std feature -- and those crates used default-features = false but relied on the std-guarded features.
The 0.16.0 API should be semver-compatible with the 0.15.x API except for the need for the std feature.

Prepare 0.16.0 by @​djc in console-rs/console#265

Refer to the 0.15.12 release notes for more information.
0.15.12
What's Changed

Use EnumSet instead of a full-blown btreemap for the attributes by @​jwiesler in console-rs/console#244
Tweak Attributes bit set API by @​djc in console-rs/console#245
Implement measure_text_width with no allocation by @​remi-dupre in console-rs/console#246
fix(utils): surprising behavior in truncate_str when tail is larger than width by @​remi-dupre in console-rs/console#250
fix spelling mistake by @​Axlefublr in console-rs/console#253
feat(part): add NO_COLOR env support for windows terminal by @​L-Chao in console-rs/console#254
Update windows-sys requirement from 0.59 to 0.60 by @​dependabot in console-rs/console#259
Add features to work with no_std, and with alloc in no_std by @​ChocolateLoverRaj in console-rs/console#256
Fix CI badge and license URL by @​atouchet in console-rs/console#261
Bump version to 0.15.12 by @​felstead in console-rs/console#262




Commits

f35b2e4 Bump version to 0.16.1
900379f Upgrade windows-sys to 0.61
174b8a4 Bump MSRV to 1.71 (for windows-sys 0.61)
208928e Fix lint warning for elided lifetimes
a51fcea Fix QNX patch for libc::cfmakeraw
90ea08d Tweak style for new WithAnsi code
903df6d Add WithoutAnsi struct that implements Display
bda6a6e Add FUNDING metadata
87ace80 Remove authors from Cargo metadata (per RFC 3052)
6e30bfd Bump version to 0.16.0
Additional commits viewable in compare view




Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

@dependabot rebase will rebase this PR
@dependabot recreate will recreate this PR, overwriting any edits that have been made to it
@dependabot merge will merge this PR after your CI passes on it
@dependabot squash and merge will squash and merge this PR after your CI passes on it
@dependabot cancel merge will cancel a previously requested merge and block automerging
@dependabot reopen will reopen this PR if it is closed
@dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
@dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
@dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants