Class: KeyStream

Inherits:
Object
  • Object
show all
Defined in:
lib/igo/trie.rb

Overview

文字列を文字のストリームとして扱うためのクラス

  • readメソッドで個々の文字を順に読み込み、文字列の終端に達した場合にはNode::Chck::TERMINATE_CODEが返される。

Instance Method Summary collapse

Constructor Details

#initialize(key, start = 0) ⇒ KeyStream

Returns a new instance of KeyStream.



47
48
49
50
51
# File 'lib/igo/trie.rb', line 47

def initialize(key, start = 0)
  @s = key
  @cur = start
  @len = key.unpack("U*").size
end

Instance Method Details

#compare_to(ks) ⇒ Object



53
54
55
# File 'lib/igo/trie.rb', line 53

def compare_to(ks)
  return rest.compare_to(ks.rest)
end

#eos?Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/igo/trie.rb', line 90

def eos?
  return (@cur == @len) ? true : false
end

#readObject



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/igo/trie.rb', line 78

def read

  if eos?
    return Node::Chck::TERMINATE_CODE
  else
    r = @s.unpack("U*")[@cur]
    result = [r].pack("U*")
    @cur += 1
    return r
  end
end

#restObject



74
75
76
# File 'lib/igo/trie.rb', line 74

def rest
  return @s.slice(@cur, @s.length)
end

#start_with(prefix, beg, len) ⇒ Object

このメソッドは動作的には、rest().starts_with?(prefix.substring(beg, len))と等価。 ほんの若干だが、パフォーマンスを改善するために導入。 簡潔性のためになくしても良いかもしれない。



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/igo/trie.rb', line 60

def start_with(prefix, beg, len)
  s = @s
  c = @cur
  if @len - c < len
    return false
  end
  word = s.unpack("U*")[c]
  if word.nil?
    return (prefix.slice(beg, len-beg) == nil)
  else
    [word].pack("U*").starts_with?(prefix.slice(beg, len-beg))
  end
end