Exemplo n.º 1
0
 public JSNodeChildEnumerator(JSNode node, JSNodeTraversalData traversalData, bool includeSelf)
 {
     TraversalData     = traversalData;
     Node              = node;
     IncludeSelf       = includeSelf;
     _Index            = IncludeSelf ? -2 : -1;
     _ArrayRecord      = null;
     _ArrayRecordState = default(JSNodeTraversalArrayRecordState);
     _Current          = null;
     _CurrentName      = null;
 }
Exemplo n.º 2
0
 private void MoveNextArrayRecord(JSNodeTraversalArrayRecord arrayRecord)
 {
     _ArrayRecord      = arrayRecord;
     _ArrayRecordState = arrayRecord.StartEnumeration(Node);
 }
Exemplo n.º 3
0
        public bool MoveNext()
        {
            _Current     = null;
            _CurrentName = null;

            while (true)
            {
                if ((_ArrayRecord == null) || (_Index < 0))
                {
                    _Index += 1;
                }

                if (_Index >= TraversalData.Records.Length)
                {
                    return(false);
                }

                if (_Index < 0)
                {
                    if (IncludeSelf)
                    {
                        _Current     = Node;
                        _CurrentName = "Self";
                        return(true);
                    }
                    else
                    {
                        throw new InvalidOperationException("Enumerator error");
                    }
                }

                if (_ArrayRecord != null)
                {
                    if (_ArrayRecord.MoveNext(ref _ArrayRecordState))
                    {
                        _Current     = _ArrayRecordState.CurrentNode;
                        _CurrentName = _ArrayRecordState.CurrentName;
                        return(true);
                    }
                    else
                    {
                        _ArrayRecord = null;
                    }
                }
                else
                {
                    var record        = TraversalData.Records[_Index];
                    var elementRecord = record as JSNodeTraversalElementRecord;
                    if (elementRecord != null)
                    {
                        elementRecord.Get(Node, out _Current, out _CurrentName);

                        if (_Current != null)
                        {
                            return(true);
                        }
                    }
                    else
                    {
                        var arrayRecord = record as JSNodeTraversalArrayRecord;
                        if (arrayRecord != null)
                        {
                            _ArrayRecord      = arrayRecord;
                            _ArrayRecordState = arrayRecord.StartEnumeration(Node);
                        }
                        else
                        {
                            throw new InvalidDataException("Unrecognized record type");
                        }
                    }
                }
            }
        }