use {
crate::id,
borsh::{BorshDeserialize, BorshSerialize},
gemachain_program::instruction::Instruction,
};
#[derive(Clone, Debug, BorshSerialize, BorshDeserialize, PartialEq)]
pub enum MathInstruction {
PreciseSquareRoot {
radicand: u64,
},
SquareRootU64 {
radicand: u64,
},
SquareRootU128 {
radicand: u128,
},
U64Multiply {
multiplicand: u64,
multiplier: u64,
},
U64Divide {
dividend: u64,
divisor: u64,
},
F32Multiply {
multiplicand: f32,
multiplier: f32,
},
F32Divide {
dividend: f32,
divisor: f32,
},
Noop,
}
pub fn precise_sqrt(radicand: u64) -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::PreciseSquareRoot { radicand }
.try_to_vec()
.unwrap(),
}
}
pub fn sqrt_u64(radicand: u64) -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::SquareRootU64 { radicand }
.try_to_vec()
.unwrap(),
}
}
pub fn sqrt_u128(radicand: u128) -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::SquareRootU128 { radicand }
.try_to_vec()
.unwrap(),
}
}
pub fn u64_multiply(multiplicand: u64, multiplier: u64) -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::U64Multiply {
multiplicand,
multiplier,
}
.try_to_vec()
.unwrap(),
}
}
pub fn u64_divide(dividend: u64, divisor: u64) -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::U64Divide { dividend, divisor }
.try_to_vec()
.unwrap(),
}
}
pub fn f32_multiply(multiplicand: f32, multiplier: f32) -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::F32Multiply {
multiplicand,
multiplier,
}
.try_to_vec()
.unwrap(),
}
}
pub fn f32_divide(dividend: f32, divisor: f32) -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::F32Divide { dividend, divisor }
.try_to_vec()
.unwrap(),
}
}
pub fn noop() -> Instruction {
Instruction {
program_id: id(),
accounts: vec![],
data: MathInstruction::Noop.try_to_vec().unwrap(),
}
}