%% %% This is file `l3bitset.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% l3bitset.dtx (with options: `package') %% %% Copyright (C) 2020 The LaTeX3 Project %% %% It may be distributed and/or modified under the conditions of %% the LaTeX Project Public License (LPPL), either version 1.3c of %% this license or (at your option) any later version. The latest %% version of this license is in the file: %% %% http://www.latex-project.org/lppl.txt %% %% This file is part of the "l3experimental bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% %% File: l3bitset.dtx \ProvidesExplPackage{l3bitset}{2021-08-27}{} {L3 Experimental bitset support} \cs_new_protected:Npn \bitset_new:N #1 { \__kernel_chk_if_free_cs:N #1 \cs_gset_eq:NN #1 \c_zero_str \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop } } \cs_new_protected:Npn \bitset_new:Nn #1 #2 { \__kernel_chk_if_free_cs:N #1 \cs_gset_eq:NN #1 \c_zero_str \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop } \prop_gset_from_keyval:cn { g__bitset_ \cs_to_str:N #1 _name_prop } {#2} } \cs_generate_variant:Nn \bitset_new:N { c } \prop_new:N \l__bitset_tmpa_prop \cs_new_protected:Npn \bitset_addto_named_index:Nn #1#2 { \prop_set_from_keyval:Nn \l__bitset_tmpa_prop {#2} \prop_map_inline:Nn \l__bitset_tmpa_prop { \prop_gput:cnn { g__bitset_ \cs_to_str:N #1 _name_prop } {##1} {##2} } } \prg_new_eq_conditional:NNn \bitset_if_exist:N \str_if_exist:N { p , T , F , TF } \prg_new_eq_conditional:NNn \bitset_if_exist:c \str_if_exist:c { p , T , F , TF } \cs_new_protected:Npn \__bitset_set_true:Nn #1#2 { \__bitset_set:NNnN \str_set:Nx #1 {#2} 1 } \cs_new_protected:Npn \__bitset_gset_true:Nn #1#2 { \__bitset_set:NNnN \str_gset:Nx #1 {#2} 1 } \cs_new_protected:Npn \__bitset_set_false:Nn #1#2 { \__bitset_set:NNnN \str_set:Nx #1 {#2} 0 } \cs_new_protected:Npn \__bitset_gset_false:Nn #1#2 { \__bitset_set:NNnN \str_gset:Nx #1 {#2} 0 } \cs_new_protected:Npn \__bitset_set:NNnN #1#2#3#4 { \int_compare:nNnT {#3} > { 0 } { \int_compare:nNnTF { \str_count:N #2 } < {#3} { #1 #2 { #4 \prg_replicate:nn { #3 - \str_count:N #2 - 1 } { 0 } #2 } } { #1 #2 { \str_range:Nnn #2 { 1 } { -1 - (#3) } #4 \str_range:Nnn #2 { 1 - (#3) } { -1 } } } } } \int_new:N \l__bitset_internal_int \prg_new_protected_conditional:Npnn \__bitset_test_digits:n #1 { TF } { \tex_afterassignment:D \__bitset_test_digits:w \l__bitset_internal_int = 0 \tl_trim_spaces_apply:nN {#1} \tl_to_str:n \__bitset_test_digits_end: \use_i:nnn \if_false: \__bitset_test_digits_end: \if_int_compare:w \c_zero_int < \l__bitset_internal_int \prg_return_true: \else: \prg_return_false: \fi: } \cs_new_eq:NN \__bitset_test_digits_end: \exp_stop_f: \cs_new_protected:Npn \__bitset_test_digits:w #1 \__bitset_test_digits_end: { } \cs_new_protected:Npn \bitset_set_true:Nn #1#2 { \__bitset_set:NNn \__bitset_set_true:Nn #1 {#2} } \cs_new_protected:Npn \bitset_gset_true:Nn #1#2 { \__bitset_set:NNn \__bitset_gset_true:Nn #1 {#2} } \cs_new_protected:Npn \bitset_set_false:Nn #1#2 { \__bitset_set:NNn \__bitset_set_false:Nn #1 {#2} } \cs_new_protected:Npn \bitset_gset_false:Nn #1#2 { \__bitset_set:NNn \__bitset_gset_false:Nn #1 {#2} } \cs_new_protected:Npn \__bitset_set:NNn #1#2#3 { \prop_if_in:cnTF { g__bitset_ \cs_to_str:N #2 _name_prop } {#3} { #1 #2 { \prop_item:cn { g__bitset_ \cs_to_str:N #2 _name_prop } {#3} } } { \__bitset_test_digits:nTF {#3} { #1 #2 {#3} \prop_gput:cnn { g__bitset_ \cs_to_str:N #2 _name_prop } {#3} {#3} } { \msg_warning:nnxx { bitset } { unknown-name } { \token_to_str:N #2 } { \tl_to_str:n {#3} } } } } \cs_generate_variant:Nn \bitset_set_true:Nn { c } \cs_generate_variant:Nn \bitset_gset_true:Nn { c } \cs_generate_variant:Nn \bitset_set_false:Nn { c } \cs_generate_variant:Nn \bitset_gset_false:Nn { c } \cs_new_protected:Npn \bitset_clear:N #1 { \str_set_eq:NN #1 \c_zero_str } \cs_new_protected:Npn \bitset_gclear:N #1 { \str_gset_eq:NN #1 \c_zero_str } \cs_generate_variant:Nn \bitset_clear:N { c } \cs_generate_variant:Nn \bitset_gclear:N { c } \cs_new:Npn \bitset_to_arabic:N #1 { \int_compare:nNnTF { \str_count:N #1 } < { 32 } { \exp_args:No \int_from_bin:n {#1} } { \exp_after:wN \__bitset_to_int:nN \exp_after:wN 0 #1 \q_recursion_tail \q_recursion_stop } } \cs_new:Npn \__bitset_to_int:nN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 {#1} \exp_args:Nf \__bitset_to_int:nN { \fp_eval:n { #1 * 2 + #2 } } } \cs_new:Npn \bitset_to_bin:N #1 { #1 } \cs_generate_variant:Nn \bitset_to_arabic:N { c } \cs_generate_variant:Nn \bitset_to_bin:N { c } \cs_new:Npn \bitset_item:Nn #1#2 { \prop_if_in:cnTF { g__bitset_ \cs_to_str:N #1 _name_prop } {#2} { \int_eval:n { \str_item:Nn #1 { 0 - ( \prop_item:cn { g__bitset_ \cs_to_str:N #1 _name_prop } {#2} ) } +0 } } { 0 } } \cs_generate_variant:Nn \bitset_item:Nn { c } \cs_new_protected:Npn \bitset_show:N { \__bitset_show:NN \msg_show:nnxxxx } \cs_generate_variant:Nn \bitset_show:N { c } \cs_new_protected:Npn \bitset_log:N { \__bitset_show:NN \msg_log:nnxxxx } \cs_generate_variant:Nn \bitset_log:N { c } \cs_new_protected:Npn \bitset_show_named_index:N { \__bitset_show_named_index:NN \msg_show:nnxxxx } \cs_generate_variant:Nn \bitset_show_named_index:N { c } \cs_new_protected:Npn \__bitset_show:NN #1#2 { \__kernel_chk_defined:NT #2 { #1 { bitset } { show } { \token_to_str:N #2 } { \bitset_to_bin:N #2 } { \bitset_to_arabic:N #2 } { } } } \cs_new_protected:Npn \__bitset_show_named_index:NN #1#2 { \__kernel_chk_defined:NT #2 { #1 { bitset } { show-names } { \token_to_str:N #2 } { \prop_map_function:cN { g__bitset_ \cs_to_str:N #2 _name_prop } \msg_show_item:nn } { } { } } } \msg_new:nnn { bitset } { show } { The~bitset~#1~has~the~representation: \\ >~binary:~#2 \\ >~arabic:~#3 . } \msg_new:nnn { bitset } { show-names } { The~bitset~#1~ \tl_if_empty:nTF {#2} { knows~no~names~yet \\>~ . } { knows~the~name/index~pairs~(without~outer~braces): #2 . } } \msg_new:nnn { bitset } { unknown-name } { The~name~'#2'~is~unknown~for~bitset~\tl_to_str:n {#1} } \prop_gput:Nnn \g_msg_module_name_prop { bitset } { LaTeX3 } \prop_gput:Nnn \g_msg_module_type_prop { bitset } { } %% %% %% End of file `l3bitset.sty'.