Exemplo n.º 1
0
        public static UnsafeRawList <byte> ReadToEnd(this Stream stream, out int length)
        {
            if (stream is null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            var buf = new UnsafeRawList <byte>(0);

            try {
                length = 0;
                while (true)
                {
                    var span    = buf.Extend(1024);
                    var readLen = stream.Read(span);
                    length += readLen;
                    if (readLen == 0)
                    {
                        break;
                    }
                }
                return(buf);
            }
            catch {
                buf.Dispose();
                throw;
            }
        }
Exemplo n.º 2
0
        public FbxConnectionResolver(FbxNode connectionsNode)
        {
            var count     = connectionsNode.Children.Count;
            var destLists = new UnsafeRawList <UnsafeRawList <long> >(count);
            var srcToDest = new BufferPooledDictionary <long, int>(count);
            var destToSrc = new BufferPooledDictionary <long, int>(count);
            var srcLists  = new UnsafeRawList <UnsafeRawList <long> >(count);

            try {
                foreach (var c in connectionsNode.Children)
                {
                    var props = c.Properties;
                    var conn  = new Connection(props[0].AsString().ToConnectionType(), props[1].AsInt64(), props[2].AsInt64());

                    // Create source-to-dest dictionary
                    {
                        UnsafeRawList <long> dests;
                        if (srcToDest.TryAdd(conn.SourceID, destLists.Count))
                        {
                            dests = new UnsafeRawList <long>();
                            destLists.Add(dests);
                        }
                        else
                        {
                            dests = destLists[srcToDest[conn.SourceID]];
                        }
                        Debug.Assert(dests.IsNull == false);
                        dests.Add(conn.DestID);
                    }

                    // Create dest-to-source dictionary
                    {
                        UnsafeRawList <long> sources;
                        if (destToSrc.TryAdd(conn.DestID, srcLists.Count))
                        {
                            sources = new UnsafeRawList <long>();
                            srcLists.Add(sources);
                        }
                        else
                        {
                            sources = srcLists[destToSrc[conn.DestID]];
                        }
                        Debug.Assert(sources.IsNull == false);
                        sources.Add(conn.SourceID);
                    }
                }
            }
            catch {
                destLists.Dispose();
                srcToDest.Dispose();
                destToSrc.Dispose();
                srcLists.Dispose();
                throw;
            }

            _destLists = destLists;
            _srcToDest = srcToDest;
            _destToSrc = destToSrc;
            _srcLists  = srcLists;
        }
Exemplo n.º 3
0
        public void New()
        {
            using (var list = UnsafeRawList <int> .Null) {
                Assert.True(list.Equals(list));

                Assert.Throws <NullReferenceException>(() => list.Count);
                Assert.Throws <NullReferenceException>(() => list.Capacity);
                Assert.Throws <NullReferenceException>(() => list.Ptr);
                Assert.Throws <NullReferenceException>(() => list.Add(0));
            }

            using (var list = new UnsafeRawList <int>()) {
                Assert.Equal(0, list.Count);
                Assert.True(list.Capacity >= 0);
                Assert.NotEqual(IntPtr.Zero, list.Ptr);
            }

            using (var list = new UnsafeRawList <int>(10)) {
                Assert.Equal(0, list.Count);
                Assert.Equal(10, list.Capacity);
                Assert.NotEqual(IntPtr.Zero, list.Ptr);
            }

            ReadOnlySpan <int> source = Enumerable.Range(0, 100).ToArray();

            using (var list = new UnsafeRawList <int>(source)) {
                Assert.Equal(source.Length, list.Count);
                Assert.True(source.Length >= list.Capacity);
                Assert.NotEqual(IntPtr.Zero, list.Ptr);
                Assert.True(list.AsSpan().SequenceEqual(source));
            }
        }
Exemplo n.º 4
0
        public static unsafe FbxObject Parse(Stream stream)
        {
            if (stream is null)
            {
                throw new ArgumentNullException(nameof(stream));
            }
            var reader = new Reader(stream);

            ParseHeader(reader, out var version);
            UnsafeRawList <FbxNode_> nodes = default;

            try {
                while (true)
                {
                    if (!ParseNodeRecord(reader, version, out var node))
                    {
                        break;
                    }
                    nodes.Add(node);
                }
                return(new FbxObject(nodes));
            }
            catch {
                nodes.Dispose();
                throw;
            }
        }
Exemplo n.º 5
0
        public ResolvedMesh()
        {
            const int capacity = 1024;

            _vertices = new UnsafeRawList <TVertex>(capacity);
            _indices  = new UnsafeRawList <int>(capacity);
        }
Exemplo n.º 6
0
 public ObjObjectCore()
 {
     _positions       = new UnsafeRawList <Vector3>();
     _normals         = new UnsafeRawList <Vector3>();
     _uvs             = new UnsafeRawList <Vector2>();
     _positionIndices = new UnsafeRawList <int>();
     _normalIndices   = new UnsafeRawList <int>();
     _uvIndices       = new UnsafeRawList <int>();
 }
Exemplo n.º 7
0
        public void Clear()
        {
            ReadOnlySpan <int> source = Enumerable.Range(0, 10).ToArray();

            using (var list = new UnsafeRawList <int>(source)) {
                list.Clear();
                Assert.Equal(0, list.Count);
                Assert.True(list.Capacity >= 0);
            }
        }
Exemplo n.º 8
0
        public unsafe void GetReference()
        {
            using (var list = new UnsafeRawList <int>(0)) {
                Assert.True(Unsafe.AsPointer(ref list.GetReference()) == null);
            }

            using (var list = new UnsafeRawList <int>(new[] { 0, 1, 2, 3, 4 })) {
                Assert.True(Unsafe.AreSame(ref list.GetReference(), ref list[0]));
            }
        }
Exemplo n.º 9
0
        public void IndexOf()
        {
            ReadOnlySpan <int> source = Enumerable.Range(0, 10).ToArray();

            using (var list = new UnsafeRawList <int>(source)) {
                for (int i = 0; i < list.Count; i++)
                {
                    Assert.True(list.IndexOf(i) == list[i]);
                }
            }
        }
Exemplo n.º 10
0
        public void Remove()
        {
            const int          Count  = 10;
            ReadOnlySpan <int> source = Enumerable.Range(0, Count).ToArray();

            using (var list = new UnsafeRawList <int>(source)) {
                for (int i = 0; i < Count; i++)
                {
                    var removed = list.Remove(i);
                    Assert.True(removed);
                    Assert.Equal(Count - i - 1, list.Count);
                }
            }
        }
Exemplo n.º 11
0
        public void RemoveAt()
        {
            const int          Count  = 10;
            ReadOnlySpan <int> source = Enumerable.Range(0, Count).ToArray();

            using (var list = new UnsafeRawList <int>(source)) {
                Assert.True(list.AsSpan().SequenceEqual(source));
                list.RemoveAt(5);
                Assert.True(list.AsSpan().SequenceEqual(new[] { 0, 1, 2, 3, 4, 6, 7, 8, 9 }));
                list.RemoveAt(0);
                Assert.True(list.AsSpan().SequenceEqual(new[] { 1, 2, 3, 4, 6, 7, 8, 9 }));
                list.RemoveAt(1);
                Assert.True(list.AsSpan().SequenceEqual(new[] { 1, 3, 4, 6, 7, 8, 9 }));
                list.RemoveAt(6);
                Assert.True(list.AsSpan().SequenceEqual(new[] { 1, 3, 4, 6, 7, 8, }));
            }
        }
Exemplo n.º 12
0
        public void Extend()
        {
            using (var list = new UnsafeRawList <int>(0)) {
                Assert.True(list.Count == 0);
                Assert.True(list.Capacity == 0);
                var extended = list.Extend(0, true);
                Assert.True(list.Count == 0);
                Assert.True(list.Capacity == 0);
                Assert.True(extended.IsEmpty);
            }

            using (var list = new UnsafeRawList <int>(0)) {
                Assert.True(list.Count == 0);
                Assert.True(list.Capacity == 0);
                var extended = list.Extend(3, true);
                Assert.True(list.Count == 3);

                // When extended, the minimum capacity is 4.
                Assert.True(list.Capacity == 4);
                Assert.True(extended.Length == 3);
            }

            using (var list = new UnsafeRawList <int>(40)) {
                Assert.True(list.Count == 0);
                Assert.True(list.Capacity == 40);
                var extended1 = list.Extend(10, true);
                Assert.True(list.Count == 10);

                // The capacity does not changed because it is large enough,.
                Assert.True(list.Capacity == 40);
                Assert.True(extended1.Length == 10);

                // -----------------------------
                var extended2 = list.Extend(50, true);
                Assert.True(list.Count == 60);

                // 'Extend' does not allocate memory of the exact size, but allocates a large enough size.
                // It is twice the size of the current one.
                Assert.True(list.Capacity == 80);
                Assert.True(extended2.Length == 50);
            }
        }
Exemplo n.º 13
0
 private static UnsafeRawList <byte> ReadToBuffer(Stream stream, out int length)
 {
     if (stream.CanSeek)
     {
         var streamLen = stream.Length;
         if (streamLen <= int.MaxValue)
         {
             var buffer = new UnsafeRawList <byte>((int)streamLen);
             try {
                 length = stream.Read(buffer.Extend((int)streamLen, false));
                 return(buffer);
             }
             catch {
                 buffer.Dispose();
                 throw;
             }
         }
         else
         {
             throw new NotSupportedException();
         }
     }
     else
     {
         var buffer   = new UnsafeRawList <byte>();
         var totalLen = 0;
         while (true)
         {
             const int BlockSize = 1024;
             var       readLen   = stream.Read(buffer.Extend(BlockSize, false));
             totalLen += readLen;
             if (readLen < BlockSize)
             {
                 break;
             }
         }
         length = totalLen;
         return(buffer);
     }
 }
Exemplo n.º 14
0
        public void Add()
        {
            using (var list = new UnsafeRawList <int>()) {
                const int Count = 10;
                for (int i = 0; i < Count; i++)
                {
                    list.Add(i);
                }
                for (int i = 0; i < list.Count; i++)
                {
                    Assert.Equal(i, list[i]);
                }
            }

            ReadOnlySpan <int> source = Enumerable.Range(0, 100).ToArray();

            using (var list = new UnsafeRawList <int>(source)) {
                list.AddRange(source);
                Assert.True(list.AsSpan(0, source.Length).SequenceEqual(source));
                Assert.True(list.AsSpan(source.Length, source.Length).SequenceEqual(source));
            }
        }
Exemplo n.º 15
0
 private ResolvedMeshList(int capacity)
 {
     _meshes = new UnsafeRawList <ResolvedMesh <TVertex> >(capacity);
 }
Exemplo n.º 16
0
        public static Image Parse(Stream stream)
        {
            CheckSignature(stream);

            var buf = new BufferSpanReader(stackalloc byte[8]);

            using var data = new UnsafeRawList <byte>(0);
            UnsafeEx.SkipInitIfPossible(out Header header);
            var palette = UnsafeRawArray <PngColor> .Empty;

            try {
                bool hasHeader = false;
                while (true)
                {
                    buf.Position = 0;
                    stream.SafeRead(buf.Span);
                    var chunkSize = buf.Next(4).Int32BigEndian();
                    var chunkType = buf.Next(4);

                    if (hasHeader == false)
                    {
                        if (chunkType.SequenceEqual(ChunkTypeIHDR))
                        {
                            hasHeader = true;
                            ParseIHDR(stream, chunkSize, out header);
                            ValidateHeader(header);
                        }
                        else
                        {
                            ThrowHelper.ThrowFormatException("No IHDR chunk");
                        }
                    }
                    else
                    {
                        if (chunkType.SequenceEqual(ChunkTypeIDAT))
                        {
                            ParseIDAT(stream, chunkSize, data);
                        }
                        else if (chunkType.SequenceEqual(ChunkTypeIEND))
                        {
                            if (chunkSize != 0)
                            {
                                ThrowHelper.ThrowFormatException("IEND chunk size must be 0");
                            }
                            break;
                        }
                        else if (chunkType.SequenceEqual(ChunkTypePLTE))
                        {
                            palette = ParsePLTE(stream, chunkSize);
                        }
                        else
                        {
                            Debug.WriteLine(System.Text.Encoding.ASCII.GetString(chunkType) + " (skip)");
                            stream.SafeSkip(chunkSize);     // Skip not supported chunk
                        }
                    }
                    stream.SafeSkip(4);         // I don't validate CRC
                }

                Debug.Assert(hasHeader);
                return(Decompress(data, header, palette.AsSpan()));
            }
            finally {
                palette.Dispose();
            }
        }