private void Load(StructureValueCollection values, ushort index, FileSegmentGroup metaArea, IList <ITagClass> classList)
        {
            uint address = values.GetInteger("memory address");

            VirtualAddr = address;
            address     = NewPointerConverter.ConvertToPointer(address);
            if (address != 0 && address != 0xFFFFFFFF)
            {
                MetaLocation = SegmentPointer.FromPointer(address, metaArea);
            }

            var classIndex = (int)values.GetInteger("class index");

            if (classIndex >= 0 && classIndex < classList.Count)
            {
                Class = classList[classIndex];
            }

            var salt = (ushort)values.GetInteger("datum index salt");

            if (salt != 0xFFFF)
            {
                Index = new DatumIndex(salt, index);
            }
            else
            {
                Index = DatumIndex.Null;
            }
        }
        public void VisitReflexive(ReflexiveData field)
        {
            SeekToOffset(field.Offset);
            StructureValueCollection values = StructureReader.ReadStructure(_reader, _tagBlockLayout);
            var  length  = (int)values.GetInteger("entry count");
            uint pointer = values.GetInteger("pointer");

            if (_cache.Engine == EngineType.ThirdGenMCC)
            {
                pointer = NewPointerConverter.ConvertToPointer(pointer);
            }


            // Make sure the pointer looks valid
            if (length < 0 || !_cache.MetaArea.ContainsTagBlockPointer(pointer, (int)(length * field.EntrySize)))
            {
                length  = 0;
                pointer = 0;
            }

            field.Length = length;
            if (pointer != field.FirstEntryAddress)
            {
                field.FirstEntryAddress = pointer;
            }
        }