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

BALL_INLINE 
PDBFile& PDBFile::operator >> (Protein& protein)
{
  read(protein);
  
  return *this;
}

BALL_INLINE 
PDBFile& PDBFile::operator >> (Molecule& molecule)
{
  read(molecule);
  
  return *this;
}

BALL_INLINE 
PDBFile& PDBFile::operator >> (System& system)
{
  read(system);
  
  return *this;
}

BALL_INLINE 
bool PDBFile::write(const Molecule& molecule)
{
	if (!isOpen() || getOpenMode() != std::ios::out)
	{
		throw (File::CannotWrite(__FILE__, __LINE__, name_));
	}
  write_(molecule);

	return true;
}

BALL_INLINE 
bool PDBFile::write(const Protein& protein)
{
	if (!isOpen() || getOpenMode() != std::ios::out)
	{
		throw (File::CannotWrite(__FILE__, __LINE__, name_));
	}
  write_(protein);

	return true;
}

BALL_INLINE 
PDBFile& PDBFile::operator << (const Molecule& molecule)
{
  write(molecule);
  
  return *this;
}

BALL_INLINE 
PDBFile& PDBFile::operator << (const Protein& protein)
{
  write(protein);
  
  return *this;
}

BALL_INLINE 
PDBFile& PDBFile::operator << (const System& system)
{
  write(system);
  
  return *this;
}

BALL_INLINE 
void PDBFile::clear(int state)
{
  std::fstream::clear((std::ios::iostate)state);
}
  
BALL_INLINE 
float PDBFile::getVersion() const
{
  return (float)2.1;
}

BALL_INLINE 
void PDBFile::selectModel(Index index)
{
	options.setInteger(Option::CHOOSE_MODEL, index);
	selected_model_ = index;
}

BALL_INLINE
void PDBFile::selectAltLocationIndicator(char c)
{
	if (!isalpha(c)) {
		throw Exception::InvalidArgument(__FILE__, __LINE__,
		        String("The specified alternate location indicator '") + c + "' is invalid.");
	}

	alternate_location_indicator_ = c;
}

BALL_INLINE 
void PDBFile::selectAllModels()
{
	options.setInteger(Option::CHOOSE_MODEL, -1);
  selected_model_ = -1;
}

BALL_INLINE 
Index PDBFile::getSelectedModel() const
{
  return selected_model_;
}

BALL_INLINE 
Index PDBFile::getCurrentModel() const
{
  return current_model_;
}

BALL_INLINE 
char* PDBFile::getRecordString()
{
  return line_buffer_;
}
  
BALL_INLINE 
const char* PDBFile::getRecordString() const
{
  return line_buffer_;
}

BALL_INLINE 
Index PDBFile::getRecordNumber() const
{
  return current_record_;
}

BALL_INLINE 
PDB::RecordType PDBFile::getRecordType() const
{
  return current_record_type_;
}

BALL_INLINE 
const char* PDBFile::getAtomName(const PDB::Atom atom_name)
{
	static String s;
	s.set(atom_name);
	s.trim();

  return s.c_str();
}
  
BALL_INLINE 
char PDBFile::getAtomRemotenessIndicator(const PDB::Atom atom_name)
{
  return atom_name[2];
}
  
BALL_INLINE 
short PDBFile::getAtomBranchDesignator(const PDB::Atom atom_name)
{
  return (short)atom_name[3];
}

BALL_INLINE 
Size PDBFile::countRecordFields() const
{
  return record_fields_;
}
