Class: CSV::StreamBuf
- Inherits:
-
Object
- Object
- CSV::StreamBuf
- Defined in:
- lib/csv.rb
Overview
Buffered stream.
EXAMPLE 1 – an IO.
class MyBuf < StreamBuf
# Do initialize myself before a super class. Super class might call my
# method 'read'. (Could be awful for C++ user. :-)
def initialize(s)
@s = s
super()
end
# define my own 'read' method.
# CAUTION: Returning nil means EnfOfStream.
def read(size)
@s.read(size)
end
# release buffers. in Ruby which has GC, you do not have to call this...
def terminate
@s = nil
super()
end
end
buf = MyBuf.new(STDIN)
my_str = ''
p buf[0, 0] # => '' (null string)
p buf[0] # => 97 (char code of 'a')
p buf[0, 1] # => 'a'
my_str = buf[0, 5]
p my_str # => 'abcde' (5 chars)
p buf[0, 6] # => "abcde\n" (6 chars)
p buf[0, 7] # => "abcde\n" (6 chars)
p buf.drop(3) # => 3 (dropped chars)
p buf.get(0, 2) # => 'de' (2 chars)
p buf.is_eos? # => false (is not EOS here)
p buf.drop(5) # => 3 (dropped chars)
p buf.is_eos? # => true (is EOS here)
p buf[0] # => nil (is EOS here)
EXAMPLE 2 – String.
This is a conceptual example. No pros with this.
class StrBuf < StreamBuf
def initialize(s)
@str = s
@idx = 0
super()
end
def read(size)
str = @str[@idx, size]
@idx += str.size
str
end
end
Direct Known Subclasses
Instance Method Summary collapse
-
#[](idx, n = nil) ⇒ Object
(also: #get)
get a char or a partial string from the stream.
-
#drop(n) ⇒ Object
drop a string from the stream.
-
#initialize ⇒ StreamBuf
constructor
WARN: Do not instantiate this class directly.
- #is_eos? ⇒ Boolean
Constructor Details
#initialize ⇒ StreamBuf
WARN: Do not instantiate this class directly. Define your own class which derives this class and define ‘read’ instance method.
888 889 890 891 892 893 894 895 |
# File 'lib/csv.rb', line 888 def initialize @buf_list = [] @cur_buf = @buf_tail_idx = -1 @offset = 0 @is_eos = false add_buf @cur_buf = @buf_tail_idx end |
Instance Method Details
#[](idx, n = nil) ⇒ Object Also known as: get
get a char or a partial string from the stream. idx: index of a string to specify a start point of a string to get. unlike String instance, idx < 0 returns nil. n: size of a string to get. returns char at idx if n == nil. returns a partial string, from idx to (idx + n) if n != nil. at EOF, the string size could not equal to arg n.
803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 |
# File 'lib/csv.rb', line 803 def [](idx, n = nil) if idx < 0 return nil end if (idx_is_eos?(idx)) if n and (@offset + idx == buf_size(@cur_buf)) # Like a String, 'abc'[4, 1] returns nil and # 'abc'[3, 1] returns '' not nil. return '' else return nil end end my_buf = @cur_buf my_offset = @offset next_idx = idx while (my_offset + next_idx >= buf_size(my_buf)) if (my_buf == @buf_tail_idx) unless add_buf break end end next_idx = my_offset + next_idx - buf_size(my_buf) my_buf += 1 my_offset = 0 end loc = my_offset + next_idx if !n return @buf_list[my_buf][loc] # Fixnum of char code. elsif (loc + n - 1 < buf_size(my_buf)) return @buf_list[my_buf][loc, n] # String. else # should do loop insted of (tail) recursive call... res = @buf_list[my_buf][loc, BufSize] size_added = buf_size(my_buf) - loc if size_added > 0 idx += size_added n -= size_added ret = self[idx, n] if ret res << ret end end return res end end |
#drop(n) ⇒ Object
drop a string from the stream. returns dropped size. at EOF, dropped size might not equals to arg n. Once you drop the head of the stream, access to the dropped part via [] or get returns nil.
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
# File 'lib/csv.rb', line 854 def drop(n) if is_eos? return 0 end size_dropped = 0 while (n > 0) if !@is_eos or (@cur_buf != @buf_tail_idx) if (@offset + n < buf_size(@cur_buf)) size_dropped += n @offset += n n = 0 else size = buf_size(@cur_buf) - @offset size_dropped += size n -= size @offset = 0 unless rel_buf unless add_buf break end @cur_buf = @buf_tail_idx end end end end size_dropped end |
#is_eos? ⇒ Boolean
882 883 884 |
# File 'lib/csv.rb', line 882 def is_eos? return idx_is_eos?(0) end |