Example #1
0
        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));
        }
Example #2
0
 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);
 }
Example #3
0
        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);
        }