Class: BSON::ByteBuffer

Inherits:
Object
  • Object
show all
Includes:
Grow
Defined in:
lib/bson/byte_buffer.rb

Direct Known Subclasses

Binary

Constant Summary collapse

INT32_PACK =
'l<'.freeze
INT64_PACK =
'q<'.freeze
DOUBLE_PACK =
'E'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Grow

#array, #array!, #b_do, #b_do!, #b_end, #b_end!, #clear!, #doc, #doc!, #finish!, #finish_one!, #grow, #grow!, #push, #push!, #push_doc, #push_doc!, #to_e, #to_t, #to_v, #unfinish!

Constructor Details

#initialize(initial_data = "", max_size = DEFAULT_MAX_BSON_SIZE) ⇒ ByteBuffer

Returns a new instance of ByteBuffer.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/bson/byte_buffer.rb', line 27

def initialize(initial_data="", max_size=DEFAULT_MAX_BSON_SIZE)
  @str = case initial_data
    when String then
      if initial_data.respond_to?(:force_encoding)
        initial_data.force_encoding('binary')
      else
        initial_data
      end
    when BSON::ByteBuffer then
      initial_data.to_a.pack('C*')
    else
      initial_data.pack('C*')
  end

  @cursor = @str.length
  @max_size = max_size
end

Instance Attribute Details

#max_sizeObject (readonly)

Returns the value of attribute max_size.



21
22
23
# File 'lib/bson/byte_buffer.rb', line 21

def max_size
  @max_size
end

#orderObject (readonly)

Returns the value of attribute order.



21
22
23
# File 'lib/bson/byte_buffer.rb', line 21

def order
  @order
end

Instance Method Details

#==(other) ⇒ Object



197
198
199
# File 'lib/bson/byte_buffer.rb', line 197

def ==(other)
  other.respond_to?(:to_s) && @str == other.to_s
end

#append!(buffer) ⇒ Object

Appends a second ByteBuffer object, buffer, to the current buffer.



69
70
71
72
# File 'lib/bson/byte_buffer.rb', line 69

def append!(buffer)
  @str << buffer.to_s
  self
end

#clearObject



57
58
59
60
61
# File 'lib/bson/byte_buffer.rb', line 57

def clear
  @str = ""
  @str.force_encoding('binary') if @str.respond_to?(:force_encoding)
  rewind
end

#dumpObject



213
214
215
216
217
218
# File 'lib/bson/byte_buffer.rb', line 213

def dump
  @str.each_byte do |c, i|
    $stderr.puts "#{'%04d' % i}: #{'%02x' % c} #{'%03o' % c} #{'%s' % c.chr} #{'%3d' % c}"
    i += 1
  end
end

#get(len = nil) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/bson/byte_buffer.rb', line 145

def get(len=nil)
  one_byte = len.nil?
  len ||= 1
  check_read_length(len)
  start = @cursor
  @cursor += len
  if one_byte
    @str[start]
  else
    @str[start, len].unpack("C*")
  end
end

#get_doubleObject



186
187
188
189
190
191
# File 'lib/bson/byte_buffer.rb', line 186

def get_double
  check_read_length(8)
  vals = @str[@cursor..@cursor+7]
  @cursor += 8
  vals.unpack(DOUBLE_PACK)[0]
end

#get_intObject



172
173
174
175
176
177
# File 'lib/bson/byte_buffer.rb', line 172

def get_int
  check_read_length(4)
  vals = @str[@cursor..@cursor+3]
  @cursor += 4
  vals.unpack(INT32_PACK)[0]
end

#get_longObject



179
180
181
182
183
184
# File 'lib/bson/byte_buffer.rb', line 179

def get_long
  check_read_length(8)
  vals = @str[@cursor..@cursor+7]
  @cursor += 8
  vals.unpack(INT64_PACK)[0]
end

#more?Boolean

Returns:

  • (Boolean)


193
194
195
# File 'lib/bson/byte_buffer.rb', line 193

def more?
  @cursor < @str.size
end

#positionObject



49
50
51
# File 'lib/bson/byte_buffer.rb', line 49

def position
  @cursor
end

#position=(val) ⇒ Object



53
54
55
# File 'lib/bson/byte_buffer.rb', line 53

def position=(val)
  @cursor = val
end

#prepend!(buffer) ⇒ Object

Prepends a second ByteBuffer object, buffer, to the current buffer.



75
76
77
78
# File 'lib/bson/byte_buffer.rb', line 75

def prepend!(buffer)
  @str = buffer.to_s + @str
  self
end

#put(byte, offset = nil) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/bson/byte_buffer.rb', line 80

def put(byte, offset=nil)
  @cursor = offset if offset
  if more?
    @str[@cursor] = chr(byte)
  else
    ensure_length(@cursor)
    @str << chr(byte)
  end
  @cursor += 1
end

#put_array(array, offset = nil) ⇒ Object



105
106
107
108
109
110
111
112
113
114
# File 'lib/bson/byte_buffer.rb', line 105

def put_array(array, offset=nil)
  @cursor = offset if offset
  if more?
    @str[@cursor, array.length] = array.pack("C*")
  else
    ensure_length(@cursor)
    @str << array.pack("C*")
  end
  @cursor += array.length
end

#put_binary(data, offset = nil) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/bson/byte_buffer.rb', line 91

def put_binary(data, offset=nil)
  @cursor = offset if offset
  if defined?(BINARY_ENCODING)
    data = data.dup.force_encoding(BINARY_ENCODING)
  end
  if more?
    @str[@cursor, data.length] = data
  else
    ensure_length(@cursor)
    @str << data
  end
  @cursor += data.length
end

#put_double(d, offset = nil) ⇒ Object



136
137
138
139
140
# File 'lib/bson/byte_buffer.rb', line 136

def put_double(d, offset=nil)
  a = []
  [d].pack(DOUBLE_PACK).each_byte { |b| a << b }
  put_array(a, offset)
end

#put_int(i, offset = nil) ⇒ Object



128
129
130
# File 'lib/bson/byte_buffer.rb', line 128

def put_int(i, offset=nil)
  put_num(i, offset, 4)
end

#put_long(i, offset = nil) ⇒ Object



132
133
134
# File 'lib/bson/byte_buffer.rb', line 132

def put_long(i, offset=nil)
  put_num(i, offset, 8)
end

#put_num(i, offset, bytes) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/bson/byte_buffer.rb', line 116

def put_num(i, offset, bytes)
  pack_type = bytes == 4 ? INT32_PACK : INT64_PACK
  @cursor = offset if offset
  if more?
    @str[@cursor, bytes] = [i].pack(pack_type)
  else
    ensure_length(@cursor)
    @str << [i].pack(pack_type)
  end
  @cursor += bytes
end

#rewindObject



45
46
47
# File 'lib/bson/byte_buffer.rb', line 45

def rewind
  @cursor = 0
end

#sizeObject Also known as: length



63
64
65
# File 'lib/bson/byte_buffer.rb', line 63

def size
  @str.size
end

#to_a(format = "C*") ⇒ Object



201
202
203
# File 'lib/bson/byte_buffer.rb', line 201

def to_a(format="C*")
  @str.unpack(format)
end

#to_sObject



209
210
211
# File 'lib/bson/byte_buffer.rb', line 209

def to_s
  @str
end

#unpack(format = "C*") ⇒ Object



205
206
207
# File 'lib/bson/byte_buffer.rb', line 205

def unpack(format="C*")
  to_a(format)
end