-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathBufferExtensions.cs
More file actions
100 lines (78 loc) · 4.21 KB
/
BufferExtensions.cs
File metadata and controls
100 lines (78 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Vim.BFastLib.Core;
namespace Vim.BFastLib
{
/// <summary>
/// Helper functions for working with buffers
/// </summary>
public static class BufferExtensions
{
public static Buffer<T> ToBuffer<T>(this T[] xs) where T : unmanaged
=> new Buffer<T>(xs);
public static NamedBuffer<T> ToNamedBuffer<T>(this T[] xs, string name = "") where T : unmanaged
=> new NamedBuffer<T>(xs, name);
public static NamedBuffer ToNamedBuffer(this IBuffer buffer, string name = "")
=> new NamedBuffer(buffer, name);
public static NamedBuffer<T> ToNamedBuffer<T>(this IBuffer<T> xs, string name = "") where T : unmanaged
=> new NamedBuffer<T>(xs.GetTypedData(), name);
public static IEnumerable<INamedBuffer> ToNamedBuffers(this IEnumerable<IBuffer> buffers, IEnumerable<string> names = null)
=> names == null ? buffers.Select(b => b.ToNamedBuffer("")) : buffers.Zip(names, ToNamedBuffer);
public static IDictionary<string, INamedBuffer> ToDictionary(this IEnumerable<INamedBuffer> buffers)
=> buffers.ToDictionary(b => b.Name, b => b);
public static IEnumerable<INamedBuffer> ToNamedBuffers(this IDictionary<string, IBuffer> d)
=> d.Select(kv => kv.Value.ToNamedBuffer(kv.Key));
public static IEnumerable<INamedBuffer> ToNamedBuffers(this IDictionary<string, byte[]> d)
=> d.Select(kv => kv.Value.ToNamedBuffer(kv.Key));
public static Array CopyBytes(this IBuffer src, Array dst, int srcOffset = 0, int destOffset = 0)
{
Buffer.BlockCopy(src.Data, srcOffset, dst, destOffset, (int)src.NumBytes());
return dst;
}
public static byte[] ToBytes(this IBuffer src, byte[] dest = null)
=> src.ToArray(dest);
public static byte[] ToBytes<T>(this T[] xs, byte[] dest = null) where T : unmanaged
=> xs.RecastArray(dest);
public static byte[] ToBytes<T>(this T x) where T : unmanaged
=> ToBytes(new[] { x });
/// <summary>
/// Accepts an array of the given type, or creates one if necessary, copy the buffer data into it
/// </summary>
public static unsafe T[] ToArray<T>(this IBuffer buffer, T[] dest = null) where T : unmanaged
=> (T[])buffer.CopyBytes(dest ?? new T[buffer.NumBytes() / sizeof(T)]);
/// <summary>
/// Returns the array in the buffer, if it is of the correct type, or creates a new array of the create type and copies
/// bytes into it, as necessary.
/// </summary>
public static unsafe T[] AsArray<T>(this IBuffer buffer) where T : unmanaged
=> buffer.Data is T[] r ? r : buffer.ToArray<T>();
/// <summary>
/// Copies an array of unmanaged types into another array of unmanaged types
/// </summary>
public static unsafe U[] RecastArray<T, U>(this T[] src, U[] r = null) where T : unmanaged where U : unmanaged
=> src.ToBuffer().ToArray(r);
public static int NumElements(this IBuffer buffer)
=> buffer.Data.Length;
public static long NumBytes(this IBuffer buffer)
=> (long)buffer.NumElements() * buffer.ElementSize;
public static Buffer<T> ReadBufferFromNumberOfBytes<T>(this Stream stream, long numBytes) where T : unmanaged
=> stream.ReadArrayBytes<T>(numBytes).ToBuffer();
public static Buffer<T> ReadBuffer<T>(this Stream stream, int numElements) where T : unmanaged
=> stream.ReadArray<T>(numElements).ToBuffer();
public static Buffer<byte> ReadBuffer(this Stream stream, int numBytes)
=> stream.ReadBuffer<byte>(numBytes);
public static void Write(this Stream stream, IBuffer buffer)
=> buffer.Write(stream);
public static NamedBuffer<T> Fill<T>(this NamedBuffer<T> buffer, T value) where T : unmanaged
{
var array = new T[buffer.Data.Length];
for (var i = 0; i < array.Length; i++)
{
array[i] = value;
}
return array.ToNamedBuffer(buffer.Name);
}
}
}