internal VolumeSliceRangeCollector(VolumeMetadata metaData, Direction direction, IReadOnlyCollection <VolumeSliceRangeDefinition> ranges, IProgress <VolumeSliceDefinition> progressNotifier = null, CancellationToken ct = default(CancellationToken))
        {
            if (direction != Direction.Z && ranges.Any(r => r.Direction != direction))
            {
                throw new ArgumentException("Collecting slices ranges for different directions than input is only allowed for z-directed input");
            }

            _Direction        = direction;
            _ProgressNotifier = progressNotifier;
            _Ct = ct;

            _X = metaData.SizeX;
            _Y = metaData.SizeY;
            _Z = metaData.SizeZ;

            foreach (var range in ranges)
            {
                var set = GetSlices(range.Direction);
                for (var i = range.First; i <= range.Last; i++)
                {
                    metaData.GetSliceSize(range.Direction, out var x, out var y);
                    set[i] = new byte[x * y];
                }
            }

            Interop = new InteropSliceWriter
            {
                WriteSlice = WriteSlice
            };
        }
        internal FullVolumeWriter(VolumeMetadata metadata, Direction direction, IProgress <ushort> progressNotifier = null, CancellationToken ct = default(CancellationToken))
        {
            if (metadata == null)
            {
                throw new ArgumentNullException(nameof(metadata));
            }
            _ProgressNotifier = progressNotifier;
            _Ct = ct;

            metadata.GetSliceSize(direction, out _SizeX, out _SizeY);

            _SizeZ = metadata.GetSize(direction);

            _Data = new byte[_SizeZ][];

            for (var z = 0; z < _SizeZ; z++)
            {
                _Data[z] = new byte[_SizeX * _SizeY];
            }

            Interop = new InteropSliceWriter
            {
                WriteSlice = WriteSlice
            };
        }