use crate::conversion::{
analysis::fun::function_wrapper::{CppConversionType, TypeConversionPolicy},
ConvertError,
};
use crate::known_types::type_lacks_copy_constructor;
use super::type_to_cpp;
impl TypeConversionPolicy {
pub(super) fn unconverted_type(&self) -> Result<String, ConvertError> {
match self.cpp_conversion {
CppConversionType::FromUniquePtrToValue => self.wrapped_type(),
_ => self.unwrapped_type_as_string(),
}
}
pub(super) fn converted_type(&self) -> Result<String, ConvertError> {
match self.cpp_conversion {
CppConversionType::FromValueToUniquePtr => self.wrapped_type(),
_ => self.unwrapped_type_as_string(),
}
}
fn unwrapped_type_as_string(&self) -> Result<String, ConvertError> {
type_to_cpp(&self.unwrapped_type)
}
fn wrapped_type(&self) -> Result<String, ConvertError> {
Ok(format!(
"std::unique_ptr<{}>",
self.unwrapped_type_as_string()?
))
}
pub(super) fn cpp_conversion(&self, var_name: &str) -> Result<String, ConvertError> {
Ok(match self.cpp_conversion {
CppConversionType::None => {
if type_lacks_copy_constructor(&self.unwrapped_type) {
format!("std::move({})", var_name)
} else {
var_name.to_string()
}
}
CppConversionType::FromUniquePtrToValue => format!("std::move(*{})", var_name),
CppConversionType::FromValueToUniquePtr => format!(
"std::make_unique<{}>({})",
self.unconverted_type()?,
var_name
),
})
}
}