Skip to content

Add cleaner API with fte.Encoder class#36

Merged
kpdyer merged 4 commits into
masterfrom
api-improvements
Jan 10, 2026
Merged

Add cleaner API with fte.Encoder class#36
kpdyer merged 4 commits into
masterfrom
api-improvements

Conversation

@kpdyer

@kpdyer kpdyer commented Jan 10, 2026

Copy link
Copy Markdown
Owner

New API:

  • fte.Encoder(regex, fixed_slice, key) - main class
  • fte.encode() / fte.decode() - convenience functions
  • regex2dfa is now called internally, users don't need to import it

Before:
import regex2dfa import fte.encoder dfa = regex2dfa.regex2dfa('^[a-z]+$') encoder = fte.encoder.DfaEncoder(dfa, 128)

After:
import fte encoder = fte.Encoder(regex='^[a-z]+$', fixed_slice=128)

Or even simpler:
ciphertext = fte.encode(b'secret', regex='^[a-z]+$')

Updated all examples and documentation to use new API. Added example 12 for convenience functions.

Kevin P. Dyer added 4 commits January 10, 2026 14:29
New API:
- fte.Encoder(regex, fixed_slice, key) - main class
- fte.encode() / fte.decode() - convenience functions
- regex2dfa is now called internally, users don't need to import it

Before:
  import regex2dfa
  import fte.encoder
  dfa = regex2dfa.regex2dfa('^[a-z]+$')
  encoder = fte.encoder.DfaEncoder(dfa, 128)

After:
  import fte
  encoder = fte.Encoder(regex='^[a-z]+$', fixed_slice=128)

Or even simpler:
  ciphertext = fte.encode(b'secret', regex='^[a-z]+$')

Updated all examples and documentation to use new API.
Added example 12 for convenience functions.
Performance improvements:
- Use std::unordered_set for final_states (O(1) vs O(n) lookup)
- Use std::unordered_map for sigma/sigma_reverse (O(1) vs O(log n))
- Use [] instead of .at() in hot paths after validation
- Add string reserve() in unrank to avoid reallocations
- Parse DFA string in single pass instead of twice

Code quality:
- Add const to methods that don't modify state
- Use references for large parameters
- Fix exception handling (was catching wrong type)
- Use std::runtime_error instead of custom exception classes
- Use modern C++ style (auto, range-for, emplace_back)
- Fix typos in comments
- Use <cstdint> instead of <stdint.h>
- C++11 compatible (no structured bindings)
- Main example now uses word-like output with spaces
- More Examples section shows URL paths, slugs, and alphanumeric tokens
- All examples are tested and work correctly
- Updated both README.md and README_PYPI.md
@kpdyer kpdyer merged commit 85a10c1 into master Jan 10, 2026
16 checks passed
@kpdyer kpdyer deleted the api-improvements branch January 10, 2026 22:42
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.

1 participant