Sha256: 50ece808422c32adf9ac55c4c531b6ea3fe2494cd84e00a03045aea6eeacd035

Contents?: true

Size: 1.85 KB

Versions: 4

Compression:

Stored size: 1.85 KB

Contents

# Author: Nicolas Pouillard  <ertai@lrde.epita.fr>.
# Copyright: Copyright (c) 2004 Nicolas Pouillard. All rights reserved.
# License: Ruby license.

# $LastChangedBy: ertai $
# $Id: symtbl.rb 189 2005-04-03 00:33:40Z ertai $

require 'set'

class SymTbl

  @@sid = -1

  attr_reader :sid, :local, :father

  def initialize ( father_env=nil, default=nil )
    @father = father_env
    @sid = (@@sid += 1)
    @local = Hash.new(default)
  end

  def [] ( aKey )
    if @local.has_key? aKey
      @local[aKey]
    elsif @father.nil?
      @local.default
    else
      @father[aKey]
    end
  end

  def []= ( aKey, aValue )
    @local[aKey] = aValue
  end

  # FIXME
  def each ( &block )
    key_set = Set.new
    blk = lambda do |k,v|
      block[k, v] unless key_set.include? k
      key_set << k
    end
    @local.each(&blk)
    @father.each(&blk) unless @father.nil?
  end

  def ancestors
    (@father.is_a?(SymTbl))? [self] + @father.ancestors : [self]
  end

  def desc_one
    if defined? @already_described
      return sid
    else
      @already_described = true
      return { sid => @local }
    end
  end

  def desc
    ancestors.map{ |s| s.desc_one }.to_yaml
  end

end # class SymTbl



if defined? TEST_MODE or __FILE__ == $0

  require 'test/unit'
  class SymTblTest < Test::Unit::TestCase

    def test1
      root = SymTbl.new

      root[:a] = 0
      root[:b] = 1

      assert_equal(1, root[:b], 't1')
      assert_equal(0, root[:a], 't2')

      sub1 = SymTbl.new(root)

      sub1[:a] = 2
      sub1[:c] = 3

      assert_equal(1, sub1[:b], 't3')
      assert_equal(2, sub1[:a], 't4')
      assert_equal(3, sub1[:c], 't5')

      assert_equal(0, root[:a], 't6')

      sub2 = SymTbl.new(sub1)

      assert_equal(2, sub2[:a], 't7')

      sub2[:a] = 42

      assert_equal(42, sub2[:a], 't8')

      assert_equal([], sub2.desc)
    end

  end # class SymTblTest

end

Version data entries

4 entries across 4 versions & 2 rubygems

Version Path
ttk-0.1.576 ruby_ex/symtbl.rb
ttk-0.1.579 ruby_ex/symtbl.rb
ttk-0.1.580 ruby_ex/symtbl.rb
vcs-0.2.148 ruby_ex/symtbl.rb