コード例 #1
0
        public override bool Write(IDataModel model, ModelDelta token, int start, ref string data)
        {
            var parts = data.Split(new[] { "(", ")", " " }, StringSplitOptions.RemoveEmptyEntries).ToList();

            TableStreamRun.Recombine(parts, "\"", "\"");
            data = string.Empty;
            if (parts.Count != VisibleElementCount)
            {
                return(false);
            }
            int  bitOffset  = 0;
            int  partIndex  = 0;
            bool anyChanges = false;

            for (int i = 0; i < Elements.Count; i++)
            {
                if (string.IsNullOrEmpty(Elements[i].Name))
                {
                    // Unnamed segments. I should increment, and  bitOffset should increase, but the value should change to zero.
                    anyChanges |= Elements[i].Write(model, token, start, bitOffset, 0);
                    partIndex  -= 1;
                }
                else if (!string.IsNullOrEmpty(Elements[i].SourceName))
                {
                    if (ArrayRunEnumSegment.TryParse(Elements[i].SourceName, model, parts[partIndex], out int value))
                    {
                        anyChanges |= Elements[i].Write(model, token, start, bitOffset, value);
                    }
                }
                else if (Elements[i].BitWidth == 1)
                {
                    if (bool.TryParse(parts[partIndex], out bool value))
                    {
                        anyChanges |= Elements[i].Write(model, token, start, bitOffset, value ? 1 : 0);
                    }
                }
                else
                {
                    if (int.TryParse(parts[partIndex], out int value))
                    {
                        anyChanges |= Elements[i].Write(model, token, start, bitOffset, value);
                    }
                }

                partIndex += 1;
                bitOffset += Elements[i].BitWidth;
            }

            var remainingBits = Length * 8 - bitOffset;

            if (remainingBits > 0)
            {
                anyChanges |= new TupleSegment(string.Empty, remainingBits).Write(model, token, start, bitOffset, 0);
            }

            return(anyChanges);
        }
コード例 #2
0
        public void Visit(DataFormats.Tuple tuple, byte data)
        {
            Result = CurrentText.EndsWith(")");
            if (CurrentText.EndsWith(" "))
            {
                var tokens = CurrentText.Split(new[] { ' ', '(', ')' }, StringSplitOptions.RemoveEmptyEntries).ToList();
                TableStreamRun.Recombine(tokens, "\"", "\"");
                if (tokens.Count == tuple.Model.VisibleElementCount)
                {
                    Result = true;
                }
            }

            if (Result)
            {
                tuple.Model.Write(Model, CurrentChange, memoryLocation, CurrentText);
                NewDataIndex = memoryLocation + tuple.Length;
            }
        }
コード例 #3
0
        public IReadOnlyList <AutocompleteItem> GetAutocomplete(IDataModel model, string text)
        {
            var tupleTokens = text.Split(" ").ToList();

            TableStreamRun.Recombine(tupleTokens, "\"", "\"");
            if (tupleTokens[0].StartsWith("("))
            {
                tupleTokens[0] = tupleTokens[0].Substring(1);
            }
            var visibleTupleElements = Elements.Where(element => !string.IsNullOrEmpty(element.Name)).ToList();
            var optionToken          = tupleTokens.Last();

            tupleTokens = tupleTokens.Take(tupleTokens.Count - 1).ToList();
            if (visibleTupleElements.Count > tupleTokens.Count)
            {
                var tupleToken = visibleTupleElements[tupleTokens.Count];
                if (optionToken.StartsWith("\""))
                {
                    optionToken = optionToken.Substring(1);
                }
                if (optionToken.EndsWith("\""))
                {
                    optionToken = optionToken.Substring(0, optionToken.Length - 1);
                }
                if (!string.IsNullOrEmpty(tupleToken.SourceName))
                {
                    var optionText = ArrayRunEnumSegment.GetOptions(model, tupleToken.SourceName).Where(option => option.MatchesPartial(optionToken));
                    return(CreateTupleEnumAutocompleteOptions(tupleTokens, optionText));
                }
                else if (tupleToken.BitWidth == 1)
                {
                    var optionText = new[] { "false", "true" }.Where(option => option.MatchesPartial(optionToken));
                    return(CreateTupleEnumAutocompleteOptions(tupleTokens, optionText));
                }
            }

            return(null);
        }