00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef _gnCompare_h_
00013 #define _gnCompare_h_
00014
00015 #include "gn/gnDefs.h"
00016
00017 #include <string>
00018 #include <cctype>
00019 #include "gn/gnClone.h"
00020
00021 class GNDLLEXPORT gnCompare : public gnClone
00022 {
00023 public:
00024
00025
00026
00027
00028
00029 static const gnCompare *ProteinSeqCompare();
00030
00031
00032
00033
00034
00035 static const gnCompare *DNASeqCompare();
00036
00037
00038
00039
00040
00041 static const gnCompare *RNASeqCompare();
00042
00043 enum gnCompareType{
00044 ProteinSeqCompareType,
00045 DNASeqCompareType,
00046 RNASeqCompareType,
00047 };
00048
00049 gnCompare();
00050
00051
00052
00053
00054
00055
00056
00057
00058 gnCompare( const gnCompareType c_type );
00059 gnCompare( const gnCompare& sf );
00060 ~gnCompare();
00061
00062 gnCompare* Clone() const;
00063
00064 string GetName() const;
00065 void SetName( string name );
00066
00067
00068
00069 boolean LessThan( gnSeqC ch, gnSeqC ch2, boolean case_sensitive = false) const;
00070
00071
00072
00073 boolean Contains( gnSeqC ch, gnSeqC ch2, boolean case_sensitive = false ) const;
00074
00075
00076 boolean LessThan( const gnSeqC* seq, const gnSeqC* seq2, const uint32 len, boolean case_sensitive = false ) const;
00077 boolean Contains( const gnSeqC* seq, const gnSeqC* seq2, const uint32 len, boolean case_sensitive = false ) const;
00078
00079 boolean LessThan( const string &seq, const string &seq2, boolean case_sensitive = false) const;
00080 boolean Contains( const string &seq, const string &seq2, boolean case_sensitive = false) const;
00081
00082
00083
00084
00085 void SetSingle( const gnSeqC ch );
00086
00087 void SetPair( const gnSeqC ch, const gnSeqC ch2 );
00088
00089 void SetContained( const gnSeqC ch, const gnSeqC ch2 );
00090
00091 void RemoveSingle( const gnSeqC ch );
00092 void RemovePair( const gnSeqC ch, const gnSeqC ch2 );
00093 void RemoveContained( const gnSeqC ch, const gnSeqC ch2 );
00094
00095 private:
00096 void CreateProteinComparator();
00097 void CreateDNAComparator();
00098 void CreateRNAComparator();
00099
00100 void AddArrayEntry( gnSeqC *array[GNSEQC_MAX], const gnSeqC ch, const gnSeqC ch2);
00101 void DelArrayEntry( gnSeqC *array[GNSEQC_MAX], const gnSeqC ch, const gnSeqC ch2);
00102
00103 string m_name;
00104 boolean m_ignoreCase;
00105
00106 gnSeqC* m_pairArray[GNSEQC_MAX];
00107 gnSeqC* m_containArray[GNSEQC_MAX];
00108
00109 };
00110
00111 inline
00112 gnCompare* gnCompare::Clone() const{
00113 return new gnCompare(*this);
00114 }
00115
00116 inline
00117 string gnCompare::GetName() const{
00118 return m_name;
00119 }
00120 inline
00121 void gnCompare::SetName( string name ){
00122 m_name = name;
00123 }
00124
00125
00126 inline
00127 boolean gnCompare::LessThan( gnSeqC ch, gnSeqC ch2, boolean case_sensitive) const
00128 {
00129 if(!case_sensitive){
00130 ch = toupper(ch);
00131 ch2 = toupper(ch2);
00132 }
00133
00134 if(strchr(m_pairArray[ch], ch2) == 0)
00135 return ch < ch2 ? true : false;
00136 return false;
00137 }
00138
00139
00140
00141 inline
00142 boolean gnCompare::LessThan( const gnSeqC* seq, const gnSeqC* seq2, const uint32 len, boolean case_sensitive ) const{
00143 for( uint32 i=0; i < len ; ++i )
00144 if(LessThan(seq[i], seq2[i], case_sensitive))
00145 return true;
00146 return false;
00147 }
00148
00149
00150 inline
00151 boolean gnCompare::LessThan( const string &seq, const string &seq2, boolean case_sensitive) const
00152 {
00153 gnSeqI shorter_len = seq.length() < seq2.length() ? seq.length() : seq2.length();
00154 return LessThan( (gnSeqC*)seq.data(), (gnSeqC*)seq2.data(), shorter_len, case_sensitive );
00155 }
00156
00157
00158 inline
00159 void gnCompare::SetSingle( const gnSeqC ch ){
00160 AddArrayEntry(m_pairArray, ch, ch);
00161 AddArrayEntry(m_containArray, ch, ch);
00162 }
00163 inline
00164 void gnCompare::SetPair( const gnSeqC ch, const gnSeqC ch2 ){
00165 AddArrayEntry(m_pairArray, ch, ch2);
00166 AddArrayEntry(m_pairArray, ch2, ch);
00167 }
00168 inline
00169 void gnCompare::SetContained( const gnSeqC ch, const gnSeqC ch2 ){
00170 AddArrayEntry(m_containArray, ch2, ch);
00171 }
00172
00173 inline
00174 void gnCompare::RemoveSingle( const gnSeqC ch )
00175 {
00176 DelArrayEntry(m_pairArray, ch, ch);
00177 DelArrayEntry(m_containArray, ch, ch);
00178 }
00179 inline
00180 void gnCompare::RemovePair( const gnSeqC ch, const gnSeqC ch2 )
00181 {
00182 DelArrayEntry(m_pairArray, ch, ch2);
00183 DelArrayEntry(m_pairArray, ch2, ch);
00184 }
00185 inline
00186 void gnCompare::RemoveContained( const gnSeqC ch, const gnSeqC ch2 )
00187 {
00188 DelArrayEntry(m_containArray, ch2, ch);
00189 }
00190
00191 #endif
00192