Guest User

Untitled

a guest
Mar 21st, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. struct RefEnumerable
  2. {
  3. readonly Stream stream;
  4.  
  5. public RefEnumerable(Stream stream)
  6. {
  7. this.stream = stream;
  8. }
  9.  
  10. public Enumerator GetEnumerator() => new Enumerator(this);
  11.  
  12. public ref struct Enumerator
  13. {
  14. static readonly int ItemSize = Unsafe.SizeOf<Foo>();
  15.  
  16. readonly Stream stream;
  17. readonly Span<Foo> buffer;
  18. readonly Span<byte> rawBuffer;
  19. bool lastBuffer;
  20. long loadedItems;
  21. int currentItem;
  22.  
  23. public Enumerator(RefEnumerable enumerable)
  24. {
  25. stream = enumerable.stream;
  26. buffer = new Foo[100]; // alloc items buffer
  27. rawBuffer = buffer.NonPortableCast<Foo, byte>(); // cast items buffer to bytes buffer (no copies)
  28. lastBuffer = false;
  29. loadedItems = 0;
  30. currentItem = -1;
  31. }
  32.  
  33. public ref readonly Foo Current => ref buffer[currentItem];
  34.  
  35. public bool MoveNext()
  36. {
  37. if (++currentItem != loadedItems) // increment current position and check if reached end of buffer
  38. return true;
  39. if (lastBuffer) // check if it was the last buffer
  40. return false;
  41.  
  42. // get next buffer
  43. var bytesRead = stream.Read(rawBuffer);
  44. lastBuffer = bytesRead < rawBuffer.Length;
  45. currentItem = 0;
  46. loadedItems = bytesRead / ItemSize;
  47. return loadedItems != 0;
  48. }
  49. }
  50. }
Add Comment
Please, Sign In to add comment