#![allow(incomplete_features)]
#![cfg_attr(RUSTC_WITH_SPECIALIZATION, feature(specialization))]
#![cfg_attr(RUSTC_NEEDS_PROC_MACRO_HYGIENE, feature(proc_macro_hygiene))]
extern crate self as solana_program;
pub mod account_info;
pub(crate) mod atomic_u64;
pub mod blake3;
pub mod borsh;
pub mod bpf_loader;
pub mod bpf_loader_deprecated;
pub mod bpf_loader_upgradeable;
pub mod clock;
pub mod debug_account_data;
pub mod decode_error;
pub mod ed25519_program;
pub mod entrypoint;
pub mod entrypoint_deprecated;
pub mod epoch_schedule;
pub mod feature;
pub mod fee_calculator;
pub mod hash;
pub mod incinerator;
pub mod instruction;
pub mod keccak;
pub mod lamports;
pub mod loader_instruction;
pub mod loader_upgradeable_instruction;
pub mod log;
pub mod message;
pub mod native_token;
pub mod nonce;
pub mod program;
pub mod program_error;
pub mod program_memory;
pub mod program_option;
pub mod program_pack;
pub mod program_stubs;
pub mod program_utils;
pub mod pubkey;
pub mod rent;
pub mod sanitize;
pub mod secp256k1_program;
pub mod secp256k1_recover;
pub mod serialize_utils;
pub mod short_vec;
pub mod slot_hashes;
pub mod slot_history;
pub mod stake;
pub mod stake_history;
pub mod system_instruction;
pub mod system_program;
pub mod sysvar;
pub mod wasm;
#[cfg(target_arch = "bpf")]
pub use solana_sdk_macro::wasm_bindgen_stub as wasm_bindgen;
#[cfg(not(target_arch = "bpf"))]
pub use wasm_bindgen::prelude::wasm_bindgen;
pub mod config {
pub mod program {
crate::declare_id!("Config1111111111111111111111111111111111111");
}
}
pub mod vote {
pub mod program {
crate::declare_id!("Vote111111111111111111111111111111111111111");
}
}
pub use solana_sdk_macro::program_declare_deprecated_id as declare_deprecated_id;
pub use solana_sdk_macro::program_declare_id as declare_id;
pub use solana_sdk_macro::program_pubkey as pubkey;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate solana_frozen_abi_macro;
#[macro_export]
macro_rules! unchecked_div_by_const {
($num:expr, $den:expr) => {{
let _ = [(); ($den - $den) as usize];
let _ = [(); ($den as usize) - 1];
#[allow(clippy::integer_arithmetic)]
let quotient = $num / $den;
quotient
}};
}
use std::{mem::MaybeUninit, ptr::write_bytes};
#[macro_export]
macro_rules! copy_field {
($ptr:expr, $self:ident, $field:ident) => {
std::ptr::addr_of_mut!((*$ptr).$field).write($self.$field)
};
}
pub fn clone_zeroed<T, F>(clone: F) -> T
where
F: Fn(&mut MaybeUninit<T>),
{
let mut value = MaybeUninit::<T>::uninit();
unsafe { write_bytes(&mut value, 0, 1) }
clone(&mut value);
unsafe { value.assume_init() }
}
#[cfg(not(target_arch = "bpf"))]
pub mod example_mocks;
#[cfg(test)]
mod tests {
use super::unchecked_div_by_const;
#[test]
fn test_unchecked_div_by_const() {
const D: u64 = 2;
const N: u64 = 10;
let n = 10;
assert_eq!(unchecked_div_by_const!(10, 2), 5);
assert_eq!(unchecked_div_by_const!(N, 2), 5);
assert_eq!(unchecked_div_by_const!(n, 2), 5);
assert_eq!(unchecked_div_by_const!(10, D), 5);
assert_eq!(unchecked_div_by_const!(N, D), 5);
assert_eq!(unchecked_div_by_const!(n, D), 5);
}
}