private void CodePatternInfo(CodingInfo pattern) { uint length = 1 + (uint)NeedEncoding.GetByteCount(pattern.codedString); length <<= 2; length |= (uint)TypeBits.PatternInfo; byte[] lenBytes = BitConverter.GetBytes(length); compactFileStream.Write(lenBytes); compactFileStream.WriteByte(pattern.coding); compactFileStream.Write(NeedEncoding.GetBytes(pattern.codedString)); }
public CodingInfo GetNewTypeInfo(PatternMatch patternMatch) { if (currentTypeCodingByte == 255) { return(null); } if (!typeCharCoding.ContainsKey(patternMatch.type)) { typeCharCoding[patternMatch.type] = currentTypeCodingByte; var codingInfoToReturn = new CodingInfo(patternMatch.type, currentTypeCodingByte); currentTypeCodingByte++; return(codingInfoToReturn); } return(null); }
public CodingInfo GetNewPatternInfo(PatternMatch patternMatch) { if (currentPatternCodingByte == 255) { return(null); } var strSplit = patternMatch.str.Split(' '); if (strSplit.Length == 1) { return(null); } if (!typeCandidateDictionaryMapping.ContainsKey(patternMatch.type)) { typeCandidateDictionaryMapping[patternMatch.type] = new Dictionary <int, List <PatternCandidate> >(); } if (!typeCandidateDictionaryMapping[patternMatch.type].ContainsKey(strSplit.Length)) { typeCandidateDictionaryMapping[patternMatch.type][strSplit.Length] = new List <PatternCandidate>(); } foreach (var candidate in typeCandidateDictionaryMapping[patternMatch.type][strSplit.Length]) { var anyShared = false; var differentPartsCounter = 0; var formatStringBuilder = new StringBuilder(patternMatch.str.Length); var patternSplit = new string[strSplit.Length]; for (int i = 0; i < strSplit.Length; i++) { if (strSplit[i] == candidate.strSplit[i]) { anyShared = true; patternSplit[i] = candidate.strSplit[i]; formatStringBuilder.Append(strSplit[i]); } else { patternSplit[i] = ArgumentMark; formatStringBuilder.Append($"{{{differentPartsCounter}}}"); differentPartsCounter++; } formatStringBuilder.Append(' '); } formatStringBuilder.Remove(formatStringBuilder.Length - 1, 1); if (anyShared) { var formatPattern = formatStringBuilder.ToString(); if (!typePatternDictionaryMapping.ContainsKey(patternMatch.type)) { typePatternDictionaryMapping[patternMatch.type] = new Dictionary <int, List <Pattern> >(); } if (!typePatternDictionaryMapping[patternMatch.type].ContainsKey(strSplit.Length)) { typePatternDictionaryMapping[patternMatch.type][strSplit.Length] = new List <Pattern>(); } typePatternDictionaryMapping[patternMatch.type][strSplit.Length].Add(new Pattern(patternSplit, currentPatternCodingByte)); var toReturn = new CodingInfo(formatPattern, currentPatternCodingByte); currentPatternCodingByte++; return(toReturn); } } typeCandidateDictionaryMapping[patternMatch.type][strSplit.Length].Add(new PatternCandidate(strSplit)); return(null); }