Crates.io | overloading |
lib.rs | overloading |
version | 0.1.2 |
source | src |
created_at | 2023-01-10 14:35:28.099177 |
updated_at | 2023-01-10 15:14:02.959818 |
description | A POC crate that utilizes `Fn*` traits to implement partial overloading |
homepage | |
repository | https://github.com/George-Miao/overloading |
max_upload_size | |
id | 755416 |
size | 7,797 |
A POC crate that utilizes Fn*
traits to implement partial overloading. Caveat: only parameters can be overloaded, not return types.
#![feature(unboxed_closures)]
#![feature(fn_traits)]
use overloading::overloading;
#[overloading]
fn overloaded(abc: String) -> i32 {
abc.parse().unwrap()
}
#[overloading(overloaded)]
fn overloaded() -> i32 {
114514
}
#[test]
fn test() {
let res = overloaded("123".to_owned());
assert_eq!(res, 123);
let res = overloaded();
assert_eq!(res, 114514);
}
Expanded code:
#[allow(non_camel_case_types)]
struct overloaded;
impl std::ops::FnOnce<(String,)> for overloaded {
type Output = i32;
extern "rust-call" fn call_once(self, (abc,): (String,)) -> Self::Output {
abc.parse().unwrap()
}
}
impl std::ops::FnMut<(String,)> for overloaded {
extern "rust-call" fn call_mut(&mut self, (abc,): (String,)) -> Self::Output {
abc.parse().unwrap()
}
}
impl std::ops::Fn<(String,)> for overloaded {
extern "rust-call" fn call(&self, (abc,): (String,)) -> Self::Output {
abc.parse().unwrap()
}
}
impl std::ops::FnOnce<()> for overloaded {
type Output = i32;
extern "rust-call" fn call_once(self, _: ()) -> Self::Output {
114514
}
}
impl std::ops::FnMut<()> for overloaded {
extern "rust-call" fn call_mut(&mut self, _: ()) -> Self::Output {
114514
}
}
impl std::ops::Fn<()> for overloaded {
extern "rust-call" fn call(&self, _: ()) -> Self::Output {
114514
}
}