Sha256: 0e5154af3f8d22994bdf73a45dab4383a312b4661d57ddc2059dedda203d38ed
Contents?: true
Size: 1.94 KB
Versions: 2
Compression:
Stored size: 1.94 KB
Contents
require 'set' module Spotify # The Pointer is a kind of AutoPointer specially tailored for Spotify # objects, that releases the raw pointer on GC. class Pointer < FFI::AutoPointer # Raised when #releaser_for is given an invalid type. class InvalidTypeError < StandardError end class << self # Create a proc that will accept a pointer of a given type and # release it with the correct function if it’s not null. # # @raise [InvalidTypeError] when given an invalid type # @param [Symbol] type # @return [Proc] def releaser_for(type) unless Spotify.respond_to?(:"#{type}_release!") raise InvalidTypeError, "#{type} is not a valid Spotify type" end lambda do |pointer| $stdout.puts "Spotify::#{type}_release!(#{pointer})" if $DEBUG Spotify.send(:"#{type}_release!", pointer) unless pointer.null? end end # Checks an object by pointer kind and type. # # @param [Object] object # @param [Symbol] type # @return [Boolean] true if object is a spotify pointer and of correct type def typechecks?(object, type) object.is_a?(Spotify::Pointer) && (object.type == type.to_s) end end # @return [Symbol] type attr_reader :type # Initialize a Spotify pointer, which will automatically decrease # the reference count of it’s pointer when garbage collected. # # @param [FFI::Pointer] pointer # @param [#to_s] type session, link, etc # @param [Boolean] add_ref will increase refcount by one if true def initialize(pointer, type, add_ref) super pointer, self.class.releaser_for(@type = type.to_s) unless pointer.null? Spotify.send(:"#{type}_add_ref!", pointer) end if add_ref end # @return [String] representation of the spotify pointer def to_s "<#{self.class} address=0x#{address.to_s(16)} type=#{type}>" end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
spotify-12.0.3 | lib/spotify/types/pointer.rb |
spotify-12.0.2 | lib/spotify/types/pointer.rb |