Class: Raindrops::Struct

Inherits:
Object
  • Object
show all
Defined in:
lib/raindrops/struct.rb

Overview

This is a wrapper around Raindrops objects much like the core Ruby Struct can be seen as a wrapper around the core Array class. It's usage is similar to the core Struct class, except its fields may only be used to house unsigned long integers.

class Foo < Raindrops::Struct.new(:readers, :writers)
end

foo = Foo.new 0, 0

foo.incr_writers    -> 1
foo.incr_readers    -> 1

Direct Known Subclasses

ListenStats

Class Method Summary collapse

Class Method Details

.new(*members) ⇒ Object

returns a new class derived from Raindrops::Struct and supporting the given members as fields, just like Struct.new in core Ruby.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/raindrops/struct.rb', line 20

def self.new(*members)
  members = members.map { |x| x.to_sym }.freeze
  str = "def initialize(*values)\n(MEMBERS.size >= values.size) or raise ArgumentError, \"too many arguments\"\n@raindrops = Raindrops.new(MEMBERS.size)\nvalues.each_with_index { |val,i| @raindrops[i] = values[i] }\nend\n\ndef initialize_copy(src)\n@raindrops = src.instance_variable_get(:@raindrops).dup\nend\n\ndef []=(index, value)\n@raindrops[index] = value\nend\n\ndef [](index)\n@raindrops[index]\nend\n\ndef to_hash\nary = @raindrops.to_ary\nrv = {}\nMEMBERS.each_with_index { |member, i| rv[member] = ary[i] }\nrv\nend\n"

  members.each_with_index do |member, i|
    str << "def incr_#{member}; @raindrops.incr(#{i}); end; " \
           "def decr_#{member}; @raindrops.decr(#{i}); end; " \
           "def #{member}; @raindrops[#{i}]; end; " \
           "def #{member}=(val); @raindrops[#{i}] = val; end; "
  end

  klass = Class.new
  klass.const_set(:MEMBERS, members)
  klass.class_eval(str)
  klass
end