Class: BSON::OrderedHash

Inherits:
Hash
  • Object
show all
Defined in:
lib/bson/ordered_hash.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*a, &b) ⇒ OrderedHash

Returns a new instance of OrderedHash.



55
56
57
58
# File 'lib/bson/ordered_hash.rb', line 55

def initialize(*a, &b)
  super
  @ordered_keys = []
end

Instance Attribute Details

#ordered_keysObject

Returns the value of attribute ordered_keys.



38
39
40
# File 'lib/bson/ordered_hash.rb', line 38

def ordered_keys
  @ordered_keys
end

Class Method Details

.[](*args) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/bson/ordered_hash.rb', line 40

def self.[] *args
  oh = BSON::OrderedHash.new
  if Hash === args[0]
    oh.merge! args[0]
  elsif (args.size % 2) != 0
    raise ArgumentError, "odd number of elements for Hash"
  else
    0.step(args.size - 1, 2) do |key|
      value = key + 1
      oh[args[key]] = args[value]
    end
  end
  oh
end

Instance Method Details

#==(other) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/bson/ordered_hash.rb', line 26

def ==(other)
  begin
    !other.nil? &&
      keys == other.keys &&
      values == other.values
  rescue
    false
  end
end

#[]=(key, value) ⇒ Object



64
65
66
67
68
# File 'lib/bson/ordered_hash.rb', line 64

def []=(key, value)
  @ordered_keys ||= []
  @ordered_keys << key unless @ordered_keys.include?(key)
  super(key, value)
end

#clearObject



120
121
122
123
# File 'lib/bson/ordered_hash.rb', line 120

def clear
  super
  @ordered_keys = []
end

#delete(key, &block) ⇒ Object



107
108
109
110
# File 'lib/bson/ordered_hash.rb', line 107

def delete(key, &block)
  @ordered_keys.delete(key) if @ordered_keys
  super
end

#delete_if(&block) ⇒ Object



112
113
114
115
116
117
118
# File 'lib/bson/ordered_hash.rb', line 112

def delete_if(&block)
  self.each { |k,v|
    if yield k, v
      delete(k)
    end
  }
end

#eachObject Also known as: each_pair



70
71
72
73
74
# File 'lib/bson/ordered_hash.rb', line 70

def each
  @ordered_keys ||= []
  @ordered_keys.each { |k| yield k, self[k] }
  self
end

#eql?(o) ⇒ Boolean

Returns:

  • (Boolean)


134
135
136
137
138
139
140
# File 'lib/bson/ordered_hash.rb', line 134

def eql?(o)
  if o.instance_of? BSON::OrderedHash
    self.hash == o.hash
  else
    false
  end
end

#hashObject



125
126
127
128
129
130
131
132
# File 'lib/bson/ordered_hash.rb', line 125

def hash
  code = 17
  each_pair do |key, value|
    code = 37 * code + key.hash
    code = 37 * code + value.hash
  end
  code & 0x7fffffff
end

#inspectObject



101
102
103
104
105
# File 'lib/bson/ordered_hash.rb', line 101

def inspect
  str = '{'
  str << (@ordered_keys || []).collect { |k| "\"#{k}\"=>#{self.[](k).inspect}" }.join(", ")
  str << '}'
end

#keysObject



60
61
62
# File 'lib/bson/ordered_hash.rb', line 60

def keys
  @ordered_keys || []
end

#merge(other) ⇒ Object



86
87
88
89
90
# File 'lib/bson/ordered_hash.rb', line 86

def merge(other)
  oh = self.dup
  oh.merge!(other)
  oh
end

#merge!(other) ⇒ Object Also known as: update



92
93
94
95
96
97
# File 'lib/bson/ordered_hash.rb', line 92

def merge!(other)
  @ordered_keys ||= []
  @ordered_keys += other.keys # unordered if not an BSON::OrderedHash
  @ordered_keys.uniq!
  super(other)
end

#to_aObject



77
78
79
80
# File 'lib/bson/ordered_hash.rb', line 77

def to_a
  @ordered_keys ||= []
  @ordered_keys.map { |k| [k, self[k]] }      
end

#valuesObject



82
83
84
# File 'lib/bson/ordered_hash.rb', line 82

def values
  collect { |k, v| v }
end