00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "CeylanVersion.h"
00028
00029 #include "CeylanOperators.h"
00030 #include "CeylanStringUtils.h"
00031
00032 #include <list>
00033
00034
00035
00036
00037 using std::string ;
00038
00039 using namespace Ceylan ;
00040
00041
00042
00043 VersionException::VersionException( const std::string & message ):
00044 Ceylan::Exception( message )
00045 {
00046
00047 }
00048
00049
00050 VersionException::~VersionException() throw()
00051 {
00052
00053 }
00054
00055
00056
00057
00058 Version::Version( VersionNumber major, VersionNumber minor,
00059 VersionNumber release ):
00060 _major( major ),
00061 _minor( minor ),
00062 _release( release )
00063 {
00064
00065 }
00066
00067
00068
00069 Version::Version( const std::string & versionText )
00070 {
00071
00072 std::list<string> numbers = Ceylan::split( versionText, '.' ) ;
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 if ( numbers.size() != 3 )
00083 throw Ceylan::Exception( "Version constructor: input string '"
00084 + versionText
00085 + "' cannot be split into three parts thanks to dots, "
00086 "we have " + Ceylan::toString(
00087 static_cast<Ceylan::Uint32>( numbers.size() ) )
00088 + " elements: "
00089 + Ceylan::formatStringList( numbers,
00090 true ) ) ;
00091
00092 try
00093 {
00094
00095 _major = static_cast<VersionNumber>(
00096 Ceylan::stringToUnsignedLong( numbers.front() ) ) ;
00097 numbers.pop_front() ;
00098
00099 _minor = static_cast<VersionNumber>(
00100 Ceylan::stringToUnsignedLong( numbers.front() ) ) ;
00101 numbers.pop_front() ;
00102
00103 _release = static_cast<VersionNumber>(
00104 Ceylan::stringToUnsignedLong( numbers.front() ) ) ;
00105 numbers.pop_front() ;
00106
00107 }
00108 catch( const Ceylan::Exception & e )
00109 {
00110 throw VersionException( "Version constructor: input string <"
00111 + versionText + "> could not be parsed into numbers: "
00112 + e.toString() ) ;
00113 }
00114
00115 if ( ! numbers.empty() )
00116 throw VersionException( "Version constructor: input string <"
00117 + versionText + "> has more than three elements" ) ;
00118
00119
00120 }
00121
00122
00123
00124 Version::~Version() throw()
00125 {
00126
00127 }
00128
00129
00130
00131 Version::VersionNumber Version::getMajorNumber() const
00132 {
00133 return _major ;
00134 }
00135
00136
00137
00138 void Version::setMajorNumber( VersionNumber newNumber )
00139 {
00140 _major = newNumber ;
00141 }
00142
00143
00144
00145 Version::VersionNumber Version::getMinorNumber() const
00146 {
00147 return _minor ;
00148 }
00149
00150
00151
00152 void Version::setMinorNumber( VersionNumber newNumber )
00153 {
00154 _minor = newNumber ;
00155 }
00156
00157
00158
00159 Version::VersionNumber Version::getReleaseNumber() const
00160 {
00161 return _release ;
00162 }
00163
00164
00165
00166 void Version::setReleaseNumber( VersionNumber newNumber )
00167 {
00168 _release = newNumber ;
00169 }
00170
00171
00172
00173 bool Version::isCompatibleWith( const Version & expectedVersion ) const
00174 {
00175
00176 return ( *this == expectedVersion ) ;
00177
00178 }
00179
00180
00181
00182 bool Version::canBeComparedWith( const Version & version ) const
00183 {
00184 return ( version.isUsualVersionSchemeCompliant() ) ;
00185 }
00186
00187
00188
00189 const string Version::toString( VerbosityLevels level ) const
00190 {
00191
00192 string rawVersion = Ceylan::toNumericalString( _major ) + "."
00193 + Ceylan::toNumericalString( _minor ) + "."
00194 + Ceylan::toNumericalString( _release ) ;
00195
00196 if ( level == Ceylan::low )
00197 return rawVersion ;
00198
00199 if ( level == Ceylan::medium )
00200 return "Version " + rawVersion ;
00201
00202 return "Version: major number = "
00203 + Ceylan::toNumericalString( _major ) + ", minor number = "
00204 + Ceylan::toNumericalString( _minor ) + ", release number = "
00205 + Ceylan::toNumericalString( _release ) ;
00206
00207 }
00208
00209
00210
00211 bool Version::isUsualVersionSchemeCompliant() const
00212 {
00213 return true ;
00214 }
00215
00216
00217
00218 bool operator < ( const Ceylan::Version & vFirst,
00219 const Ceylan::Version & vSecond )
00220 {
00221
00222 if ( ! vFirst.canBeComparedWith( vSecond ) )
00223 throw VersionException( "Version operator '<': "
00224 + vFirst.toString( Ceylan::high ) + " and "
00225 + vSecond.toString( Ceylan::high ) + " cannot be compared." ) ;
00226
00227 if ( vFirst.getMajorNumber() < vSecond.getMajorNumber() )
00228 return true ;
00229
00230 if ( vFirst.getMajorNumber() == vSecond.getMajorNumber() )
00231 {
00232 if ( vFirst.getMinorNumber() < vSecond.getMinorNumber() )
00233 return true ;
00234
00235 if ( vFirst.getMinorNumber() == vSecond.getMinorNumber() )
00236 {
00237 if ( vFirst.getReleaseNumber() < vSecond.getReleaseNumber() )
00238 return true ;
00239 }
00240
00241 }
00242
00243 return false ;
00244
00245 }
00246
00247
00248
00249 bool operator == ( const Ceylan::Version & vFirst,
00250 const Ceylan::Version & vSecond )
00251 {
00252
00253
00254 if ( ! vFirst.canBeComparedWith( vSecond ) )
00255 throw VersionException( "Version operator '==': "
00256 + vFirst.toString( Ceylan::high ) + " and "
00257 + vSecond.toString( Ceylan::high ) + " cannot be compared." ) ;
00258
00259 if ( vFirst.getMajorNumber() != vSecond.getMajorNumber() )
00260 return false ;
00261
00262 if ( vFirst.getMinorNumber() != vSecond.getMinorNumber() )
00263 return false ;
00264
00265 if ( vFirst.getReleaseNumber() != vSecond.getReleaseNumber() )
00266 return false ;
00267
00268 return true ;
00269
00270 }
00271