- Replace nested endianness branching with lookup table approach
- Use union for safe float/double type punning
- Eliminate byte-by-byte loops in favor of direct indexing
- Consistent optimization patterns aligned with integer formats
- Achieve significant performance improvements: ~440K float ops/sec,
~249K double ops/sec
Co-authored-by: Claude <noreply@anthropic.com>
- Eliminate branching in endianness handling using lookup tables
- Replace 8-iteration loop in unpack_quad with direct bit operations
- Fix endianness mapping for correct big/little-endian byte order
- Maintain consistent optimization patterns across all integer sizes
- Achieve significant performance improvements while preserving compatibility
Co-authored-by: Claude <noreply@anthropic.com>
optimize integer packing and unpacking algorithms:
- replace division/modulo with bit shifts in pack_short
- replace multiplication with bit shifts in unpack functions
- eliminate 8-iteration loop in unpack_quad with direct bit operations
- improve variable declarations following mruby patterns
- maintain full backward compatibility
performance improvements:
- short format packing: +21% (49k -> 59k ops/sec)
- long format packing: +43% (37k -> 53k ops/sec)
- consistent bit manipulation patterns across all integer sizes
- reduced branching and CPU-intensive operations
Co-authored-by: Claude <noreply@anthropic.com>
- calculate maximum safe bytes upfront to reduce checking frequency
- only check overflow when approaching byte limits or value limits
- maintain same overflow detection accuracy with better performance
- reduces per-iteration overhead for common BER decoding cases
Co-authored-by: Claude <noreply@anthropic.com>
- add fast path for 1-byte values (0-127): direct encoding
- add fast path for 2-byte values (128-16383): simple bit operations
- fallback to original algorithm for larger values (16384+)
- eliminates expensive bit mask calculation loop for ~95% of typical usage
- maintains full backward compatibility and correctness
Co-authored-by: Claude <noreply@anthropic.com>
- move variable declarations to initialization points in pack_BER
- move variable declarations to initialization points in unpack_BER
- improve code readability with better variable scoping
- maintain exact same algorithm and performance
Co-authored-by: Claude <noreply@anthropic.com>
- add 'w' directive to supported template table
- provide BER encoding/decoding usage example
- describe as variable length encoding (no endianness concept)
Co-authored-by: Claude <noreply@anthropic.com>
- move variable declarations to initialization points for cleaner code
- improve code readability with better variable scoping
- maintain exact same algorithm and performance characteristics
Co-authored-by: Claude <noreply@anthropic.com>
- add fast path for no line wrapping (count=0) to avoid column tracking
- use precise buffer size calculation to prevent reallocations
- move variable declarations to initialization points for cleaner code
- maintain full backward compatibility
Co-authored-by: Claude <noreply@anthropic.com>
Added complete call-seq documentation for all 3 public methods in the
pack gem, improving documentation coverage from 0% to 100%.
Documentation added:
- Array#pack: Pack array elements into binary string using template
- String#unpack: Unpack binary string into array using template
- String#unpack1: Unpack first value from binary string using template
Each method now includes:
- Clear method signatures with parameter and return types
- Comprehensive template directive reference table covering all supported formats
- Detailed descriptions of binary data packing/unpacking behavior
- Practical examples showing common usage patterns for different data types
- Notes about endianness, data type sizes, and string handling
- Cross-references between related methods
Template directives documented include:
- Integer types: C, c, S, s, L, l, Q, q (various sizes and signedness)
- Network/endian specific: n, N, v, V (network and little endian)
- Floating point: f, d (single and double precision)
- String types: A, a, Z (ASCII with different padding)
- Hex and binary: H, h (hex strings with nibble order)
- Special: x, X, @ (null bytes, positioning)
Co-authored-by: Atlassian Rovo Dev
Previously `\x80` was incorrectly mapped to `0`.
```ruby
"\x80\x80\x80\x80".unpack("m*")
# before => "\x00\x00\x00"
# after => ""
```
The reason is that the C string terminator is placed in `base64_dec_tab[128]` and the array length is obtained by `sizeof`.
Therefore, the length of `base64_dec_tab[]` is strictly specified and replaced with element-by-element initialization.
Also, similar changes are made to `base64chars[]`.