/// добавление части слова /// wordPart - оставшася часть слова /// pBase - базовая форма unsafe private void AddWordPart(char *wordPart, BaseMorphoForm baseMorphoForm) { var first_char = *wordPart; if (first_char == '\0') /// сохранение характеристик { var tuples = from morphoForm in baseMorphoForm.MorphoForms select new { ending = morphoForm.EndingUpper, //string.Intern( StringsHelper.ToUpperInvariant( morphoForm.Ending ) ), baseMorphoForm = baseMorphoForm, morphoForm = morphoForm, } ; var dict = new Dictionary <string, LinkedList <pair_t> >(); foreach (var t in tuples) { LinkedList <pair_t> pairs; if (!dict.TryGetValue(t.ending, out pairs)) { pairs = new LinkedList <pair_t>(); dict.Add(t.ending, pairs); } //var morphoAttribute = ; pairs.AddLast(new pair_t(t.baseMorphoForm, MorphoAttributePair.GetMorphoAttribute(t.baseMorphoForm, t.morphoForm))); } if (_EndingDictionary == null) { _EndingDictionary = new Dictionary <string, pair_t[]>(); } foreach (var p in dict) { pair_t[] pairs; if (!_EndingDictionary.TryGetValue(p.Key, out pairs)) { _EndingDictionary.Add(p.Key, p.Value.ToArray()); } else { _EndingDictionary[p.Key] = pairs.Concat(p.Value).ToArray(); } } } else { TreeDictionaryFastMemPlenty value; if (!_Slots.TryGetValue(first_char, out value)) { /// добавление новой буквы value = new TreeDictionaryFastMemPlenty(); _Slots.Add(first_char, value); } value.AddWordPart(wordPart + 1, baseMorphoForm); } }
internal void SetMorphoForms(List <MorphoFormNative> morphoForms) { if (morphoForms.Count != 0) { //---_MorphoForms = morphoForms.ToArray(); LinkedList <MorphoAttributeEnum> morphoAttributes = null; for (int i = 0, len = morphoForms.Count; i < len; i++) { var morphoForm = morphoForms[i]; #region [.окончания морфо-форм.] _TempBufferSet.Add((IntPtr)morphoForm.Ending); #endregion #region [.MorphoFormEndingUpper-&-MorphoAttribute.] var endingUpperPtr = (IntPtr)morphoForm.EndingUpper; if (!_TempBufferSetLiists.TryGetValue(endingUpperPtr, ref morphoAttributes)) { morphoAttributes = PopLinkedList(); _TempBufferSetLiists.Add(endingUpperPtr, morphoAttributes); } var morphoAttribute = MorphoAttributePair.GetMorphoAttribute(this, morphoForm); morphoAttributes.AddLast(morphoAttribute); #endregion } #region [.окончания морфо-форм.] _MorphoFormEndings = new char *[_TempBufferSet.Count]; fixed(char **morphoFormEndingsBase = _MorphoFormEndings) { var it = _TempBufferSet.GetEnumerator(); for (var i = 0; it.MoveNext(); i++) { *(morphoFormEndingsBase + i) = (char *)it.Current; } #region commented. foreach. /*var i = 0; * foreach ( var intptr in tempBufferHS ) * { *(morphoFormEndingsBase + i++) = (char*) intptr; * }*/ #endregion } _TempBufferSet.Clear(); #endregion #region [.MorphoFormEndingUpper-&-MorphoAttribute.] _MorphoFormEndingUpperAndMorphoAttributes = new MorphoFormEndingUpperAndMorphoAttribute[_TempBufferSetLiists.Count]; var it2 = _TempBufferSetLiists.GetEnumerator(); for (var i = 0; it2.MoveNext(); i++) { _MorphoFormEndingUpperAndMorphoAttributes[i] = new MorphoFormEndingUpperAndMorphoAttribute( it2.Current_IntPtr, it2.Current_Value); PushLinkedList(it2.Current_Value); } #region commented /* * var k = 0; * foreach ( var p in tempBufferDict ) * { * _MorphoFormEndingUpperAndMorphoAttributes[ k++ ] = new MorphoFormEndingUpperAndMorphoAttribute( p.Key, p.Value.ToArray() ); * PushLinkedList( p.Value ); * } */ #endregion _TempBufferSetLiists.Clear(); #endregion } else { //_MorphoForms = EMPTY_MORPHOFORM; _MorphoFormEndings = EMPTY_ENDINGS; _MorphoFormEndingUpperAndMorphoAttributes = EMPTY_MFUEMA; } }
/// поиск слова в слоте /// wordPart - оставшаяся часть слова /// pSlot - слот /// letterIndex - индекс буквы unsafe private void FillWordFormMorphologies_Core(char *wordPart, int wordPartLength, int fullWordLength , List <WordFormMorphology_t> result, WordFormMorphologyModeEnum wordFormMorphologyMode) { if (_BaseMorphoForms == null) { return; } foreach (var baseMorphoForm in _BaseMorphoForms) { int baseLength = baseMorphoForm.Base.Length; if ((fullWordLength < baseLength) || (baseLength + baseMorphoForm.MorphoType.MaxEndingLength < fullWordLength) ) { continue; } foreach (var morphoForm in baseMorphoForm.MorphoType.MorphoForms) { var endingLength = morphoForm.EndingUpper.Length; if (baseLength + endingLength != fullWordLength) { continue; } if (endingLength != wordPartLength) { continue; } if (wordPartLength == 0) { ; } else if (!StringsHelper.IsEqual(morphoForm.EndingUpper, wordPart, wordPartLength)) { continue; } #region commented /* * if ( baseLength == letterIndex ) * { * if ( !StringsHelper.IsEqual( morphoForm.EndingUpper, wordPart, wordPartLength ) ) * continue; * } * else * { * var wordForm = baseMorphoForm.Base + morphoForm.EndingUpper; * if ( !StringsHelper.IsEqual( wordForm, letterIndex, wordPart, wordPartLength ) ) * continue; * } */ #endregion switch (wordFormMorphologyMode) { case WordFormMorphologyModeEnum.Default: { var wfmi = new WordFormMorphology_t(baseMorphoForm, MorphoAttributePair.GetMorphoAttribute(baseMorphoForm, morphoForm)); result.Add(wfmi); } break; case WordFormMorphologyModeEnum.StartsWithLowerLetter: { fixed(char *normalForm_ptr = baseMorphoForm.NormalForm) { var first_char = *normalForm_ptr; if ((first_char != '\0') && *(xlat_Unsafe.Inst._UPPER_INVARIANT_MAP + first_char) == first_char) { continue; } } var wfmi = new WordFormMorphology_t(baseMorphoForm, MorphoAttributePair.GetMorphoAttribute(baseMorphoForm, morphoForm)); result.Add(wfmi); } break; case WordFormMorphologyModeEnum.StartsWithUpperLetter: { fixed(char *normalForm_ptr = baseMorphoForm.NormalForm) { var first_char = *normalForm_ptr; if ((first_char != '\0') && *(xlat_Unsafe.Inst._UPPER_INVARIANT_MAP + first_char) != first_char) { continue; } } var wfmi = new WordFormMorphology_t(baseMorphoForm, MorphoAttributePair.GetMorphoAttribute(baseMorphoForm, morphoForm)); result.Add(wfmi); } break; case WordFormMorphologyModeEnum.FirstStartsWithUpperAfterLowerLetter: case WordFormMorphologyModeEnum.FirstStartsWithLowerAfterUpperLetter: { throw new NotImplementedException(); } } } } }
/// добавление слова и всех его форм в словарь /// wordBase - marshaled-слово /// morphoType - морфотип /// nounType - тип сущетсвительного public void AddWord(char *wordBase, MorphoTypeNative morphoType, ref MorphoAttributePair?nounType) { var baseMorphoForm = new BaseMorphoFormNative(wordBase, morphoType); for (TreeDictionaryNative _this = this, _this_next; ;) { var first_char = _UPPER_INVARIANT_MAP[*wordBase]; #region [.сохранение характеристик if end-of-word.] if (first_char == '\0') { // sort & merge after insert - may be faster/better (30.04.2014)!!!! //* var len = morphoType.MorphoFormEndingUpperAndMorphoAttributes.Length; SortedListIntPtrKey <pair[]> .Tuple[] tuples; int tuplesOffset; if (!_this.HasEndings()) { tuplesOffset = 0; tuples = new SortedListIntPtrKey <pair[]> .Tuple[len]; } else { tuplesOffset = _this._Endings.Count; tuples = new SortedListIntPtrKey <pair[]> .Tuple[len + tuplesOffset]; for (int i = 0; i < tuplesOffset; i++) { tuples[i] = _this._Endings.Array[i]; } } for (int i = 0; i < len; i++) { var p = morphoType.MorphoFormEndingUpperAndMorphoAttributes[i]; var pairs_current_len = p.MorphoAttributes.Length; var pairs_current = new pair[pairs_current_len]; for (int j = 0; j < pairs_current_len; j++) { var ma = MorphoAttributePair.GetMorphoAttribute(morphoType, p.MorphoAttributes[j], ref nounType); pairs_current[j] = new pair(baseMorphoForm, ma); } tuples[i + tuplesOffset] = new SortedListIntPtrKey <pair[]> .Tuple() { Key = p.EndingUpper, Value = pairs_current }; } ShellSortAscending(tuples); MergeSorted(ref tuples); _this._Endings.SetArray(tuples); //*/ return; } #endregion if (!_this._Slots.TryGetValue(first_char, out _this_next)) { /// добавление новой буквы _this_next = new TreeDictionaryNative(); _this._Slots.Add(first_char, _this_next); } _this = _this_next; wordBase++; } }