Add bitwise shift functions

This commit is contained in:
Diane Sparks 2022-03-06 10:17:37 -08:00
parent 85d28063ca
commit d6fafc171d
No known key found for this signature in database
GPG Key ID: E21ED76C61697D6E
3 changed files with 9 additions and 1 deletions

View File

@ -5,7 +5,7 @@ use crate::{
value::{FloatType, IntType}, value::{FloatType, IntType},
EvalexprError, Function, Value, ValueType, EvalexprError, Function, Value, ValueType,
}; };
use std::ops::{BitAnd, BitOr, BitXor, Not}; use std::ops::{BitAnd, BitOr, BitXor, Not, Shl, Shr};
macro_rules! simple_math { macro_rules! simple_math {
($func:ident) => { ($func:ident) => {
@ -185,6 +185,8 @@ pub fn builtin_function(identifier: &str) -> Option<Function> {
"bitor" => int_function!(bitor, 2), "bitor" => int_function!(bitor, 2),
"bitxor" => int_function!(bitxor, 2), "bitxor" => int_function!(bitxor, 2),
"bitnot" => int_function!(not), "bitnot" => int_function!(not),
"shl" => int_function!(shl, 2),
"shr" => int_function!(shr, 2),
_ => None, _ => None,
} }
} }

View File

@ -360,6 +360,8 @@
//! | `bitor` | 2 | Int | Computes the bitwise or of the given integers | //! | `bitor` | 2 | Int | Computes the bitwise or of the given integers |
//! | `bitxor` | 2 | Int | Computes the bitwise xor of the given integers | //! | `bitxor` | 2 | Int | Computes the bitwise xor of the given integers |
//! | `bitnot` | 1 | Int | Computes the bitwise not of the given integer | //! | `bitnot` | 1 | Int | Computes the bitwise not of the given integer |
//! | `shl` | 2 | Int | Computes the given integer bitwise shifted left by the other given integer |
//! | `shr` | 2 | Int | Computes the given integer bitwise shifted right by the other given integer |
//! //!
//! The `min` and `max` functions can deal with a mixture of integer and floating point arguments. //! The `min` and `max` functions can deal with a mixture of integer and floating point arguments.
//! If the maximum or minimum is an integer, then an integer is returned. //! If the maximum or minimum is an integer, then an integer is returned.

View File

@ -403,6 +403,10 @@ fn test_builtin_functions() {
assert_eq!(eval("bitxor(6, 5)"), Ok(Value::Int(3))); assert_eq!(eval("bitxor(6, 5)"), Ok(Value::Int(3)));
assert_eq!(eval("bitnot(5)"), Ok(Value::Int(-6))); assert_eq!(eval("bitnot(5)"), Ok(Value::Int(-6)));
assert_eq!(eval("bitnot(-1)"), Ok(Value::Int(0))); assert_eq!(eval("bitnot(-1)"), Ok(Value::Int(0)));
assert_eq!(eval("shl(5, 1)"), Ok(Value::Int(10)));
assert_eq!(eval("shl(-6, 5)"), Ok(Value::Int(-192)));
assert_eq!(eval("shr(5, 1)"), Ok(Value::Int(2)));
assert_eq!(eval("shr(-6, 5)"), Ok(Value::Int(-1)));
} }
#[test] #[test]