ctplt 0.0.1

A package manager + build system for C and C++
Documentation
use core::{cmp, fmt, hash};
use std::{
	collections::HashMap, //
	path::Path,
	sync::{Arc, Weak},
};

use allocative::Allocative;
use starlark::values::OwnedFrozenValue;

use super::{
	link_type::LinkPtr,
	project::Project, //
	starlark_project::StarLinkTargetCache,
};

pub(super) trait StarLinkTarget: Send + Sync + fmt::Debug + Allocative {
	fn as_link_target(
		&self,
		parent: Weak<Project>,
		parent_path: &Path,
		ptr: PtrLinkTarget,
		link_map: &mut StarLinkTargetCache,
		gen_name_map: &HashMap<String, OwnedFrozenValue>,
	) -> Result<LinkPtr, String>;

	fn name(&self) -> String;
	fn public_includes_recursive(&self) -> Vec<String>;
}

#[derive(Clone)]
pub(super) struct PtrLinkTarget(pub Arc<dyn StarLinkTarget>);

impl cmp::PartialEq for PtrLinkTarget {
	fn eq(&self, other: &PtrLinkTarget) -> bool {
		core::ptr::eq(Arc::as_ptr(&self.0) as *const (), Arc::as_ptr(&other.0) as *const ())
	}
}
impl cmp::Eq for PtrLinkTarget {}
impl hash::Hash for PtrLinkTarget {
	fn hash<H>(&self, hasher: &mut H)
	where
		H: std::hash::Hasher,
	{
		(Arc::as_ptr(&self.0) as *const ()).hash(hasher)
	}
}