raindrops.git  about / heads / tags
real-time stats for preforking Rack servers
blob ca5404d9311f2c1d626df599bac247c1225a8122 1076 bytes (raw)
$ git show v0.3.0:lib/raindrops/struct.rb	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
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
 
# -*- encoding: binary -*-

class Raindrops::Struct

  def self.new(*members)
    members = members.map { |x| x.to_sym }.freeze
    str = <<EOS
def initialize(*values)
  (MEMBERS.size >= values.size) or raise ArgumentError, "too many arguments"
  @raindrops = Raindrops.new(MEMBERS.size)
  values.each_with_index { |val,i| @raindrops[i] = values[i] }
end

def initialize_copy(src)
  @raindrops = src.instance_variable_get(:@raindrops).dup
end

def []=(index, value)
  @raindrops[index] = value
end

def [](index)
  @raindrops[index]
end

def to_hash
  ary = @raindrops.to_ary
  rv = {}
  MEMBERS.each_with_index { |member, i| rv[member] = ary[i] }
  rv
end
EOS

    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

end

git clone https://yhbt.net/raindrops.git