// -*- Mode: C++; tab-width: 2; -*-
// vi: set ts=2:
//

BALL_INLINE
void Atom::setElement(const Element& element)
{
	element_ = &element;
}

BALL_INLINE
const Element& Atom::getElement() const
{
	return *element_;
}

BALL_INLINE
void Atom::setCharge(float charge)
{
	charge_ = charge;
}

BALL_INLINE
float Atom::getCharge() const
{
	return charge_;
}

BALL_INLINE
void Atom::setFormalCharge(Index charge)
{
	formal_charge_ = charge;
}

BALL_INLINE
Index Atom::getFormalCharge() const
{
	return formal_charge_;
}

BALL_INLINE
const String& Atom::getName() const
{
	return name_;
}

BALL_INLINE
const Molecule* Atom::getMolecule() const
{
	return const_cast<Atom&>(*this).getMolecule();
}

BALL_INLINE
const Fragment* Atom::getFragment() const
{
	return const_cast<Atom&>(*this).getFragment();
}

BALL_INLINE
const Residue* Atom::getResidue() const
{
	return const_cast<Atom&>(*this).getResidue();
}

BALL_INLINE
const Chain* Atom::getChain() const
{
	return const_cast<Atom&>(*this).getChain();
}

BALL_INLINE
const SecondaryStructure* Atom::getSecondaryStructure() const
{
	return const_cast<Atom&>(*this).getSecondaryStructure();
}

BALL_INLINE
void Atom::setName(const String& name)
{
	name_ = name;
}

BALL_INLINE
void Atom::setPosition(const Vector3& position)
{
	position_.set(position);
}

BALL_INLINE
Vector3& Atom::getPosition()
{
	return position_;
}

BALL_INLINE
const Vector3& Atom::getPosition() const
{
	return position_;
}

BALL_INLINE
void Atom::setRadius(float radius)
{
	radius_ = radius;
}

BALL_INLINE
float Atom::getRadius() const
{
	return radius_;
}

BALL_INLINE
void Atom::setType(Type type)
{
	type_ = type;
}

BALL_INLINE
Atom::Type Atom::getType() const
{
	return type_;
}

BALL_INLINE
void Atom::setTypeName(const String& type_name)
{
	type_name_ = type_name;
}

BALL_INLINE
String Atom::getTypeName() const
{
	return type_name_;
}

BALL_INLINE
void Atom::setVelocity(const Vector3& velocity)
{
	velocity_.set(velocity);
}

BALL_INLINE
Vector3& Atom::getVelocity()
{
	return velocity_;
}

BALL_INLINE
const Vector3& Atom::getVelocity() const
{
	return velocity_;
}

BALL_INLINE
void Atom::setForce(const Vector3& force)
{
	force_.set(force);
}

BALL_INLINE
Vector3& Atom::getForce()
{
	return force_;
}

BALL_INLINE
const Vector3& Atom::getForce() const
{
	return force_;
}

BALL_INLINE
void Atom::get(Atom& atom, bool deep) const
{
	atom.set(*this, deep);
}

BALL_INLINE
bool Atom::operator == (const Atom& atom) const
{
	return(Object::operator ==(atom));
}

BALL_INLINE
bool Atom::operator != (const Atom& atom) const
{
	return ! (*this == atom);
}

BALL_INLINE
Size Atom::countBonds() const
{
	return number_of_bonds_;
}

BALL_INLINE
bool Atom::isBound() const
{
	return (number_of_bonds_ > 0);
}

BALL_INLINE
float Atom::getDistance(const Atom& a) const
{
	return getPosition().getDistance(a.getPosition());
}

