ctplt 0.0.1

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

use crate::{
	link_type::LinkPtr, //
	project::Project,
};

pub trait Target: fmt::Debug + Send + Sync {
	fn name(&self) -> &str;
	fn output_name(&self) -> &str;
	fn project(&self) -> Arc<Project>;
}

pub trait LinkTarget: Target {
	fn public_includes(&self) -> Vec<PathBuf>;
	fn public_includes_recursive(&self) -> Vec<PathBuf>;

	fn public_defines(&self) -> Vec<String>;
	fn public_defines_recursive(&self) -> Vec<String>;

	fn public_link_flags(&self) -> Vec<String>;
	fn public_link_flags_recursive(&self) -> Vec<String>;

	fn public_links(&self) -> Vec<LinkPtr>;
	fn public_links_recursive(&self) -> Vec<LinkPtr>;
}

#[derive(Clone)]
pub(super) struct LinkTargetPtr(pub Arc<dyn LinkTarget>);

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