use crate::conversion::{
analysis::fun::function_wrapper::{CppConversionType, TypeConversionPolicy},
ConvertError,
};
use super::type_to_cpp::{type_to_cpp, CppNameMap};
impl TypeConversionPolicy {
pub(super) fn unconverted_type(
&self,
cpp_name_map: &CppNameMap,
) -> Result<String, ConvertError> {
match self.cpp_conversion {
CppConversionType::FromUniquePtrToValue => self.unique_ptr_wrapped_type(cpp_name_map),
CppConversionType::FromPtrToValue => {
Ok(format!("{}*", self.unwrapped_type_as_string(cpp_name_map)?))
}
_ => self.unwrapped_type_as_string(cpp_name_map),
}
}
pub(super) fn converted_type(&self, cpp_name_map: &CppNameMap) -> Result<String, ConvertError> {
match self.cpp_conversion {
CppConversionType::FromValueToUniquePtr => self.unique_ptr_wrapped_type(cpp_name_map),
_ => self.unwrapped_type_as_string(cpp_name_map),
}
}
fn unwrapped_type_as_string(&self, cpp_name_map: &CppNameMap) -> Result<String, ConvertError> {
type_to_cpp(&self.unwrapped_type, cpp_name_map)
}
fn unique_ptr_wrapped_type(
&self,
original_name_map: &CppNameMap,
) -> Result<String, ConvertError> {
Ok(format!(
"std::unique_ptr<{}>",
self.unwrapped_type_as_string(original_name_map)?
))
}
pub(super) fn cpp_conversion(
&self,
var_name: &str,
cpp_name_map: &CppNameMap,
is_return: bool,
) -> Result<String, ConvertError> {
Ok(match self.cpp_conversion {
CppConversionType::None => var_name.to_string(),
CppConversionType::Move => {
format!("std::move({})", var_name)
}
CppConversionType::FromUniquePtrToValue | CppConversionType::FromPtrToMove => {
format!("std::move(*{})", var_name)
}
CppConversionType::FromValueToUniquePtr => format!(
"std::make_unique<{}>({})",
self.unconverted_type(cpp_name_map)?,
var_name
),
CppConversionType::FromPtrToValue => {
let dereference = format!("*{}", var_name);
if is_return {
dereference
} else {
format!("std::move({})", dereference)
}
}
})
}
}