ArrayByteIterable.coffee | |
---|---|
fs = require 'fs'
ByteIterableBase = (require './ByteIterableBase.coffee').ByteIterableBase
ByteIterator = (require '../../ByteIterator.coffee').ByteIterator
UnsupportedOperationError =
(require '../../../errors/UnsupportedOperationError.coffee').
UnsupportedOperationError | |
This class allows working with Buffer as iterable. | class ArrayByteIterable extends ByteIterableBase |
Constructor. @param bytes the Buffer with data. @param length the length of Buffer or it's part. | @create$Buffer$int: (bytes, length, o) ->
if !o? then o = new ArrayByteIterable()
if length == 0
o.fillBytes$ByteIterator ByteIterableBase.EMPTY_ITERATOR
else
if length == 1
o.fillBytes$int$ByteIterator bytes[0], ByteIterableBase.EMPTY_ITERATOR
else
o.bytes = bytes
o.length = length
return o |
Constructor. @param bytes the Buffer with data. | @create$Buffer: (bytes, o) ->
return ArrayByteIterable.create$Buffer$int bytes, bytes.length, o |
This class implements iterator for this iterable. | class Iterator extends ByteIterator |
@private | offs: undefined |
@private | obj: undefined |
Constructor. @param offset. @param obj the object which this iterator is created inside (to get access to it's properties). | @create$int: (offset, obj, o) =>
if !o? then o = new Iterator()
o.offs = offset
o.obj = obj
return o
hasNext$emit: () =>
return @offs < @obj.length
next$emit: () =>
offset = @offs
result = @obj.bytes[offset]
@offs = offset + 1
return result
skip$int: (length) =>
result = Math.min length, @obj.length - @offs
@offs += result
return result
getOffset: () ->
return @offs |
@private This class implements empty array iterable (analogue of zero). | class EmptyIterable extends ArrayByteIterable |
@private | ITERATOR: undefined |
@private | obj: undefined |
Constructor. @param obj the object which this iterator is created inside (to get access to it's properties). | @create: (obj, o) ->
if !o? then o = new EmptyIterable()
o = EmptyIterable.create$Buffer$int new Buffer(0), 0, o
o.obj = obj
o.ITERATOR = Iterator.create$int 0, o
return o
getIterator: () ->
return @ITERATOR
setBytes$Buffer: (bytes) ->
throw new UnsupportedOperationError()
@EMPTY: EmptyIterable.create() |
Constructor. @param bi another ByteIterable that will be used as a prototype for new one. | @create$ByteIterable: (bi, o) ->
if !o? then o = new ArrayByteIterable()
length = bi.getLength()
if length == 0
o.fillBytes$ByteIterator ByteIterableBase.EMPTY_ITERATOR
else
bytes = bi.getBytesUnsafe()
if length == 1
o.fillBytes$int$ByteIterator bytes[0], ByteIterableBase.EMPTY_ITERATOR
else
o.length = length
o.bytes = bytes
return o |
Constructor. @param it ByteIterator of data. | @create$ByteIterator: (it, o) ->
if !o? then o = new ArrayByteIterable()
o.fillBytes$ByteIterator it
return o |
Constructor. @param firstByte. @param bi another ByteIterable that will be used as a prototype for new one. | @create$int$ByteIterable: (firstByte, bi, o) ->
if !o? then o = new ArrayByteIterable()
o.fillBytes$int$ByteIterator firstByte, bi.iterator()
return o |
Constructor. @param firstByte. @param it ByteIterator of data. | @create$int$ByteIterator: (firstByte, it, o) ->
if !o? then o = new ArrayByteIterable()
o.fillBytes$int$ByteIterator firstByte, it
return o
iterator: () ->
return @getIterator()
iterator$int: (offset) ->
return Iterator.create$int offset, this
setBytes$Buffer: (bytes) ->
@bytes = bytes
@length = bytes.length
getBytesUnsafe: () ->
return @bytes |
TODO this method is never used in exodus. What can I do with it? | writeTo$ByteArrayOutputStream: (output) ->
output.write @bytes, 0, @length
@getEmptyIterator: () ->
return @EMPTY.ITERATOR |
@protected | getIterator: () ->
return Iterator.create$int 0, this |
@protected | fillBytes: () -> |
do nothing | exports.ArrayByteIterable = ArrayByteIterable
|