[#5322] O(1) performance for insertions/deletions at the front of an Array/String — Eric Mahurin <eric_mahurin@...>

I just did some benchmarks on push, pop, shift, and unshift

24 messages 2005/07/01
[#5338] Re: O(1) performance for insertions/deletions at the front of an Array/String — Mathieu Bouchard <matju@...> 2005/07/02

On Fri, 1 Jul 2005, Eric Mahurin wrote:

[#5348] Re: O(1) performance for insertions/deletions at the front of an Array/String — Eric Mahurin <eric_mahurin@...> 2005/07/02

--- Mathieu Bouchard <matju@artengine.ca> wrote:

[#5357] Re: O(1) performance for insertions/deletions at the front of an Array/String — Mathieu Bouchard <matju@...> 2005/07/03

On Sat, 2 Jul 2005, Eric Mahurin wrote:

[#5359] Re: O(1) performance for insertions/deletions at the front of an Array/String — Eric Mahurin <eric_mahurin@...> 2005/07/03

--- Mathieu Bouchard <matju@artengine.ca> wrote:

[#5361] Re: O(1) performance for insertions/deletions at the front of an Array/String — Mathieu Bouchard <matju@...> 2005/07/03

On Sun, 3 Jul 2005, Eric Mahurin wrote:

[#5362] Re: O(1) performance for insertions/deletions at the front of an Array/String — Eric Mahurin <eric_mahurin@...> 2005/07/03

--- Mathieu Bouchard <matju@artengine.ca> wrote:

[#5365] Re: O(1) performance for insertions/deletions at the front of an Array/String — Yukihiro Matsumoto <matz@...> 2005/07/04

Hi,

[#5367] Re: O(1) performance for insertions/deletions at the front of an Array/String — Eric Mahurin <eric_mahurin@...> 2005/07/04

--- Yukihiro Matsumoto <matz@ruby-lang.org> wrote:

[#5368] Re: O(1) performance for insertions/deletions at the front of an Array/String — Yukihiro Matsumoto <matz@...> 2005/07/04

Hi,

[#5372] Re: O(1) performance for insertions/deletions at the front of an Array/String — Florian Gro<florgro@...> 2005/07/04

Yukihiro Matsumoto wrote:

[#5420] Sydney Developer Preview 1 released — Evan Webb <evanwebb@...>

Sydney, an experimental ruby interpreter, has been released!

15 messages 2005/07/11
[#5424] Re: [ANN] Sydney Developer Preview 1 released — Evan Webb <evanwebb@...> 2005/07/12

Thanks everyone for the feedback so far!

Observer patch

From: nornagon <nornagon@...>
Date: 2005-07-08 14:01:57 UTC
List: ruby-core #5416
Hi all.

A while ago, I was playing with some network programming, and found
that I wanted to have a class that would observe two other Observable
classes. I could have done this by sending another parameter with
notify_observers specifying which class the update came from -- but
that is, to say the least, ugly. So I came up with this patch.
(attached)

What it does is allow you to append a paramter to add_observer.
Observable will then take that paramater and use it instead of the
default :update -- that means you can have one Observable class call
#update_class1 on your class and have the next call #update_class2.

Originally I kept the internal list of observers as an array and kept
the method to send in a class variable, but that pollutes the
namespace further and does not allow for multiple classes observing
the same class to use different method names. So I moved the list of
observers to a hash, that each class could have its own method called.

I request the inclusion of this patch in Ruby 1.8. It is a trivial
patch, and I myself cannot find any bugs -- though if someone else
would be kind enough to give it a quick going-over, I'd be much
obliged.

Without further ado, I present The Patch.

--- observer.rb 2005-07-05 09:28:14.452114352 +1000
+++ observer-new.rb     2005-07-05 09:36:49.987741024 +1000
@@ -120,12 +120,12 @@
  # Add +observer+ as an observer on this object. +observer+ will now receive
  # notifications.
  #
-  def add_observer(observer)
-    @observer_peers = [] unless defined? @observer_peers
-    unless observer.respond_to? :update
-      raise NoMethodError, "observer needs to respond to `update'"
+  def add_observer(observer, func=:update)
+    @observer_peers = {} unless defined? @observer_peers
+    unless observer.respond_to? func
+      raise NoMethodError, "observer does not respond to `#{func.to_s}'"
    end
-    @observer_peers.push observer
+    @observer_peers[observer] = func
  end

  #
@@ -181,9 +181,9 @@
  def notify_observers(*arg)
    if defined? @observer_state and @observer_state
      if defined? @observer_peers
-       for i in @observer_peers.dup
-         i.update(*arg)
-       end
+       @observer_peers.each { |k, v|
+      k.send v, *arg
+    }
      end
      @observer_state = false
    end

--
- nornagon


In This Thread

Prev Next