Source: accessors/float-accessor.js

/**
 * @author Toru Nagashima
 * @copyright 2016 Toru Nagashima. All rights reserved.
 * See LICENSE file in root directory for full license.
 */
"use strict"

//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------

const assert = require("../assert")
const Accessor = require("./accessor").Accessor

//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------

/**
 * The field accessor for floatN fields.
 *
 * @private
 */
class FloatAccessor extends Accessor {
    /**
     * @param {number} bits - The number of bits.
     */
    constructor(bits) {
        assert(bits === 32 || bits === 64)
        super(`float${bits}`, bits)
    }

    /**
     * Gets the getter/setter pair logic for this accessor.
     *
     * @param {string} name - The property name to access.
     * @param {string} bitOffset - The data position to access.
     * @returns {string} The getter/setter code of the property.
     */
    propertyCode(name, bitOffset) {
        assert.numberOrString(name, "name")
        assert.bitOffsetX8(bitOffset, this.name)

        const byteOffset = bitOffset >> 3
        const bits = this.bits

        return `get ${name}() {
        return this[s.buffer].getFloat${bits}(${byteOffset})
    }
    set ${name}(value) {
        assert.number(value, ${JSON.stringify(name)})
        this[s.buffer].setFloat${bits}(${byteOffset}, value)
    }`
    }
}

//------------------------------------------------------------------------------
// Exports
//------------------------------------------------------------------------------

exports.float32 = Object.freeze(new FloatAccessor(32))
exports.float64 = Object.freeze(new FloatAccessor(64))

// aliases.
exports.float = exports.float32
exports.double = exports.float64