extract-curves 0.1.1-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/Changelog +21 -0
  2. data/bin/ec_rect2polar +22 -0
  3. data/bin/ec_rect2polar.rb +22 -0
  4. data/bin/ec_rev_lines +5 -0
  5. data/bin/ec_rev_lines.rb +5 -0
  6. data/bin/ec_sph_area +30 -0
  7. data/bin/ec_sph_area.rb +30 -0
  8. data/bin/extract_curves +1670 -0
  9. data/bin/extract_curves.rb +1670 -0
  10. data/ruby_ext/pav/extconf.rb +22 -0
  11. data/ruby_ext/pav/pav.dll +0 -0
  12. data/ruby_libs/pav/attr_cache.rb +211 -0
  13. data/ruby_libs/pav/attr_cache.t1.rb +32 -0
  14. data/ruby_libs/pav/cache.rb +31 -0
  15. data/ruby_libs/pav/collection/std.rb +58 -0
  16. data/ruby_libs/pav/dbg_log.rb +458 -0
  17. data/ruby_libs/pav/floatsio.rb +53 -0
  18. data/ruby_libs/pav/generator_cache.rb +165 -0
  19. data/ruby_libs/pav/graph/node.rb +602 -0
  20. data/ruby_libs/pav/graph/node_grp.rb +865 -0
  21. data/ruby_libs/pav/gtk.rb +6 -0
  22. data/ruby_libs/pav/gtk/button.rb +118 -0
  23. data/ruby_libs/pav/gtk/dialog.rb +29 -0
  24. data/ruby_libs/pav/gtk/guiobj.rb +772 -0
  25. data/ruby_libs/pav/gtk/icons.rb +124 -0
  26. data/ruby_libs/pav/gtk/rulers.rb +264 -0
  27. data/ruby_libs/pav/gtk/toolbar.rb +189 -0
  28. data/ruby_libs/pav/guiobj.rb +2 -0
  29. data/ruby_libs/pav/guiobj/info_asm.rb +41 -0
  30. data/ruby_libs/pav/guiobj/method.rb +211 -0
  31. data/ruby_libs/pav/guiobj/obj.rb +134 -0
  32. data/ruby_libs/pav/guiobj/signals.rb +9 -0
  33. data/ruby_libs/pav/heap.rb +54 -0
  34. data/ruby_libs/pav/icons/alt_handle.xpm +3832 -0
  35. data/ruby_libs/pav/icons/alt_handle_hover.xpm +3368 -0
  36. data/ruby_libs/pav/icons/alt_handle_pressed.xpm +3828 -0
  37. data/ruby_libs/pav/icons/blob.gif +0 -0
  38. data/ruby_libs/pav/icons/contour.gif +0 -0
  39. data/ruby_libs/pav/icons/contour_carpet.gif +0 -0
  40. data/ruby_libs/pav/icons/curve.gif +0 -0
  41. data/ruby_libs/pav/icons/curve_carpet.gif +0 -0
  42. data/ruby_libs/pav/icons/expand_closed.xpm +1791 -0
  43. data/ruby_libs/pav/icons/expand_closed_hover.xpm +1775 -0
  44. data/ruby_libs/pav/icons/expand_open.xpm +1788 -0
  45. data/ruby_libs/pav/icons/expand_open_hover.xpm +1752 -0
  46. data/ruby_libs/pav/icons/extract_curves/extract_curves-icon-rgb.ppm +14 -0
  47. data/ruby_libs/pav/icons/extract_curves/extract_curves-logo-rgb.gif +0 -0
  48. data/ruby_libs/pav/icons/extract_curves/trace_mark.xpm +38 -0
  49. data/ruby_libs/pav/icons/handle.xpm +213 -0
  50. data/ruby_libs/pav/icons/loop.gif +0 -0
  51. data/ruby_libs/pav/icons/loop_carpet.gif +0 -0
  52. data/ruby_libs/pav/icons/next.xpm +29 -0
  53. data/ruby_libs/pav/icons/next_hover.xpm +315 -0
  54. data/ruby_libs/pav/icons/next_pressed.xpm +144 -0
  55. data/ruby_libs/pav/icons/prev.xpm +29 -0
  56. data/ruby_libs/pav/icons/prev_hover.xpm +315 -0
  57. data/ruby_libs/pav/icons/prev_pressed.xpm +144 -0
  58. data/ruby_libs/pav/icons/shaved-core.gif +0 -0
  59. data/ruby_libs/pav/icons/vnext.xpm +29 -0
  60. data/ruby_libs/pav/icons/vprev.xpm +29 -0
  61. data/ruby_libs/pav/numeric/ext.rb +21 -0
  62. data/ruby_libs/pav/patterns/hsep.gif +0 -0
  63. data/ruby_libs/pav/patterns/tnode.gif +0 -0
  64. data/ruby_libs/pav/patterns/tnode_w_link.gif +0 -0
  65. data/ruby_libs/pav/patterns/vlink.gif +0 -0
  66. data/ruby_libs/pav/patterns/vsep.gif +0 -0
  67. data/ruby_libs/pav/patterns/yg_hrope.xpm +492 -0
  68. data/ruby_libs/pav/patterns/yg_hrope_thick.xpm +1904 -0
  69. data/ruby_libs/pav/patterns/yg_hrope_thin.xpm +130 -0
  70. data/ruby_libs/pav/patterns/yg_tnode.xpm +180 -0
  71. data/ruby_libs/pav/patterns/yg_tnode_thick.xpm +615 -0
  72. data/ruby_libs/pav/patterns/yg_tnode_thin.xpm +55 -0
  73. data/ruby_libs/pav/patterns/yg_tnode_w_link.xpm +190 -0
  74. data/ruby_libs/pav/patterns/yg_tnode_w_link_thick.xpm +676 -0
  75. data/ruby_libs/pav/patterns/yg_tnode_w_link_thin.xpm +62 -0
  76. data/ruby_libs/pav/patterns/yg_vrope.xpm +563 -0
  77. data/ruby_libs/pav/patterns/yg_vrope_thick.xpm +2047 -0
  78. data/ruby_libs/pav/patterns/yg_vrope_thin.xpm +166 -0
  79. data/ruby_libs/pav/pav_find.rb +90 -0
  80. data/ruby_libs/pav/pix.rb +402 -0
  81. data/ruby_libs/pav/pix/aapix.rb +378 -0
  82. data/ruby_libs/pav/pix/blob.rb +678 -0
  83. data/ruby_libs/pav/pix/circle.rb +73 -0
  84. data/ruby_libs/pav/pix/contour.rb +676 -0
  85. data/ruby_libs/pav/pix/contour/calc_situations.rb +9 -0
  86. data/ruby_libs/pav/pix/contour/carp_calc.rb +212 -0
  87. data/ruby_libs/pav/pix/contour/situations.dmp +0 -0
  88. data/ruby_libs/pav/pix/contour/situations.rb +21 -0
  89. data/ruby_libs/pav/pix/curve.rb +1544 -0
  90. data/ruby_libs/pav/pix/img_obj.rb +865 -0
  91. data/ruby_libs/pav/pix/node.rb +159 -0
  92. data/ruby_libs/pav/pix/shaved_core.rb +697 -0
  93. data/ruby_libs/pav/pix/subpix.rb +212 -0
  94. data/ruby_libs/pav/rand_accessible.rb +16 -0
  95. data/ruby_libs/pav/rangeset.rb +63 -0
  96. data/ruby_libs/pav/search.rb +210 -0
  97. data/ruby_libs/pav/set.rb +130 -0
  98. data/ruby_libs/pav/string/bits.rb +523 -0
  99. data/ruby_libs/pav/string/ext.rb +58 -0
  100. data/ruby_libs/pav/string/observable.rb +155 -0
  101. data/ruby_libs/pav/string/text.rb +79 -0
  102. data/ruby_libs/pav/string/words.rb +42 -0
  103. data/ruby_libs/pav/sub_arr.rb +56 -0
  104. data/ruby_libs/pav/traced_obj.rb +79 -0
  105. data/web/index.html +280 -0
  106. data/web/media/icons/alt_handle.xpm +3832 -0
  107. data/web/media/icons/alt_handle_hover.xpm +3368 -0
  108. data/web/media/icons/alt_handle_pressed.xpm +3828 -0
  109. data/web/media/icons/blob.gif +0 -0
  110. data/web/media/icons/contour.gif +0 -0
  111. data/web/media/icons/contour_carpet.gif +0 -0
  112. data/web/media/icons/curve.gif +0 -0
  113. data/web/media/icons/curve_carpet.gif +0 -0
  114. data/web/media/icons/expand_closed.xpm +1791 -0
  115. data/web/media/icons/expand_closed_hover.xpm +1775 -0
  116. data/web/media/icons/expand_open.xpm +1788 -0
  117. data/web/media/icons/expand_open_hover.xpm +1752 -0
  118. data/web/media/icons/extract_curves/extract_curves-icon-rgb.ppm +14 -0
  119. data/web/media/icons/extract_curves/extract_curves-logo-rgb.gif +0 -0
  120. data/web/media/icons/extract_curves/trace_mark.xpm +38 -0
  121. data/web/media/icons/handle.xpm +213 -0
  122. data/web/media/icons/loop.gif +0 -0
  123. data/web/media/icons/loop_carpet.gif +0 -0
  124. data/web/media/icons/next.xpm +29 -0
  125. data/web/media/icons/next_hover.xpm +315 -0
  126. data/web/media/icons/next_pressed.xpm +144 -0
  127. data/web/media/icons/prev.xpm +29 -0
  128. data/web/media/icons/prev_hover.xpm +315 -0
  129. data/web/media/icons/prev_pressed.xpm +144 -0
  130. data/web/media/icons/shaved-core.gif +0 -0
  131. data/web/media/icons/vnext.xpm +29 -0
  132. data/web/media/icons/vprev.xpm +29 -0
  133. data/web/media/title.jpeg +0 -0
  134. data/web/stylesheets/default.css +20 -0
  135. metadata +192 -0
