monomer.hpp

Go to the documentation of this file.
00001 // -*- mode: c++; indent-tabs-mode: nil; -*-
00002 //
00003 //The Biomolecule Toolkit (BTK) is a C++ library for use in the
00004 //modeling, analysis, and design of biological macromolecules.
00005 //Copyright (C) 2003-2006, Tim Robertson <kid50@users.sourceforge.net>,
00006 //                         Chris Saunders <ctsa@users.sourceforge.net>
00007 //
00008 //This program is free software; you can redistribute it and/or modify
00009 //it under the terms of the GNU Lesser General Public License as published
00010 //by the Free Software Foundation; either version 2.1 of the License, or (at
00011 //your option) any later version.
00012 //
00013 //This program is distributed in the hope that it will be useful,  but
00014 //WITHOUT ANY WARRANTY; without even the implied warranty of
00015 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016 //Lesser General Public License for more details.
00017 //
00018 //You should have received a copy of the GNU Lesser General Public License
00019 //along with this program; if not, write to the Free Software Foundation,
00020 //Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00021 
00025 
00026 #ifndef BTK_MOLECULES_MONOMER_HPP
00027 #define BTK_MOLECULES_MONOMER_HPP
00028 
00029 #include <boost/operators.hpp>
00030 
00031 #include <btk/core/molecules/atomic_structure.hpp>
00032 
00033 namespace BTK {
00034 namespace MOLECULES {
00035 
00036 template <typename AtomType,
00037           typename ChemicalTypeSystemType =
00038             typename AtomType::chemical_type_system,
00039           typename DictionaryType =
00040             typename ChemicalTypeSystemType::monomer_dictionary,
00041           typename StorageStrategy = std::vector<AtomType> >
00042 class Monomer : 
00043     public AtomicStructure<AtomType,
00044                            ChemicalTypeSystemType,
00045                            DictionaryType,
00046                            StorageStrategy>,
00047     public boost::less_than_comparable<Monomer<AtomType,
00048                                                ChemicalTypeSystemType,
00049                                                DictionaryType,
00050                                                StorageStrategy> >
00051 {
00052   typedef AtomicStructure<AtomType,
00053                           ChemicalTypeSystemType,
00054                           DictionaryType,
00055                           StorageStrategy> base_type;
00056   typedef Monomer<AtomType,
00057                   ChemicalTypeSystemType,
00058                   DictionaryType,
00059                   StorageStrategy> self_type;
00060 public:
00061   IMPORT_ATOMIC_STRUCTURE_TYPES(base_type);
00062   typedef id_type monomer_id_type;
00063 
00064   Monomer(unsigned n = 0,
00065           atom_type const & a = atom_type(),
00066           id_type type = id_type(),
00067           int number = 0) : 
00068     base_type(n,a,type), _number(number), _selected(false) {}
00069   
00070   template <typename AtomIterator>
00071   Monomer(AtomIterator i, AtomIterator j,
00072           monomer_id_type type,
00073           int number) : 
00074     base_type(i,j,type), _number(number), _selected(false) {}
00075 
00076   Monomer(self_type const & source) : 
00077     base_type(source), _number(source._number), _selected(false) {}
00078 
00079   virtual ~Monomer() {}
00080 
00081   //
00082   // Methods required for the BTKContainer concept.
00083   //
00084   IMPORT_BTK_CONTAINER_METHODS(base_type);
00085 
00086   //
00087   // Methods required for the Monomer concept.
00088   //
00089   atom_iterator monomer_begin() { return base_type::structure_begin(); }
00090   const_atom_iterator monomer_begin() const 
00091   { 
00092     return base_type::structure_begin();
00093   }
00094 
00095   atom_iterator monomer_end() { return base_type::structure_end(); }
00096   const_atom_iterator monomer_end() const 
00097   { 
00098     return base_type::structure_end();
00099   }
00100 
00101   reverse_atom_iterator monomer_rbegin() { return base_type::structure_rbegin(); }
00102   const_reverse_atom_iterator monomer_rbegin() const 
00103   { 
00104     return base_type::structure_rbegin();
00105   }
00106 
00107   reverse_atom_iterator monomer_rend() { return base_type::structure_rend(); }
00108   const_reverse_atom_iterator monomer_rend() const 
00109   { 
00110     return base_type::structure_rend();
00111   }
00112 
00113   int number() const { return _number; }
00114   void set_number(int number) { _number = number; }
00115 
00116   bool selected() const { return _selected; }
00117   void select(bool s = true) const 
00118   { 
00119     _selected = s; 
00120     const_atom_iterator end = base_type::structure_end();
00121 
00122     for (const_atom_iterator i = base_type::structure_begin(); i != end; ++i)
00123       i->select(s);
00124   }
00125 
00126   virtual dictionary const & get_dictionary() const 
00127   {
00128     return base_type::get_chemical_type_system().get_monomer_dictionary();
00129   }
00130 
00131   virtual dictionary & get_dictionary() 
00132   {
00133     return base_type::get_chemical_type_system().get_monomer_dictionary();
00134   }
00135 
00136   void swap(self_type & b)
00137   {
00138     base_type::swap(b);
00139     std::swap(_number,b._number);
00140     std::swap(_selected,b._selected);
00141   }
00142 
00143   self_type const & operator=(self_type const & rhs)
00144   {
00145     if (this == &rhs) return *this;
00146     base_type::operator=(rhs);
00147     _number = rhs._number;
00148     _selected = rhs._selected;
00149     return *this;
00150   }
00151 
00152   bool operator==(self_type const & rhs) const 
00153   {
00154     return (_number == rhs._number &&
00155             base_type::operator==(rhs));
00156   }
00157 
00158   bool operator!=(self_type const & rhs) const
00159   {
00160     return !(operator==(rhs));
00161   }
00162 
00163   bool operator<(self_type const & rhs) const
00164   {
00165     return (_number < rhs._number || 
00166             (_number == rhs._number && base_type::operator<(rhs)));
00167   }
00168 
00169 private:
00170   int _number;
00171   mutable bool _selected;
00172 };
00173 
00174 #define IMPORT_MONOMER_TYPES(MonomerType)                          \
00175   IMPORT_ATOMIC_STRUCTURE_TYPES(MonomerType)                       \
00176   typedef typename MonomerType::monomer_id_type monomer_id_type;
00177 
00178 } // namespace MOLECULES
00179 } // namespace BTK
00180 
00181 #endif //BTK_MOLECULES_MONOMER_HPP

Generated on Sun Jul 15 20:46:26 2007 for BTK Core by  doxygen 1.5.1