Class: ICU::Collation::Collator

Inherits:
Object
  • Object
show all
Defined in:
lib/ffi-icu/collation.rb

Constant Summary collapse

ULOC_VALID_LOCALE =
1

Instance Method Summary collapse

Constructor Details

#initialize(locale) ⇒ Collator

Returns a new instance of Collator.



65
66
67
68
# File 'lib/ffi-icu/collation.rb', line 65

def initialize(locale)
  ptr = Lib.check_error { |error| Lib.ucol_open(locale, error) }
  @c = FFI::AutoPointer.new(ptr, Lib.method(:ucol_close))
end

Instance Method Details

#[](attribute) ⇒ Object



125
126
127
128
129
# File 'lib/ffi-icu/collation.rb', line 125

def [](attribute)
  ATTRIBUTE_VALUES_INVERSE[Lib.check_error do |error|
    Lib.ucol_getAttribute(@c, ATTRIBUTES[attribute], error)
  end]
end

#[]=(attribute, value) ⇒ Object



131
132
133
134
135
# File 'lib/ffi-icu/collation.rb', line 131

def []=(attribute, value)
  Lib.check_error do |error|
    Lib.ucol_setAttribute(@c, ATTRIBUTES[attribute], ATTRIBUTE_VALUES[value], error)
  end
end

#collate(sortable) ⇒ Object

Raises:

  • (ArgumentError)


103
104
105
106
107
# File 'lib/ffi-icu/collation.rb', line 103

def collate(sortable)
  raise(ArgumentError, 'argument must respond to :sort with arity of 2') unless sortable.respond_to?(:sort)

  sortable.sort { |a, b| compare(a, b) }
end

#collation_key(string) ⇒ Object



117
118
119
120
121
122
123
# File 'lib/ffi-icu/collation.rb', line 117

def collation_key(string)
  ptr = UCharPointer.from_string(string)
  size = Lib.ucol_getSortKey(@c, ptr, string.size, nil, 0)
  buffer = FFI::MemoryPointer.new(:char, size)
  Lib.ucol_getSortKey(@c, ptr, string.size, buffer, size)
  buffer.read_bytes(size - 1)
end

#compare(a, b) ⇒ Object



74
75
76
77
78
79
80
# File 'lib/ffi-icu/collation.rb', line 74

def compare(a, b)
  Lib.ucol_strcoll(
    @c,
    UCharPointer.from_string(a), a.size,
    UCharPointer.from_string(b), b.size
  )
end

#equal?(*args) ⇒ Boolean

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


92
93
94
95
96
97
98
99
100
101
# File 'lib/ffi-icu/collation.rb', line 92

def equal?(*args)
  return super() if args.empty?

  raise(ArgumentError, "wrong number of arguments (#{args.size} for 2)") if args.size != 2

  a, b = args

  Lib.ucol_equal(@c, UCharPointer.from_string(a), a.size,
                 UCharPointer.from_string(b), b.size)
end

#greater?(a, b) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
# File 'lib/ffi-icu/collation.rb', line 82

def greater?(a, b)
  Lib.ucol_greater(@c, UCharPointer.from_string(a), a.size,
                   UCharPointer.from_string(b), b.size)
end

#greater_or_equal?(a, b) ⇒ Boolean

Returns:

  • (Boolean)


87
88
89
90
# File 'lib/ffi-icu/collation.rb', line 87

def greater_or_equal?(a, b)
  Lib.ucol_greaterOrEqual(@c, UCharPointer.from_string(a), a.size,
                          UCharPointer.from_string(b), b.size)
end

#localeObject



70
71
72
# File 'lib/ffi-icu/collation.rb', line 70

def locale
  Lib.check_error { |error| Lib.ucol_getLocale(@c, ULOC_VALID_LOCALE, error) }
end

#rulesObject



109
110
111
112
113
114
115
# File 'lib/ffi-icu/collation.rb', line 109

def rules
  @rules ||= begin
    length = FFI::MemoryPointer.new(:int)
    ptr = Lib.ucol_getRules(@c, length)
    ptr.read_array_of_uint16(length.read_int).pack('U*')
  end
end