Пример #1
0
        /// добавление части слова
        /// 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;
            }
        }
Пример #3
0
 public bool Add(MorphoAttributePair value) => Add(in value);
Пример #4
0
        /// поиск слова в слоте
        /// 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();
                    }
                    }
                }
            }
        }
Пример #5
0
        /// добавление слова и всех его форм в словарь
        /// 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++;
            }
        }