@@ -0,0 +1,2 @@
1
+ require 'pav/guiobj/obj'
2
+ require 'pav/guiobj/method'
@@ -0,0 +1,41 @@
1
+ require 'pav/search'
2
+
3
+ module PGuiObj
4
+
5
+ class ObjInfoStrAssembler
6
+ def initialize(impl_obj)
7
+ @impl_obj = impl_obj
8
+ @attrs = []
9
+ @cmp_f = proc { |a,b|
10
+ if (res = (a[0] <=> b[0]))
11
+ res
12
+ else
13
+ a[1] <=> b[1]
14
+ end
15
+ }
16
+ end
17
+
18
+ def set_attr(idx, key, value)
19
+ attr = [idx, key, value]
20
+ if (i = PSearch.bsearch(@attrs, attr, &@cmp_f)) >= 0
21
+ if @attrs[i][2] != value
22
+ @attrs[i][2] = value
23
+ self.rebuild
24
+ end
25
+ else
26
+ @attrs[-i-1, 0] = [attr]
27
+ self.rebuild
28
+ end
29
+ end
30
+
31
+ def rebuild
32
+ @impl_obj.pguiobj_info_str = @attrs.collect { |a| a[2]+'.' }.
33
+ join("\n")
34
+ end
35
+ end
36
+
37
+ module MObj
38
+ attr_accessor :pguiobj_info_str_asm
39
+ end
40
+
41
+ end
@@ -0,0 +1,211 @@
1
+ require 'ostruct'
2
+ require 'pav/guiobj/signals'
3
+
4
+ module PGuiObj
5
+
6
+ class Bool
7
+ end
8
+
9
+ class Enum < Array
10
+ def initialize(*args)
11
+ super()
12
+ while !args.empty?
13
+ unless (name = args.shift).kind_of?(String)
14
+ raise ArgumentError,
15
+ "Invalid Enumeration member name: #{name.inspect}!"
16
+ end
17
+ self << [name, args.shift]
18
+ end
19
+ end
20
+
21
+ def each_triplet
22
+ self.each_with_index { |k, m| yield(k, m[0], m[1]) }
23
+ end
24
+
25
+ def each_member
26
+ self.each { |m| yield(m[0], m[1]) }
27
+ end
28
+
29
+ def each_name
30
+ self.each { |m| yield(m[0]) }
31
+ end
32
+
33
+ def value(k)
34
+ self.at(k)[1]
35
+ end
36
+ end
37
+
38
+ module MArgument
39
+ attr_accessor :pguiobj_type_class, :pguiobj_type_constraints,
40
+ :pguiobj_contraint_func, :pguiobj_default,
41
+ :pguiobj_name, :pguiobj_descr, :pguiobj_config,
42
+ :pguiobj_value_changed_flag
43
+
44
+ def pguiobj_init(klass, constraints=OpenStruct.new, constraint_func=nil,
45
+ default=nil, name=nil, descr=nil, config=OpenStruct.new)
46
+ @pguiobj_type_class = klass
47
+ @pguiobj_type_constraints = constraints
48
+ @pguiobj_constraint_func = constraint_func
49
+ @pguiobj_default = default
50
+ @pguiobj_name = name
51
+ @pguiobj_descr = descr
52
+ @pguiobj_config = config || OpenStruct.new
53
+ @pguiobj_value_changed_flag = Flag.new
54
+ raise ArgumentError, "Invalid constraints: #{
55
+ @pguiobj_type_constraints}/#{@pguiobj_type_constraints.class
56
+ }!" unless @pguiobj_type_constraints.kind_of?(OpenStruct) ||
57
+ @pguiobj_type_constraints.kind_of?(PGuiObj::Enum) ||
58
+ @pguiobj_type_constraints.kind_of?(PGuiObj::Bool) ||
59
+ @pguiobj_type_constraints.nil?
60
+ raise ArgumentError, "Invalid name: #{@pguiobj_name}/#{
61
+ @pguiobj_name.class}" unless @pguiobj_name.kind_of?(String)
62
+ raise ArgumentError, "Default value inconsistent with " +
63
+ "argument type: #{@pguiobj_default}/#{@pguiobj_default.class
64
+ } vs. #{@pguiobj_type_class}" unless @pguiobj_default.nil? ||
65
+ @pguiobj_default.kind_of?(@pguiobj_type_class) ||
66
+ (@pguiobj_type_class == Bool && (@pguiobj_default.
67
+ equal?(true) || @pguiobj_default.equal?(false))) ||
68
+ @pguiobj_type_class == Enum &&
69
+ @pguiobj_default.kind_of?(Integer)
70
+ end
71
+ end
72
+
73
+ class Argument
74
+ include MArgument
75
+
76
+ alias_method :initialize, :pguiobj_init
77
+ end
78
+
79
+ class CancelCall < RuntimeError
80
+ end
81
+
82
+ module PMMethod
83
+ attr_accessor :pguiobj_implementation, :pguiobj_args,
84
+ :pguiobj_pre_call_flag, :pguiobj_cancel_call_flag,
85
+ :pguiobj_post_call_pre_gui_flag, :pguiobj_post_call_flag,
86
+ :pguiobj_name, :pguiobj_descr, :pguiobj_config,
87
+ :pguiobj_parent_meth, :pguiobj_children, :pguiobj_obj
88
+
89
+ def pguiobj_init(implementation, input_args, name=nil, descr=nil,
90
+ config=OpenStruct.new, pre_call_flag=nil, cancel_call_flag=nil,
91
+ pre_gui_flag=nil, post_call_flag=nil)
92
+ @pguiobj_implementation = implementation
93
+ @pguiobj_args = input_args
94
+ @pguiobj_name = name
95
+ @pguiobj_descr = descr
96
+ @pguiobj_config = config
97
+ @pguiobj_pre_call_flag = pre_call_flag || Flag.new
98
+ @pguiobj_cancel_call_flag = cancel_call_flag || Flag.new
99
+ @pguiobj_post_call_pre_gui_flag = pre_gui_flag || Flag.new
100
+ @pguiobj_post_call_flag = post_call_flag || Flag.new
101
+ raise ArgumentError,"Invalid config: #{@pguiobj_config}!" unless
102
+ @pguiobj_config.kind_of?(OpenStruct)
103
+ end
104
+
105
+ def pguiobj_remove_child(child)
106
+ return unless self.pguiobj_children
107
+ #$PDbgLog.sig_call(self)
108
+ #$PDbgLog.puts_msg "Children: #{self.pguiobj_children.inspect}"
109
+ i = nil
110
+ self.pguiobj_children.each_with_index { |c,i|
111
+ break if child.equal?(c) }
112
+ if i
113
+ self.pguiobj_children.delete_at(i)
114
+ else
115
+ warn("#{self.class.name}.remove_child: Child not " +
116
+ "found: #{child}!")
117
+ end
118
+ #$PDbgLog.sig_return
119
+ end
120
+
121
+ def pguiobj_clear_children
122
+ return unless self.pguiobj_children
123
+ self.pguiobj_children.clear
124
+ end
125
+
126
+ def pguiobj_instantiate(obj)
127
+ if (impl = @pguiobj_implementation).kind_of?(Symbol) ||
128
+ impl.kind_of?(String)
129
+ impl = obj.method(impl)
130
+ end
131
+ meth = PMethod.new(impl, @pguiobj_args, @pguiobj_name,
132
+ @pguiobj_descr, @pguiobj_config.dup,
133
+ @pguiobj_pre_call_flag.dup,
134
+ @pguiobj_cancel_call_flag.dup,
135
+ @pguiobj_post_call_pre_gui_flag.dup,
136
+ @pguiobj_post_call_flag.dup)
137
+ meth.pguiobj_obj = obj
138
+ meth
139
+ end
140
+ end
141
+
142
+ class PMethod
143
+ include PMMethod
144
+
145
+ alias_method :initialize, :pguiobj_init
146
+ end
147
+
148
+ class ObjDeathObserverInstcMeth
149
+ attr_reader :instc_meth
150
+
151
+ def initialize(instc_meth)
152
+ @instc_meth = instc_meth
153
+ end
154
+
155
+ def update(gui_obj, obj)
156
+ if @instc_meth.kind_of?(Symbol) || @instc_meth.kind_of?(String)
157
+ obj.method(@instc_meth).call
158
+ else
159
+ @instc_meth.call
160
+ end
161
+ end
162
+ end
163
+
164
+ class MethObserverChildrenNoDeleteBtn
165
+ def self.observe(meth)
166
+ meth.pguiobj_post_call_pre_gui_flag.add_observer(self)
167
+ end
168
+
169
+ def self.update(obj, meth, child)
170
+ child.pguiobj_config.destroy_btn = false if
171
+ child.class <= PGuiObj::MObj
172
+ end
173
+ end
174
+
175
+ class MethObserverCachedAttr
176
+ def self.observe(meth)
177
+ meth.pguiobj_post_call_flag.add_observer(self)
178
+ end
179
+
180
+ def self.update(obj, meth, child, gui_child)
181
+ if child.class <= PGuiObj::MObj
182
+ meth.disable
183
+ child.pguiobj_post_destroy_flag.add_observer(
184
+ ObserverCallMeth.new(meth.method(:enable)))
185
+ end
186
+ end
187
+ end
188
+
189
+ class MethObserverCall
190
+ def self.create
191
+ self
192
+ end
193
+
194
+ def self.update(obj, meth, *args)
195
+ meth.call
196
+ end
197
+ end
198
+
199
+ class ObserverCallMeth
200
+ attr_reader :meth
201
+
202
+ def initialize(meth)
203
+ @meth = meth
204
+ end
205
+
206
+ def update(*args)
207
+ @meth.call
208
+ end
209
+ end
210
+
211
+ end
@@ -0,0 +1,134 @@
1
+ require 'pav/guiobj/method'
2
+ require 'pav/guiobj/signals'
3
+
4
+ module PGuiObj
5
+
6
+ module MObj
7
+ attr_accessor :pguiobj_methods, :pguiobj_config, :pguiobj_parent_meth,
8
+ :pguiobj_impl_obj
9
+ attr_reader :pguiobj_pre_destroy_flag, :pguiobj_post_destroy_flag,
10
+ :pguiobj_changed_flag
11
+
12
+ def pguiobj_init(methods=nil, config=nil)
13
+ @pguiobj_methods = methods ||
14
+ PGuiObj::MObj.pguiobj_get_methods_of(self.class) ||
15
+ []
16
+ raise ArgumentError, "Invalid 'methods' argument: #{
17
+ @pguiobj_methods}!" unless
18
+ @pguiobj_methods.kind_of?(Array)
19
+ raise ArgumentError, "Invalid config: #{config}!" unless
20
+ config.kind_of?(OpenStruct)
21
+ @pguiobj_methods = @pguiobj_methods.collect { |meth|
22
+ meth.pguiobj_instantiate(self) }
23
+ @pguiobj_config = config || OpenStruct.new
24
+ @pguiobj_pre_destroy_flag = Flag.new
25
+ @pguiobj_post_destroy_flag = Flag.new
26
+ @pguiobj_changed_flag = Flag.new
27
+ end
28
+
29
+ def to_pguiobj
30
+ self
31
+ end
32
+
33
+ def self.pguiobj_get_methods_of(klass)
34
+ if (meths = klass.instance_variable_get(:@pguiobj_methods))
35
+ return meths
36
+ end
37
+ begin
38
+ if (meths = self.pguiobj_get_methods_of(klass.superclass))
39
+ klass.instance_variable_set(:@pguiobj_methods,
40
+ meths=meths.dup)
41
+ return meths
42
+ end
43
+ rescue NoMethodError
44
+ end
45
+ klass.instance_variable_set(:@pguiobj_methods, meths=[])
46
+ meths
47
+ end
48
+
49
+ def self.pguiobj_add_methods_to(klass, *args)
50
+ #$PDbgLog.sig_call(self)
51
+ #$PDbgLog.puts_msg "args: #{args.inspect}"
52
+ #res=
53
+ self.pguiobj_get_methods_of(klass).concat(args)
54
+ #$PDbgLog.puts_msg caller[0,5].join('\n')
55
+ #$PDbgLog.sig_return(res.inspect)
56
+ #res
57
+ end
58
+ end
59
+
60
+ module MObjCollection
61
+ def pguiobj_length
62
+ self.length
63
+ end
64
+ end
65
+
66
+ class ObjCollection
67
+ attr_reader :collection
68
+ include PGuiObj::MObj
69
+
70
+ def self.create(collection, *args)
71
+ self.new(collection, *args)
72
+ end
73
+
74
+ def initialize(collection, *args)
75
+ @collection = collection
76
+ pguiobj_init(*args)
77
+ end
78
+
79
+ def pguiobj_length
80
+ @collection.length
81
+ end
82
+ end
83
+
84
+ module MObjArray
85
+ include MObj
86
+ include MObjCollection
87
+
88
+ def pguiobj_each_key_value
89
+ self.each_with_index { |obj, i|
90
+ yield(i, obj) if obj.kind_of?(PGuiObj::MObj)
91
+ }
92
+ end
93
+
94
+ def pguiobj_each_value(&block)
95
+ self.each(&block)
96
+ end
97
+ end
98
+
99
+ class ObjArray < ObjCollection
100
+ def pguiobj_each_key_value
101
+ @collection.each_with_index { |obj, i|
102
+ yield(i, obj) if obj.kind_of?(PGuiObj::MObj)
103
+ }
104
+ end
105
+
106
+ def pguiobj_each_value(&block)
107
+ @collection.each(&block)
108
+ end
109
+ end
110
+
111
+ module MObjHash
112
+ include MObj
113
+ include MObjCollection
114
+
115
+ def pguiobj_each_key_value
116
+ self.each_pair { |k, obj|
117
+ yield(k, obj) if obj.kind_of?(PGuiObj::MObj)
118
+ }
119
+ end
120
+ end
121
+
122
+ class ObjHash < ObjCollection
123
+ def pguiobj_each_key_value
124
+ @collection.each_pair { |k, obj|
125
+ yield(k, obj) if obj.kind_of?(PGuiObj::MObj)
126
+ }
127
+ end
128
+
129
+ def pguiobj_each_value(&block)
130
+ @collection.each_value(&block)
131
+ end
132
+ end
133
+
134
+ end
@@ -0,0 +1,9 @@
1
+ require 'observer'
2
+
3
+ module PGuiObj
4
+
5
+ class Flag
6
+ include Observable
7
+ end
8
+
9
+ end
@@ -0,0 +1,54 @@
1
+ class PMinHeap < Array
2
+ attr_reader :comparator
3
+
4
+ def initialize(&comparator)
5
+ if block_given?
6
+ @comparator = comparator
7
+ else
8
+ @comparator = proc { |a, b| a <=> b }
9
+ end
10
+ super()
11
+ end
12
+
13
+ def push(lm)
14
+ i = self.length
15
+ super(lm)
16
+ while i>0 && @comparator.call(self[parent_i=((i-1)>>1)], lm) > 0
17
+ self[i] = self[parent_i]
18
+ i = parent_i
19
+ end
20
+ self[i] = lm
21
+ self
22
+ end
23
+
24
+ alias_method :<<, :push
25
+
26
+ def pop
27
+ res = self.first
28
+ lm = super
29
+ return res if self.empty?
30
+ i = 0
31
+ len = self.length
32
+ while (chld_i = (i<<1) + 1) < len
33
+ l_chld_i = chld_i + 1
34
+ chld_i = l_chld_i if l_chld_i < len &&
35
+ @comparator.call(self[l_chld_i],self[chld_i])<0
36
+ if @comparator.call(lm, self[chld_i]) > 0
37
+ self[i] = self[chld_i]
38
+ i = chld_i
39
+ else
40
+ self[i] = lm
41
+ return res
42
+ end
43
+ end
44
+ self[i] = lm
45
+ res
46
+ end
47
+
48
+ alias_method :shift, :pop
49
+
50
+ def concat(arr)
51
+ arr.each { |lm| self.push(lm) }
52
+ self
53
+ end
54
+ end