Class: ICU::Collation::Collator
- Inherits:
-
Object
- Object
- ICU::Collation::Collator
- Defined in:
- lib/ffi-icu/collation.rb
Constant Summary collapse
- ULOC_VALID_LOCALE =
1
Instance Method Summary collapse
- #[](attribute) ⇒ Object
- #[]=(attribute, value) ⇒ Object
- #collate(sortable) ⇒ Object
- #collation_key(string) ⇒ Object
- #compare(a, b) ⇒ Object
- #equal?(*args) ⇒ Boolean
- #greater?(a, b) ⇒ Boolean
- #greater_or_equal?(a, b) ⇒ Boolean
-
#initialize(locale) ⇒ Collator
constructor
A new instance of Collator.
- #locale ⇒ Object
- #rules ⇒ Object
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
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
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
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
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 |
#locale ⇒ Object
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 |
#rules ⇒ Object
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 |