Skip to content

Commit

Permalink
lower/upper and searchvalues support for alphabet
Browse files Browse the repository at this point in the history
  • Loading branch information
Peter-Juhasz committed Dec 26, 2024
1 parent 30202dc commit 5bab356
Showing 1 changed file with 39 additions and 2 deletions.
41 changes: 39 additions & 2 deletions src/Science.Cryptography.Ciphers/Alphabet.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Buffers;
using System.Collections;
using System.Collections.Frozen;
using System.Collections.Generic;
Expand Down Expand Up @@ -26,16 +27,42 @@ public Alphabet(ReadOnlySpan<char> characters)
}
_indexLookupUpper = lookupUpper.ToFrozenDictionary();

_chars = characters.ToArray();
_str = new string(characters);
// lower
Span<char> lower = stackalloc char[characters.Length];
characters.ToLowerInvariant(lower);
_lower = new string(lower);
_searchValuesLowercase = SearchValues.Create(lower);

// upper
Span<char> upper = stackalloc char[characters.Length];
characters.ToUpperInvariant(upper);
_upper = new string(upper);
_searchValuesUppercase = SearchValues.Create(upper);

// all lower upper
Span<char> all = stackalloc char[characters.Length * 2];
characters.ToLowerInvariant(all[..characters.Length]);
characters.ToUpperInvariant(all[characters.Length..]);
_searchValuesIgnoreCase = SearchValues.Create(all);

// precalculate modulo values
DoubleLength = characters.Length * 2;
MinusLength = -characters.Length;

// store
_chars = characters.ToArray();
_str = new string(characters);
}

private readonly char[] _chars;
private readonly string _str;
private readonly string _lower;
private readonly string _upper;
private readonly FrozenDictionary<char, int> _indexLookup;
private readonly FrozenDictionary<char, int> _indexLookupUpper;
private readonly SearchValues<char> _searchValuesLowercase;
private readonly SearchValues<char> _searchValuesUppercase;
private readonly SearchValues<char> _searchValuesIgnoreCase;
private readonly int DoubleLength;
private readonly int MinusLength;

Expand Down Expand Up @@ -154,6 +181,10 @@ public char AtMod(int index)

public override string ToString() => _str;

public string ToStringLower() => _lower;

public string ToStringUpper() => _upper;

public char[] ToCharArray()
{
var copy = new char[_chars.Length];
Expand All @@ -163,6 +194,12 @@ public char[] ToCharArray()

public ReadOnlyMemory<char> ToMemory() => _str.AsMemory();

public SearchValues<char> ToSearchValuesLower() => _searchValuesLowercase;

public SearchValues<char> ToSearchValuesUpper() => _searchValuesUppercase;

public SearchValues<char> ToSearchValuesIgnoreCase() => _searchValuesIgnoreCase;

public PolybiusSquare ToPolybiusSquare() => PolybiusSquare.CreateFromAlphabet(this);

public void CopyTo(Span<char> destination) => _chars.CopyTo(destination);
Expand Down

0 comments on commit 5bab356

Please sign in to comment.