class Bytemapper::Registry
Attributes
names[R]
objects[R]
Public Class Methods
new(with_basic_types = true)
click to toggle source
# File lib/bytemapper/registry.rb, line 25 def initialize(with_basic_types = true) @objects = {} @names = {} register_basic_types unless with_basic_types == false end
Public Instance Methods
empty?()
click to toggle source
# File lib/bytemapper/registry.rb, line 31 def empty? @objects.size.zero? && @names.size.zero? end
flush()
click to toggle source
# File lib/bytemapper/registry.rb, line 35 def flush @objects = {} @names = {} end
get(obj)
click to toggle source
# File lib/bytemapper/registry.rb, line 45 def get(obj) if registered_name?(obj) obj = obj.to_sym.downcase @objects.fetch(@names[obj]) unless obj.nil? elsif registered_obj?(obj) @objects.fetch(obj.hash) else nil end end
print()
click to toggle source
# File lib/bytemapper/registry.rb, line 98 def print puts to_s end
put(obj, name = nil)
click to toggle source
# File lib/bytemapper/registry.rb, line 56 def put(obj, name = nil) obj = register_obj(obj) register_name(obj, name) unless name.nil? obj end
register_name(obj, name)
click to toggle source
# File lib/bytemapper/registry.rb, line 86 def register_name(obj, name) if registered_name?(name) && get(name) != obj raise ArgumentError.new 'Name is already registered' else name = name.to_sym.downcase @names[name] ||= obj.hash obj.names << name if obj.respond_to?(:names) end obj end
Also aliased as: register_alias
register_obj(obj)
click to toggle source
# File lib/bytemapper/registry.rb, line 75 def register_obj(obj) unless registered_obj?(obj) begin obj.extend(Nameable) obj.names = Set.new rescue TypeError end end @objects[obj.hash] ||= obj end
registered?(obj)
click to toggle source
# File lib/bytemapper/registry.rb, line 40 def registered?(obj) v = registered_name?(obj) if obj.respond_to?(:to_sym) v || registered_obj?(obj) end
registered_name?(name)
click to toggle source
# File lib/bytemapper/registry.rb, line 62 def registered_name?(name) if name.respond_to?(:to_sym) name = name.to_sym.downcase @names.key?(name) else false end end
registered_obj?(obj)
click to toggle source
# File lib/bytemapper/registry.rb, line 71 def registered_obj?(obj) @objects.key?(obj.hash) end
reset(with_basic_types = true)
click to toggle source
# File lib/bytemapper/registry.rb, line 177 def reset(with_basic_types = true) flush register_basic_types unless with_basic_types == false end
to_s()
click to toggle source
# File lib/bytemapper/registry.rb, line 102 def to_s return "" if @objects.empty? # Buffer to build up output. buf = StringIO.new # Calculate the true max width of each column. widths = [ @names.keys.size.zero? ? 0 : @names.keys.map(&:size).max + 1, # add space for the `:` 7, # length of ID to print @objects.values.map { |o| o.class.to_s.size }.max, @objects.values.map { |v| v.to_s.size }.max ] # Truncate more than `max_width` num chars max_width = 60 widths = widths.map { |w| w > max_width ? max_width : w } # Add an extra space at the beginning and end of each column. widths = widths.map { |p| p += 2 } buf << "+" # Build the header line. widths.each do |w| buf << "#{'-' * w}+" end buf << "\n" # Build the rows of the table. @objects.each do |id, obj| names = @names.filter { |k,v| v == id }.keys names << '' if names.empty? # Create an entry for each object alias. names.each do |name| buf << "|" # Fixup the id string so it pads nicely idstr = id.positive? ? id.to_s[..5] : id.to_s[..6] idstr = id.positive? ? " #{idstr}" : "#{idstr}" # Generate the column values values = [ name.empty? ? name : ":#{name}", idstr, "#{obj.class.to_s}", "#{obj.to_s}" ] # Pad the values to fit in their respective columns, truncating as # needed to stay within `max_width` values = widths.zip(values).map do |w,v| q = w - v.size if q < 2 " #{v[..w-7]} ... " else " #{v}#{" "*(q-1)}" end end values.size.times do |i| buf << "#{values[i]}|" end buf << "\n" end end # Build the trailing line. buf << "+" widths.each do |w| buf << "#{'-' * w}+" end buf << "\n" buf.string end
Private Instance Methods
register_basic_types()
click to toggle source
# File lib/bytemapper/registry.rb, line 183 def register_basic_types [ [:uint8_t, [8,'C']], [:u8, [8,'C']], [:uchar, [8,'C']], [:bool, [8,'C']], [:uint16_t, [16,'S']], [:u16, [16,'S']], [:uint32_t, [32,'L']], [:u32, [32,'L']], [:uint64_t, [64,'Q']], [:u64, [64,'Q']], [:int8_t, [8,'c']], [:i8, [8,'c']], [:char, [8,'c']], [:int16_t, [16,'s']], [:i16, [16,'s']], [:int32_t, [32,'l']], [:i32, [32,'l']], [:int64_t, [64,'q']], [:i64, [64,'q']] ].each do |name, type| type = Type.new(type) put(type, name) end end