#![allow(clippy::unwrap_used, dead_code)]
use super::*;
use std::marker::PhantomData;
#[derive(Debug, Clone)]
pub struct AtomConformer<'a> {
atom: &'a Atom,
conformer: &'a Conformer,
}
#[derive(Debug, Clone)]
pub struct AtomConformerResidue<'a> {
atom: &'a Atom,
conformer: &'a Conformer,
residue: &'a Residue,
}
#[derive(Debug, Clone)]
pub struct AtomConformerResidueChain<'a> {
atom: &'a Atom,
conformer: &'a Conformer,
residue: &'a Residue,
chain: &'a Chain,
}
#[derive(Debug, Clone)]
pub struct AtomConformerResidueChainModel<'a> {
atom: &'a Atom,
conformer: &'a Conformer,
residue: &'a Residue,
chain: &'a Chain,
model: &'a Model,
}
#[derive(Debug, Clone)]
pub struct AtomConformerMut<'a> {
atom: *mut Atom,
conformer: *mut Conformer,
phantom: PhantomData<&'a usize>,
}
#[derive(Debug, Clone)]
pub struct AtomConformerResidueMut<'a> {
atom: *mut Atom,
conformer: *mut Conformer,
residue: *mut Residue,
phantom: PhantomData<&'a usize>,
}
#[derive(Debug, Clone)]
pub struct AtomConformerResidueChainMut<'a> {
atom: *mut Atom,
conformer: *mut Conformer,
residue: *mut Residue,
chain: *mut Chain,
phantom: PhantomData<&'a usize>,
}
#[derive(Debug, Clone)]
pub struct AtomConformerResidueChainModelMut<'a> {
atom: *mut Atom,
conformer: *mut Conformer,
residue: *mut Residue,
chain: *mut Chain,
model: *mut Model,
phantom: PhantomData<&'a usize>,
}
pub trait ContainsAtomConformer {
fn atom(&self) -> &Atom;
fn conformer(&self) -> &Conformer;
fn is_backbone(&self) -> bool {
self.conformer().is_amino_acid() && self.atom().is_backbone()
}
fn is_sidechain(&self) -> bool {
self.conformer().is_amino_acid() && !self.atom().is_backbone()
}
}
pub trait ContainsAtomConformerResidue: ContainsAtomConformer {
fn residue(&self) -> &Residue;
}
pub trait ContainsAtomConformerResidueChain: ContainsAtomConformerResidue {
fn chain(&self) -> &Chain;
}
pub trait ContainsAtomConformerResidueChainModel: ContainsAtomConformerResidueChain {
fn model(&self) -> &Model;
}
pub trait ContainsAtomConformerMut: ContainsAtomConformer {
fn atom_mut(&mut self) -> &mut Atom;
fn conformer_mut(&mut self) -> &mut Conformer;
}
pub trait ContainsAtomConformerResidueMut:
ContainsAtomConformerResidue + ContainsAtomConformerMut
{
fn residue_mut(&mut self) -> &mut Residue;
}
pub trait ContainsAtomConformerResidueChainMut:
ContainsAtomConformerResidueChain + ContainsAtomConformerResidueMut
{
fn chain_mut(&mut self) -> &mut Chain;
}
pub trait ContainsAtomConformerResidueChainModelMut:
ContainsAtomConformerResidueChainModel + ContainsAtomConformerResidueChainMut
{
fn model_mut(&mut self) -> &mut Model;
}
#[cfg(feature = "rstar")]
use rstar::{PointDistance, RTreeObject, AABB};
macro_rules! impl_hierarchy {
($($type:ty,)*) => {
$(#[cfg(feature = "rstar")]
impl<'a> RTreeObject for $type {
type Envelope = AABB<(f64, f64, f64)>;
fn envelope(&self) -> Self::Envelope {
self.atom().envelope()
}
}
#[cfg(feature = "rstar")]
impl<'a> PointDistance for $type {
fn distance_2(&self, other: &(f64, f64, f64)) -> f64 {
self.atom().distance_2(other)
}
}
impl<'a> Eq for $type {}
impl<'a> PartialEq for $type {
fn eq(&self, other: &Self) -> bool {
self.atom().serial_number() == other.atom().serial_number()
&& self.conformer().alternative_location() == other.conformer().alternative_location()
}
})*
};
}
impl_hierarchy!(
AtomConformer<'a>,
AtomConformerMut<'a>,
AtomConformerResidue<'a>,
AtomConformerResidueMut<'a>,
AtomConformerResidueChain<'a>,
AtomConformerResidueChainMut<'a>,
AtomConformerResidueChainModel<'a>,
AtomConformerResidueChainModelMut<'a>,
);
impl<'a> AtomConformer<'a> {
pub(crate) const fn new(atom: &'a Atom, conformer: &'a Conformer) -> AtomConformer<'a> {
AtomConformer { atom, conformer }
}
pub(crate) const fn from_tuple(tuple: (&'a Atom, &'a Conformer)) -> AtomConformer<'a> {
AtomConformer {
atom: tuple.0,
conformer: tuple.1,
}
}
pub(crate) const fn extend(self, residue: &'a Residue) -> AtomConformerResidue<'a> {
AtomConformerResidue {
atom: self.atom,
conformer: self.conformer,
residue,
}
}
}
impl<'a> ContainsAtomConformer for AtomConformer<'a> {
fn atom(&self) -> &Atom {
self.atom
}
fn conformer(&self) -> &Conformer {
self.conformer
}
}
impl<'a> AtomConformerResidue<'a> {
pub(crate) const fn new(
atom: &'a Atom,
conformer: &'a Conformer,
residue: &'a Residue,
) -> AtomConformerResidue<'a> {
AtomConformerResidue {
atom,
conformer,
residue,
}
}
pub(crate) const fn from_tuple(
tuple: (&'a Atom, &'a Conformer, &'a Residue),
) -> AtomConformerResidue<'a> {
AtomConformerResidue {
atom: tuple.0,
conformer: tuple.1,
residue: tuple.2,
}
}
pub(crate) const fn extend(self, chain: &'a Chain) -> AtomConformerResidueChain<'a> {
AtomConformerResidueChain {
atom: self.atom,
conformer: self.conformer,
residue: self.residue,
chain,
}
}
}
impl<'a> ContainsAtomConformer for AtomConformerResidue<'a> {
fn atom(&self) -> &Atom {
self.atom
}
fn conformer(&self) -> &Conformer {
self.conformer
}
}
impl<'a> ContainsAtomConformerResidue for AtomConformerResidue<'a> {
fn residue(&self) -> &Residue {
self.residue
}
}
impl<'a> AtomConformerResidueChain<'a> {
pub(crate) const fn new(
atom: &'a Atom,
conformer: &'a Conformer,
residue: &'a Residue,
chain: &'a Chain,
) -> AtomConformerResidueChain<'a> {
AtomConformerResidueChain {
atom,
conformer,
residue,
chain,
}
}
pub(crate) const fn from_tuple(
tuple: (&'a Atom, &'a Conformer, &'a Residue, &'a Chain),
) -> AtomConformerResidueChain<'a> {
AtomConformerResidueChain {
atom: tuple.0,
conformer: tuple.1,
residue: tuple.2,
chain: tuple.3,
}
}
pub(crate) const fn extend(self, model: &'a Model) -> AtomConformerResidueChainModel<'a> {
AtomConformerResidueChainModel {
atom: self.atom,
conformer: self.conformer,
residue: self.residue,
chain: self.chain,
model,
}
}
}
impl<'a> ContainsAtomConformer for AtomConformerResidueChain<'a> {
fn atom(&self) -> &Atom {
self.atom
}
fn conformer(&self) -> &Conformer {
self.conformer
}
}
impl<'a> ContainsAtomConformerResidue for AtomConformerResidueChain<'a> {
fn residue(&self) -> &Residue {
self.residue
}
}
impl<'a> ContainsAtomConformerResidueChain for AtomConformerResidueChain<'a> {
fn chain(&self) -> &Chain {
self.chain
}
}
impl<'a> AtomConformerResidueChainModel<'a> {
pub(crate) const fn new(
atom: &'a Atom,
conformer: &'a Conformer,
residue: &'a Residue,
chain: &'a Chain,
model: &'a Model,
) -> AtomConformerResidueChainModel<'a> {
AtomConformerResidueChainModel {
atom,
conformer,
residue,
chain,
model,
}
}
pub(crate) const fn from_tuple(
tuple: (&'a Atom, &'a Conformer, &'a Residue, &'a Chain, &'a Model),
) -> AtomConformerResidueChainModel<'a> {
AtomConformerResidueChainModel {
atom: tuple.0,
conformer: tuple.1,
residue: tuple.2,
chain: tuple.3,
model: tuple.4,
}
}
}
impl<'a> ContainsAtomConformer for AtomConformerResidueChainModel<'a> {
fn atom(&self) -> &Atom {
self.atom
}
fn conformer(&self) -> &Conformer {
self.conformer
}
}
impl<'a> ContainsAtomConformerResidue for AtomConformerResidueChainModel<'a> {
fn residue(&self) -> &Residue {
self.residue
}
}
impl<'a> ContainsAtomConformerResidueChain for AtomConformerResidueChainModel<'a> {
fn chain(&self) -> &Chain {
self.chain
}
}
impl<'a> ContainsAtomConformerResidueChainModel for AtomConformerResidueChainModel<'a> {
fn model(&self) -> &Model {
self.model
}
}
impl<'a> AtomConformerMut<'a> {
pub(crate) const fn new(atom: *mut Atom, conformer: *mut Conformer) -> AtomConformerMut<'a> {
AtomConformerMut {
atom,
conformer,
phantom: PhantomData,
}
}
pub(crate) const fn from_tuple(tuple: (*mut Atom, *mut Conformer)) -> AtomConformerMut<'a> {
AtomConformerMut {
atom: tuple.0,
conformer: tuple.1,
phantom: PhantomData,
}
}
pub(crate) const fn extend(self, residue: *mut Residue) -> AtomConformerResidueMut<'a> {
AtomConformerResidueMut {
atom: self.atom,
conformer: self.conformer,
residue,
phantom: PhantomData,
}
}
pub fn without_mut(self) -> AtomConformer<'a> {
unsafe {
AtomConformer {
atom: self.atom.as_ref().unwrap(),
conformer: self.conformer.as_ref().unwrap(),
}
}
}
}
impl<'a> ContainsAtomConformer for AtomConformerMut<'a> {
fn atom(&self) -> &Atom {
unsafe { self.atom.as_ref().unwrap() }
}
fn conformer(&self) -> &Conformer {
unsafe { self.conformer.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerMut for AtomConformerMut<'a> {
fn atom_mut(&mut self) -> &mut Atom {
unsafe { self.atom.as_mut().unwrap() }
}
fn conformer_mut(&mut self) -> &mut Conformer {
unsafe { self.conformer.as_mut().unwrap() }
}
}
impl<'a> AtomConformerResidueMut<'a> {
pub(crate) const fn new(
atom: *mut Atom,
conformer: *mut Conformer,
residue: *mut Residue,
) -> AtomConformerResidueMut<'a> {
AtomConformerResidueMut {
atom,
conformer,
residue,
phantom: PhantomData,
}
}
pub(crate) const fn from_tuple(
tuple: (*mut Atom, *mut Conformer, *mut Residue),
) -> AtomConformerResidueMut<'a> {
AtomConformerResidueMut {
atom: tuple.0,
conformer: tuple.1,
residue: tuple.2,
phantom: PhantomData,
}
}
pub(crate) const fn extend(self, chain: *mut Chain) -> AtomConformerResidueChainMut<'a> {
AtomConformerResidueChainMut {
atom: self.atom,
conformer: self.conformer,
residue: self.residue,
chain,
phantom: PhantomData,
}
}
pub fn without_mut(self) -> AtomConformerResidue<'a> {
unsafe {
AtomConformerResidue {
atom: self.atom.as_ref().unwrap(),
conformer: self.conformer.as_ref().unwrap(),
residue: self.residue.as_ref().unwrap(),
}
}
}
}
impl<'a> ContainsAtomConformer for AtomConformerResidueMut<'a> {
fn atom(&self) -> &Atom {
unsafe { self.atom.as_ref().unwrap() }
}
fn conformer(&self) -> &Conformer {
unsafe { self.conformer.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerMut for AtomConformerResidueMut<'a> {
fn atom_mut(&mut self) -> &mut Atom {
unsafe { self.atom.as_mut().unwrap() }
}
fn conformer_mut(&mut self) -> &mut Conformer {
unsafe { self.conformer.as_mut().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidue for AtomConformerResidueMut<'a> {
fn residue(&self) -> &Residue {
unsafe { self.residue.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueMut for AtomConformerResidueMut<'a> {
fn residue_mut(&mut self) -> &mut Residue {
unsafe { self.residue.as_mut().unwrap() }
}
}
impl<'a> AtomConformerResidueChainMut<'a> {
pub(crate) const fn new(
atom: *mut Atom,
conformer: *mut Conformer,
residue: *mut Residue,
chain: *mut Chain,
) -> AtomConformerResidueChainMut<'a> {
AtomConformerResidueChainMut {
atom,
conformer,
residue,
chain,
phantom: PhantomData,
}
}
pub(crate) const fn from_tuple(
tuple: (*mut Atom, *mut Conformer, *mut Residue, *mut Chain),
) -> AtomConformerResidueChainMut<'a> {
AtomConformerResidueChainMut {
atom: tuple.0,
conformer: tuple.1,
residue: tuple.2,
chain: tuple.3,
phantom: PhantomData,
}
}
pub(crate) const fn extend(self, model: *mut Model) -> AtomConformerResidueChainModelMut<'a> {
AtomConformerResidueChainModelMut {
atom: self.atom,
conformer: self.conformer,
residue: self.residue,
chain: self.chain,
model,
phantom: PhantomData,
}
}
pub fn without_mut(self) -> AtomConformerResidueChain<'a> {
unsafe {
AtomConformerResidueChain {
atom: self.atom.as_ref().unwrap(),
conformer: self.conformer.as_ref().unwrap(),
residue: self.residue.as_ref().unwrap(),
chain: self.chain.as_ref().unwrap(),
}
}
}
}
impl<'a> ContainsAtomConformer for AtomConformerResidueChainMut<'a> {
fn atom(&self) -> &Atom {
unsafe { self.atom.as_ref().unwrap() }
}
fn conformer(&self) -> &Conformer {
unsafe { self.conformer.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerMut for AtomConformerResidueChainMut<'a> {
fn atom_mut(&mut self) -> &mut Atom {
unsafe { self.atom.as_mut().unwrap() }
}
fn conformer_mut(&mut self) -> &mut Conformer {
unsafe { self.conformer.as_mut().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidue for AtomConformerResidueChainMut<'a> {
fn residue(&self) -> &Residue {
unsafe { self.residue.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueMut for AtomConformerResidueChainMut<'a> {
fn residue_mut(&mut self) -> &mut Residue {
unsafe { self.residue.as_mut().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueChain for AtomConformerResidueChainMut<'a> {
fn chain(&self) -> &Chain {
unsafe { self.chain.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueChainMut for AtomConformerResidueChainMut<'a> {
fn chain_mut(&mut self) -> &mut Chain {
unsafe { self.chain.as_mut().unwrap() }
}
}
impl<'a> AtomConformerResidueChainModelMut<'a> {
pub(crate) const fn new(
atom: *mut Atom,
conformer: *mut Conformer,
residue: *mut Residue,
chain: *mut Chain,
model: *mut Model,
) -> AtomConformerResidueChainModelMut<'a> {
AtomConformerResidueChainModelMut {
atom,
conformer,
residue,
chain,
model,
phantom: PhantomData,
}
}
pub(crate) const fn from_tuple(
tuple: (
*mut Atom,
*mut Conformer,
*mut Residue,
*mut Chain,
*mut Model,
),
) -> AtomConformerResidueChainModelMut<'a> {
AtomConformerResidueChainModelMut {
atom: tuple.0,
conformer: tuple.1,
residue: tuple.2,
chain: tuple.3,
model: tuple.4,
phantom: PhantomData,
}
}
pub fn without_mut(self) -> AtomConformerResidueChainModel<'a> {
unsafe {
AtomConformerResidueChainModel {
atom: self.atom.as_ref().unwrap(),
conformer: self.conformer.as_ref().unwrap(),
residue: self.residue.as_ref().unwrap(),
chain: self.chain.as_ref().unwrap(),
model: self.model.as_ref().unwrap(),
}
}
}
}
impl<'a> ContainsAtomConformer for AtomConformerResidueChainModelMut<'a> {
fn atom(&self) -> &Atom {
unsafe { self.atom.as_ref().unwrap() }
}
fn conformer(&self) -> &Conformer {
unsafe { self.conformer.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerMut for AtomConformerResidueChainModelMut<'a> {
fn atom_mut(&mut self) -> &mut Atom {
unsafe { self.atom.as_mut().unwrap() }
}
fn conformer_mut(&mut self) -> &mut Conformer {
unsafe { self.conformer.as_mut().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidue for AtomConformerResidueChainModelMut<'a> {
fn residue(&self) -> &Residue {
unsafe { self.residue.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueMut for AtomConformerResidueChainModelMut<'a> {
fn residue_mut(&mut self) -> &mut Residue {
unsafe { self.residue.as_mut().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueChain for AtomConformerResidueChainModelMut<'a> {
fn chain(&self) -> &Chain {
unsafe { self.chain.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueChainMut for AtomConformerResidueChainModelMut<'a> {
fn chain_mut(&mut self) -> &mut Chain {
unsafe { self.chain.as_mut().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueChainModel for AtomConformerResidueChainModelMut<'a> {
fn model(&self) -> &Model {
unsafe { self.model.as_ref().unwrap() }
}
}
impl<'a> ContainsAtomConformerResidueChainModelMut for AtomConformerResidueChainModelMut<'a> {
fn model_mut(&mut self) -> &mut Model {
unsafe { self.model.as_mut().unwrap() }
}
}