MCPcopy Create free account
hub / github.com/chronoxor/FastBinaryEncoding / set

Method set

projects/Ruby/proto/fbe.rb:1336–1381  ·  view source on GitHub ↗

Set the decimal value

(value)

Source from the content-addressed store, hash-verified

1334
1335 # Set the decimal value
1336 def set(value)
1337 if (@_buffer.offset + fbe_offset + fbe_size) > @_buffer.size
1338 return
1339 end
1340
1341 # Extract decimal parts
1342 sign, significant_digits, _, exponent = value.split
1343 number = significant_digits.to_i(10)
1344 if exponent > significant_digits.length
1345 number *= 10 ** (exponent - 1)
1346 scale = 0
1347 else
1348 scale = significant_digits.length - exponent
1349 end
1350
1351 # Check for decimal number overflow
1352 bits = number.bit_length
1353 if (bits < 0) || (bits > 96)
1354 # Value too big for .NET Decimal (bit length is limited to [0, 96])
1355 write_count(fbe_offset, 0, fbe_size)
1356 return
1357 end
1358
1359 # Check for decimal scale overflow
1360 if (scale < 0) || (scale > 28)
1361 # Value scale exceeds .NET Decimal limit of [0, 28]
1362 write_count(fbe_offset, 0, fbe_size)
1363 return
1364 end
1365
1366 # Write unscaled value to bytes 0-11
1367 bytes = []
1368 while number > 0
1369 bytes.insert(-1, number & 0xFF)
1370 number >>= 8
1371 end
1372 bytes = bytes.pack("C*")
1373 write_bytes(fbe_offset, bytes)
1374 write_count(fbe_offset + bytes.length, 0, 12 - bytes.length)
1375
1376 # Write scale at byte 14
1377 write_byte(fbe_offset + 14, scale)
1378
1379 # Write signum at byte 15
1380 write_byte(fbe_offset + 15, (sign == -1) ? 0x80 : 0)
1381 end
1382 end
1383
1384 # Fast Binary Encoding bytes field model

Callers

nothing calls this directly

Calls 5

lengthMethod · 0.80
insertMethod · 0.80
offsetMethod · 0.45
sizeMethod · 0.45
to_iMethod · 0.45

Tested by

no test coverage detected