Sha256: cb6191d1dc9c45dc470bc07a8d46f3c5922fb2121a5f5b258d05c315629477e4

Contents?: true

Size: 1.05 KB

Versions: 4

Compression:

Stored size: 1.05 KB

Contents

module ICU
  class UCharPointer < FFI::MemoryPointer

    UCHAR_TYPE = :uint16 # not sure how platform-dependent this is..
    TYPE_SIZE  = FFI.type_size(UCHAR_TYPE)

    def self.from_string(str, capacity = nil)
      str   = str.encode("UTF-8") if str.respond_to? :encode
      bytes = str.unpack("U*")

      if capacity
        capacity *= TYPE_SIZE
        if capacity < bytes.size
          raise ArgumentError, "capacity is too small for string of #{bytes.size} bytes"
        end

        ptr = new capacity
      else
        ptr = new bytes.size
      end

      ptr.write_array_of_uint16 bytes

      ptr
    end

    def initialize(size)
      super UCHAR_TYPE, size
    end

    def resized_to(new_size)
      raise "new_size must be larger than current size" if new_size < size

      resized = self.class.new new_size
      resized.put_bytes(0, get_bytes(0, size))

      resized
    end

    def string(length = nil)
      length ||= size / TYPE_SIZE

      wstring = read_array_of_uint16(length)
      wstring.pack("U*")
    end


  end # UCharPointer
end # ICU

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ffi-icu-0.1.6 lib/ffi-icu/uchar.rb
ffi-icu-0.1.5 lib/ffi-icu/uchar.rb
ffi-icu-0.1.4 lib/ffi-icu/uchar.rb
ffi-icu-0.1.3 lib/ffi-icu/uchar.rb