mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-25 08:53:55 +00:00
* JIT mlrval type-interfence: mlrval package * mlrmap refactor * complete merge from #779 * iterating * mlrval/format.go * mlrval/copy.go * bifs/arithmetic_test.go * iterate on bifs/collections_test.go * mlrval_cmp.go * mlrval JSON iterate * iterate applying mlrval refactors to dependent packages * first clean compile in a long while on this branch * results of first post-compile profiling * testing * bugfix in ofmt formatting * bugfix in octal-supporess * go fmt * neaten * regression tests all passing
229 lines
11 KiB
Go
229 lines
11 KiB
Go
package bifs
|
|
|
|
import (
|
|
"github.com/johnkerl/miller/internal/pkg/mlrval"
|
|
)
|
|
|
|
// ================================================================
|
|
// Bitwise NOT
|
|
|
|
func bitwise_not_i_i(input1 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return mlrval.FromInt(^input1.AcquireIntValue())
|
|
}
|
|
|
|
var bitwise_not_dispositions = [mlrval.MT_DIM]UnaryFunc{
|
|
/*ERROR */ _erro1,
|
|
/*ABSENT */ _absn1,
|
|
/*NULL */ _null1,
|
|
/*VOID */ _void1,
|
|
/*STRING */ _erro1,
|
|
/*INT */ bitwise_not_i_i,
|
|
/*FLOAT */ _erro1,
|
|
/*BOOL */ _erro1,
|
|
/*ARRAY */ _absn1,
|
|
/*MAP */ _absn1,
|
|
/*FUNC */ _erro1,
|
|
}
|
|
|
|
func BIF_bitwise_not(input1 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return bitwise_not_dispositions[input1.Type()](input1)
|
|
}
|
|
|
|
// ================================================================
|
|
// Bit-count
|
|
// https://en.wikipedia.org/wiki/Hamming_weight
|
|
|
|
const _m01 uint64 = 0x5555555555555555
|
|
const _m02 uint64 = 0x3333333333333333
|
|
const _m04 uint64 = 0x0f0f0f0f0f0f0f0f
|
|
const _m08 uint64 = 0x00ff00ff00ff00ff
|
|
const _m16 uint64 = 0x0000ffff0000ffff
|
|
const _m32 uint64 = 0x00000000ffffffff
|
|
|
|
func bitcount_i_i(input1 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
a := uint64(input1.AcquireIntValue())
|
|
a = (a & _m01) + ((a >> 1) & _m01)
|
|
a = (a & _m02) + ((a >> 2) & _m02)
|
|
a = (a & _m04) + ((a >> 4) & _m04)
|
|
a = (a & _m08) + ((a >> 8) & _m08)
|
|
a = (a & _m16) + ((a >> 16) & _m16)
|
|
a = (a & _m32) + ((a >> 32) & _m32)
|
|
return mlrval.FromInt(int(a))
|
|
}
|
|
|
|
var bitcount_dispositions = [mlrval.MT_DIM]UnaryFunc{
|
|
/*ERROR */ _erro1,
|
|
/*ABSENT */ _absn1,
|
|
/*NULL */ _zero1,
|
|
/*VOID */ _void1,
|
|
/*STRING */ _erro1,
|
|
/*INT */ bitcount_i_i,
|
|
/*FLOAT */ _erro1,
|
|
/*BOOL */ _erro1,
|
|
/*ARRAY */ _absn1,
|
|
/*MAP */ _absn1,
|
|
/*FUNC */ _erro1,
|
|
}
|
|
|
|
func BIF_bitcount(input1 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return bitcount_dispositions[input1.Type()](input1)
|
|
}
|
|
|
|
// ================================================================
|
|
// Bitwise AND
|
|
|
|
func bitwise_and_i_ii(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return mlrval.FromInt(input1.AcquireIntValue() & input2.AcquireIntValue())
|
|
}
|
|
|
|
var bitwise_and_dispositions = [mlrval.MT_DIM][mlrval.MT_DIM]BinaryFunc{
|
|
// . ERROR ABSENT NULL VOID STRING INT FLOAT BOOL ARRAY MAP FUNC
|
|
/*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ABSENT */ {_erro, _absn, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn, _erro},
|
|
/*NULL */ {_erro, _absn, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
/*VOID */ {_erro, _absn, _erro, _void, _erro, _void, _void, _erro, _absn, _absn, _erro},
|
|
/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*INT */ {_erro, _1___, _erro, _void, _erro, bitwise_and_i_ii, _erro, _erro, _absn, _absn, _erro},
|
|
/*FLOAT */ {_erro, _erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ARRAY */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*MAP */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*FUNC */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
}
|
|
|
|
func BIF_bitwise_and(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return bitwise_and_dispositions[input1.Type()][input2.Type()](input1, input2)
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
// Bitwise OR
|
|
|
|
func bitwise_or_i_ii(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return mlrval.FromInt(input1.AcquireIntValue() | input2.AcquireIntValue())
|
|
}
|
|
|
|
var bitwise_or_dispositions = [mlrval.MT_DIM][mlrval.MT_DIM]BinaryFunc{
|
|
// . ERROR ABSENT NULL VOID STRING INT FLOAT BOOL ARRAY MAP FUNC
|
|
/*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ABSENT */ {_erro, _absn, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn, _erro},
|
|
/*NULL */ {_erro, _absn, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
/*VOID */ {_erro, _absn, _erro, _void, _erro, _void, _void, _erro, _absn, _absn, _erro},
|
|
/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*INT */ {_erro, _1___, _erro, _void, _erro, bitwise_or_i_ii, _erro, _erro, _absn, _absn, _erro},
|
|
/*FLOAT */ {_erro, _erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ARRAY */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*MAP */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*FUNC */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
}
|
|
|
|
func BIF_bitwise_or(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return bitwise_or_dispositions[input1.Type()][input2.Type()](input1, input2)
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
// Bitwise XOR
|
|
|
|
func bitwise_xor_i_ii(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return mlrval.FromInt(input1.AcquireIntValue() ^ input2.AcquireIntValue())
|
|
}
|
|
|
|
var bitwise_xor_dispositions = [mlrval.MT_DIM][mlrval.MT_DIM]BinaryFunc{
|
|
// . ERROR ABSENT NULL VOID STRING INT FLOAT BOOL ARRAY MAP FUNC
|
|
/*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ABSENT */ {_erro, _absn, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn, _erro},
|
|
/*NULL */ {_erro, _absn, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
/*VOID */ {_erro, _absn, _erro, _void, _erro, _void, _void, _erro, _absn, _absn, _erro},
|
|
/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*INT */ {_erro, _1___, _erro, _void, _erro, bitwise_xor_i_ii, _erro, _erro, _absn, _absn, _erro},
|
|
/*FLOAT */ {_erro, _erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ARRAY */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*MAP */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*FUNC */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
}
|
|
|
|
func BIF_bitwise_xor(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return bitwise_xor_dispositions[input1.Type()][input2.Type()](input1, input2)
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
// Left shift
|
|
|
|
func lsh_i_ii(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return mlrval.FromInt(input1.AcquireIntValue() << uint64(input2.AcquireIntValue()))
|
|
}
|
|
|
|
var left_shift_dispositions = [mlrval.MT_DIM][mlrval.MT_DIM]BinaryFunc{
|
|
// . ERROR ABSENT NULL VOID STRING INT FLOAT BOOL ARRAY MAP FUNC
|
|
/*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ABSENT */ {_erro, _absn, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn, _erro},
|
|
/*NULL */ {_erro, _absn, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
/*VOID */ {_erro, _absn, _erro, _void, _erro, _void, _void, _erro, _absn, _absn, _erro},
|
|
/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*INT */ {_erro, _1___, _erro, _void, _erro, lsh_i_ii, _erro, _erro, _absn, _absn, _erro},
|
|
/*FLOAT */ {_erro, _erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ARRAY */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*MAP */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*FUNC */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
}
|
|
|
|
func BIF_left_shift(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return left_shift_dispositions[input1.Type()][input2.Type()](input1, input2)
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
// Signed right shift
|
|
|
|
func srsh_i_ii(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return mlrval.FromInt(input1.AcquireIntValue() >> uint64(input2.AcquireIntValue()))
|
|
}
|
|
|
|
var signed_right_shift_dispositions = [mlrval.MT_DIM][mlrval.MT_DIM]BinaryFunc{
|
|
// . ERROR ABSENT NULL VOID STRING INT FLOAT BOOL ARRAY MAP FUNC
|
|
/*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ABSENT */ {_erro, _absn, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn, _erro},
|
|
/*NULL */ {_erro, _absn, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
/*VOID */ {_erro, _absn, _erro, _void, _erro, _void, _void, _erro, _absn, _absn, _erro},
|
|
/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*INT */ {_erro, _1___, _erro, _void, _erro, srsh_i_ii, _erro, _erro, _absn, _absn, _erro},
|
|
/*FLOAT */ {_erro, _erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ARRAY */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*MAP */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*FUNC */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
}
|
|
|
|
func BIF_signed_right_shift(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return signed_right_shift_dispositions[input1.Type()][input2.Type()](input1, input2)
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
// Unsigned right shift
|
|
|
|
func ursh_i_ii(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
var ua uint64 = uint64(input1.AcquireIntValue())
|
|
var ub uint64 = uint64(input2.AcquireIntValue())
|
|
var uc = ua >> ub
|
|
return mlrval.FromInt(int(uc))
|
|
}
|
|
|
|
var unsigned_right_shift_dispositions = [mlrval.MT_DIM][mlrval.MT_DIM]BinaryFunc{
|
|
// . ERROR ABSENT NULL VOID STRING INT FLOAT BOOL ARRAY MAP FUNC
|
|
/*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ABSENT */ {_erro, _absn, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn, _erro},
|
|
/*NULL */ {_erro, _absn, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
/*VOID */ {_erro, _absn, _erro, _void, _erro, _void, _void, _erro, _absn, _absn, _erro},
|
|
/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*INT */ {_erro, _1___, _erro, _void, _erro, ursh_i_ii, _erro, _erro, _absn, _absn, _erro},
|
|
/*FLOAT */ {_erro, _erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn, _erro},
|
|
/*ARRAY */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*MAP */ {_absn, _absn, _erro, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _erro},
|
|
/*FUNC */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro, _erro},
|
|
}
|
|
|
|
func BIF_unsigned_right_shift(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval {
|
|
return unsigned_right_shift_dispositions[input1.Type()][input2.Type()](input1, input2)
|
|
}
|