Class: Igo::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.



56
57
58
59
60
# File 'lib/igo/trie.rb', line 56

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

Instance Method Details

#compare_to(ks) ⇒ Object



62
63
64
# File 'lib/igo/trie.rb', line 62

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

#eos?Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/igo/trie.rb', line 99

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

#readObject



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/igo/trie.rb', line 87

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



83
84
85
# File 'lib/igo/trie.rb', line 83

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

#start_with(prefix, beg, len) ⇒ Object

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



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/igo/trie.rb', line 69

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