00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_RESIDUE_PROP_HH
00020 #define OST_RESIDUE_PROP_HH
00021
00022 #include <vector>
00023 #include <boost/operators.hpp>
00024
00025 #include <ost/mol/module_config.hh>
00026
00027 namespace ost { namespace mol {
00028
00029
00030 class DLLEXPORT ResNum: private
00031 boost::additive<ResNum, int,
00032 boost::additive<ResNum,
00033 boost::totally_ordered<ResNum,
00034 boost::totally_ordered<ResNum, int,
00035 boost::unit_steppable<ResNum> > > > >
00036 {
00037 public:
00038
00039
00040 ResNum():
00041 num_(1),alt_('\0')
00042 {}
00043
00044 ResNum(int n):
00045 num_(n), alt_('\0')
00046 { }
00047
00048 ResNum(int n, char a):
00049 num_(n), alt_(a)
00050 {}
00051
00052 bool operator==(const ResNum& r) const
00053 {
00054 return num_==r.num_ && alt_==r.alt_;
00055 }
00056
00057 bool operator<(const ResNum& r) const
00058 {
00059 return num_==r.num_ ? alt_<r.alt_ : num_<r.num_;
00060 }
00061
00062 int operator+=(int i)
00063 {
00064 num_+=i;
00065 return num_;
00066 }
00067
00068 int operator-=(int i)
00069 {
00070 num_-=i;
00071 return num_;
00072 }
00073
00074 int operator+=(const ResNum& r)
00075 {
00076 num_+=r.num_;
00077 return num_;
00078 }
00079
00080 int operator-=(const ResNum& r)
00081 {
00082 num_-=r.num_;
00083 return num_;
00084 }
00085
00086 ResNum& operator++()
00087 {
00088 ++num_;
00089 return *this;
00090 }
00091
00092 ResNum& operator--()
00093 {
00094 --num_;
00095 return *this;
00096 }
00097
00098 ResNum NextInsertionCode() const
00099 {
00100 char alt= alt_=='\0' ? 'a' : alt_+1;
00101 ResNum nrvo(num_,alt);
00102 return nrvo;
00103 }
00104
00110 inline String AsString() const;
00111
00112 int GetNum() const { return num_; }
00113
00114 void SetNum(int num) { num_=num; }
00115
00116 void SetInsCode(char ins_code) { alt_=ins_code; }
00117
00118 char GetInsCode() const { return alt_; }
00119
00120 private:
00121 int num_ : 24;
00122 int alt_ : 8;
00123 };
00124
00125 typedef String ResidueKey;
00126 typedef std::vector<ResNum> ResNumList;
00127
00128 inline std::ostream& operator<<(std::ostream& os, const ResNum& n)
00129 {
00130 return os << n.GetNum();
00131 if (n.GetInsCode()!='\0')
00132 os << n.GetInsCode();
00133 return os;
00134 }
00135
00136 inline String ResNum::AsString() const
00137 {
00138 std::stringstream ss;
00139 ss << *this;
00140 return ss.str();
00141 }
00142
00143 }}
00144
00145
00146 #endif